This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28379D:通过 sci 发送 ADC 结果时出现问题

Guru**** 2611705 points
Other Parts Discussed in Thread: CONTROLSUITE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/687025/tms320f28379d-problem-with-transmitting-the-adc-result-via-the-sci

器件型号:TMS320F28379D
Thread 中讨论的其他器件:controlSUITE

您好!

与我之前关于通过 SCI 将 ADC 结果传输到超级终端的问题相关、我设法正确地传输了该结果。 现在、我要将 AdcResult 保存到文本文件、以便稍后用于进一步处理。  到目前为止、我已将"adc_soc_ePWM_cpu01.c"示例添加到了以下内容:  

1-我将文件全局定义为(文件*myfile)。

2-在下面的 Adca1_ISR 中,我创建了打开和关闭文件的条件。

3-我尝试使用 fprintf 函数将一个简单的计数器保存到文件中、这导致.text 的对焦 RAM 是不够的。 因此、我尝试按如下方式更改.text ram alocation:  

//.text:>RAMM0 | RAMD0| RAMLS0,page = 0                        //我以前将其与此进行了切记,以便 sprintf 正常工作,并且工作正常。
 .text :>RAMGS12 | RAMGS13| RAMGS14| RAMGS15,PAGE = 1         //我将上述行添加到此行,以便 fprintf 正常工作。

但是、当我进行此更改时、下面显示的误差不再存在。  但是、当我调试并运行项目时、adcResults 缓冲区没有接收到转换结果。  

"C:/ti/controlSUITE/device_support/F2837xD/v210/F2837xD_common/cmd/2837xD_RAM_lnk_cpu1.cmd、第54行:错误#10099-D: 程序将无法放入可用内存中。 放置方式
".text"大小为0x2b3f PAGE 0的对齐/分块失败。 可用 存储器范围:
RAMM0大小:0x2DE 未使用:0x1最大空洞:0x1
RAMD0大小:0x800未使用:0x0最大孔:0x0
RAMLS0大小:0x2000未使用:0x1最大孔:0x1  
错误#10010:链接期间遇到错误;未 构建"ADC_SoC_ePWM_cpu01.out"。  

在开机自检结束时查看我的 RAM 文件。

--------------------------------------------------------------------


//
// adca1_ISR -在 ISR 中读取 ADC 缓冲器
//
中断 void adca1_ISR (void)

AdcaResults[resultsIndex++]=AdcaResultRegs.ADCRESULT0;
 
if (results_buffer_size = resultsIndex)

对于(z=0;z <RESULTS_BUFFER_SIZE;z++)

Vin =结果[z];
SEND_RESULT (Vin);


int 计数器= 0;
如果(计数器< 9){
myfile = fopen ("AdcaResults.txt"、"w");
fprintf (myfile、"%d\n"、计数器);
//printf (filePtr、"%d、"、AdcResults);
COUNTER++;

否则、如果(counter =9){
fclose (myfile);


if (results_buffer_size <= resultsIndex)

resultsIndex = 0;
bufferFull = 1;

AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

--------------------------------------------------------------------


存储器

第0页:
/* begin 用于"引导至 SARAM"引导加载程序模式*/

开始:origin = 0x000000,length = 0x000002
RAMM0:origin = 0x000122、length = 0x0002DE // length = 0x0002DE
RAMD0:origin = 0x00B000、length = 0x000800
RAMLS0:origin = 0x008000、length = 0x002000 //这是0x000800
// RAMLS1:origin = 0x008800,length = 0x000800 //之前为0x000800
// RAMLS2:origin = 0x009000,length = 0x000800 // was 0x000800
// RAMLS3:origin = 0x009800,length = 0x000800 // was 0x000800
// RAMLS4:origin = 0x00A000,length = 0x000800 //之前为0x000800
复位:origin = 0x3FFFC0,length = 0x000002

第1页:

BOOT_RSVD:origin = 0x000002,length = 0x000120 // M0的一部分,引导 ROM 将此用于栈*/
RAMM1:origin = 0x000400、length = 0x000400 //片上 RAM 块 M1 *
RAMD1:origin = 0x00B800,length = 0x000800

RAMLS5:origin = 0x00A800,length = 0x000800

RAMGS0:origin = 0x00C000、length = 0x001000
RAMGS1:origin = 0x00D000、length = 0x001000
RAMGS2:origin = 0x00E000、length = 0x001000
RAMGS3:origin = 0x00F000、length = 0x001000
RAMGS4:origin = 0x010000,length = 0x001000
RAMGS5:origin = 0x011000,length = 0x001000
RAMGS6:origin = 0x012000,length = 0x001000
RAMGS7:origin = 0x013000,length = 0x001000
RAMGS8:origin = 0x014000,length = 0x001000
RAMGS9:origin = 0x015000,length = 0x001000
RAMGS10:origin = 0x016000,length = 0x001000
RAMGS11:origin = 0x017000,length = 0x001000
RAMGS12:origin = 0x018000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 设备上可用。 移除其他设备上的线路。 *
RAMGS13:origin = 0x019000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 设备上可用。 移除其他设备上的线路。 *
RAMGS14:origin = 0x01A000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 设备上可用。 移除其他设备上的线路。 *
RAMGS15:origin = 0x01B000,length = 0x001000 //*仅在 F28379D、F28377D、F28375D 设备上可用。 移除其他设备上的线路。 *

CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400
CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400

CANA_MSG_RAM:origin = 0x049000、length = 0x000800
CANB_MSG_RAM:origin = 0x04B000、length = 0x000800


部分

codestart:> begin,page = 0
//.text:>>RAMM0 | RAMD0 | RAMLS0 | RAMLS1 | RAMLS2 | RAMLS3 | RAMLS4,page = 0
//.text:>RAMM0 | RAMD0| RAMLS0,page = 0                    //我将上述行添加到此行
.text:>>RAMGS12 | RAMGS13| RAMGS14| RAMGS15,PAGE = 1   //我将上述行添加到此行,以便 fprintf 正常工作

.cinit:> RAMM0,page = 0
.pinit:> RAMM0,page = 0
switch:>RAMM0,page = 0
.reset:> reset,page = 0,type = DSECT //未使用,*/

.cio:>RAMGS15,page = 1 //我添加了这一行,不在这里
.stack:>RAMM1,PAGE = 1.
.ebss:> RAMGS13,page = 1 // Wed RAMLS5 I 更改为打开文本文件
econst:>RAMGS14,page = 1 //之前为 RAMLS5
.esysmem:> RAMLS5,page = 1.
filter_RegsFile:> RAMGS0,PAGE = 1

RAMS0:>RAMGS0,PAGE = 1
ramgs1:>RAMGS1,page = 1.

#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>=15009000
.TI.ramfunc:{}> RAMM0,PAGE = 0
其他
ramfuncs:>RAMM0 page = 0  
#endif
#endif

/*使用 IPC API 驱动程序时需要以下部分定义*/
组:> CPU1TOCPU2RAM,PAGE = 1

PUTBUFFER
PUTWRITEIDX
GETREADIDX

组:> CPU2TOCPU1RAM,PAGE = 1

GETBUFFER:TYPE = DSECT
GETWRITEIDX:TYPE = DSECT
PUTREADIDX:TYPE = DSECT

/*以下部分定义适用于 SDFM 示例*/
filter1_RegsFile:> RAMGS1,PAGE = 1,fill=0x1111
Filter2_RegsFile:> RAMGS2,PAGE = 1,fill=0x2222
Filter3_RegsFile:> RAMGS3,PAGE = 1,fill=0x3333
Filter4_RegsFile:> RAMGS4,PAGE = 1,fill=0x4444
Differit_RegsFile:>RAMGS5,PAGE = 1,fill=0x3333

/*
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
*

此致

Hayder  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Hayder、

    .text 用于程序指令。  这些应该位于第0页。

    第1页用于数据/变量。  

    您可以将 GSRAM 或其他 RAMS 映射到任意一页、但需要确保所有内容一致(文本进入第0页 RAMS、这些 RAMS 定义为第0页)。   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、

    感谢您的回复和解释。 我将 RAMSG12从第1页移到了第0页、并将其添加到.text 位置、如下所示:

     .text       :>RAMM0 | RAMD0| RAMLS0| RAMGS12, PAGE = 0

    这消除了编译工程时的错误。

    我对前面提到的 adca1_ISR 中的条件进行了一些更改、以将 adcResult 保存到文本文件中、如所附图片所示:

    当我调试并运行项目时、创建的文本文件开始存储 adcResults、但是并非所有 adcResults 缓冲区数组 都存储在文本文件中。  文本文件仅收到45个整数、如下所示:

    3078、 3093、 3100、 18、 1、  25、 3098、 3088、 3092、 0、  6、 12、 3084、 3070、 3091、  14、 0、 0、 3086、 3074、  3086、 2、 3、 19、 3092、  3099、 3103、 23、 16、 22、  3085、 3044、 3094、 0、 3、  7、 3088、 3098、 3085、 8、  19、 20、 3107、 3081、 3.

    感谢你的答复

    此致

    Hayder

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Hayder、

    结果在存储器中是什么样的? 我可能建议您只将 ADC 结果存储在 RAM 中的数组中、并确保看上去正确。 然后、您可以在结果完成后或同时添加代码来扫描它们。 无论采用哪种方法、您都可以在调试时将 RAM 中的值与之进行比较、从而知道问题是程序流还是扫描过程。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、

    下图显示了存储器中的 ADC 结果:


    对我来说、存储器中的结果看起来不错、绘图也显示了这一点。 而下面是 已存储到文本文件中的数组:  

    226、 3329、 3324、 3329、 243、  246、 250、 3321、 3312、 3303、  236、 238、 222、 3319、 3317、  3320、 237、 256、 259、 3316、  3316、 3350、 243、 255、 237、  3312、 3312、 3277、 245、 245、  232、 3319、 3316、 3277、 242、  237、 197、 3307、 3312、 32

    任何关于解决此问题的建议。  

    此致  

    Hayder  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、

    我仍在等待您的回复。

    此致

    Hayder

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Hayder、

    我无法按照您的算法来确定要打印的结果。 它似乎过于复杂。 与器件或 SCI 模块的任何问题相比、这似乎是问题所在。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、  

    您能否查看随附文本文件中的完整算法以指出是否存在任何问题。 这是 ADC_SoC_ePWM_cpu01.c 示例、添加了一些内容、例如 sci、我不知道为什么将 ADC 结果保存到文本文件中受到限制、即使我增加了许多 times.e2e.ti.com/.../Adc_5F00_epwm_5F00_sci.txt 的.text 的 RAM 空间

    此外、如何检查器件或 sci 模块是否存在问题。
    此致  

    Hayder

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Hayder、

    您可能需要尝试将保存到文件循环移出 ADC ISR、进入后台循环。 您通常不希望 ISR 中存在如此长的代码块。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Devin、

    我将保存到文件循环移动到程序主循环、然后我将其移动到在我之前的答复中文本文件末尾将 ADC 阵列发送到超级终端的函数(void send_result (uint16 res))。
    在这两种情况下、它都没有将任何保存到文件中。 然后、我将代码简化为只打开文件并写入、也不会向文件写入任何内容。

    有一点我不太确定、"后台循环"是什么意思?

    此致
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Hayder、

    后台循环是在 main()中运行的循环,它将被 ADC ISR 中断。 您希望执行时间要求较低的任务、例如通过要扫描的值列表迭代。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Devin、  

    我在 ADC_ISR 中保留了"保存到文本"循环、但我更改了在 RAM 中为.text 分配的如下:  

    存储器

    第0页:
    /* begin 用于"引导至 SARAM"引导加载程序模式*/

    开始:origin = 0x000000,length = 0x000002
    RAMM0:origin = 0x000122、length = 0x0002DE   
    RAMD0:origin = 0x00B000、length = 0x000800
    RAMLS0:origin = 0x008000、length = 0x002000       //这是0x000800

    // RAMLS1:origin = 0x008800,length = 0x000800 //之前为0x000800
    // RAMLS2:origin = 0x009000,length = 0x000800 // was 0x000800
    // RAMLS3:origin = 0x009800,length = 0x000800 // was 0x000800
    // RAMLS4:origin = 0x00A000,length = 0x000800 //之前为0x000800


    RAMGS10:origin = 0x016000,length = 0x001000   //我将 此内容从第1页移到这里,以便将 ADC 结果打印到文本文件  
    RAMGS11:origin = 0x017000,length = 0x001000   // ////我在这里添加了这个  
    RAMGS12:origin = 0x018000,length = 0x003000   //我将其从第1页移动,这样  
    复位:origin = 0x3FFFC0,length = 0x000002

    然后在 RAM 部分、我将.text 编辑 为:

      .text       :>RAMM0 | RAMD0| RAMLS0| RAMGS10| RAMGS11| RAMGS12,  PAGE = 0

    在 RAM 中进行这些更改后、我能够将多达1024个 ADC 结果存储到打开的文本文件中。  

    我有疑问、因为我不明白它是如何工作的、因为 RAMGS12最初的长度是0x001000、我无法存储64的 ADC 阵列、 但是、当我意外地将其转换为上面的0x003000时、我能够保存1024个 ADC 结果数组。 此外、正确地将其设置为0x003000、因为其他 RAMSG 都是0x001000。  

    此致  

    Hayder   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Hayder、

    物理 RAM 仅为0x1000、但您可以通过增加长度来组合相同类型的连续 RAM。

    只需确保您注释掉也占用该空间的其他 RAM ...否则、您可以将多个变量分配到同一存储器位置。 这不是您需要调试的内容。