Thread 中讨论的其他器件: controlSUITE、 C2000WARE
我知道 AdcConversion (void)等函数 只能从 TMS320F28035中的 RAM 中工作。 我在 TMS320F28035的文档中查找有关从 RAM 执行此类函数的信息。 我找不到任何内容。 您能否指向此类文档。
此致、
Ramesh
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.
我知道 AdcConversion (void)等函数 只能从 TMS320F28035中的 RAM 中工作。 我在 TMS320F28035的文档中查找有关从 RAM 执行此类函数的信息。 我找不到任何内容。 您能否指向此类文档。
此致、
Ramesh
从何处可以看到 AdcConversion()只能从 RAM 中工作? 通常、从 RAM 运行函数是为了提高速度或使执行周期数更具确定性而做出的决定、因为闪存可能具有等待状态、缓存、预取等...例如、 DELAY_US()的底层函数从 RAM 运行,以便每个循环的周期数最精确。 我们还从 RAM 运行 InitFlash、因为在配置闪存设置时、不应尝试从闪存执行。
当然、CLA 代码是例外的、它只能从 RAM 中执行。
一种快速找到我们建议您从 RAM 运行的 controlSUITE 中 F2803x 器件支持文件夹中的所有函数的方法是快速搜索"ramfuncs"-该目录应查找用于将函数放入 RAM 的所有#pragma CODE_SECTION 行。
惠特尼
尊敬的惠特尼
感谢您的支持。 我正在开发一个基于 TM320F28035的新项目。 我开始使用实验套件、并尝试从闪存执行 ADC 示例、但它不起作用。 我在论坛上发布了从 RAM 运行 AdcConversion()的建议(请参阅下面的链接)。 示例仅在从 RAM 运行 AdcConversion()后有效。
不确定如何在文件中搜索 ramfuncs。
此致、
Ramesh
Ramesh、
明白。 我将与 Matt 交谈、看看我们是否需要提交错误以将#pragma CODE_SECTION 添加到代码中、从而避免将来出现这种混淆。
[引用 userid="318028" URL"~/support/microcontrollers/C2000-microcontrollers-group/C2000/f/C2000-microcontrollers-forum/1122556/tms320f28035-tms320f28035/4163939#416393939"]不确定如何在文件内搜索 ramfuncs。许多代码编辑应用程序(如 Visual Studio Code 等)都有文件搜索选项。 即使 CCS 也有搜索选项(View -> Other...、Find Search)。 其外观如下所示:

惠特尼
这些地址看起来像引导 ROM 地址。 您似乎正在获得某种类型的复位、或者可能是意外中断、该中断会将您发送到引导 ROM 的默认 ISR。 您可以尝试加载 ROM 符号以查看它是什么函数。 它们位于:
\libraries\boot_rom\f2803x\v1_0\rom_sources\Release\TMS320x2803x_boot_rom_Gold_V1.out
惠特尼
我检查了.map 文件、它似乎是执行用户代码的闪存 RAM。 此特定地址位于 AdcConversion()函数内。
页地址名称
------ ----
0 00008000 _DSP28x_usDelay
0 00008000 _RamfuncsRunStart
0 003f0000 _RamfuncsLoadStart
0 003f6000 .text
0 003f6000 _InitAdc
0 003f6000 __text__
0 003f601f _InitAdcAio
0 003f6041 _AdcOffsetSelfCal
0 003f6068 _AdcChanSelect
0 003f60dd _AdcConversion
0 003f622e _INT13_ISR
我可以生成.lst 文件。 我的观察是、它停留在以下几行中
while (AdcRegs.ADCINTFlG.bit.ADCINT2 ==0)
{
}
ADCINTFLG 被读取为00。
映射文件的一部分
页地址名称
------ ----
0 00008000 _DSP28x_usDelay
0 00008000 _RamfuncsRunStart
0 003f0000 _RamfuncsLoadStart
0 003f6000 .text
0 003f6000 _InitAdc
0 003f6000 __text__
0 003f601f _InitAdcAio
0 003f6041 _AdcOffsetSelfCal
0 003f6068 _AdcChanSelect
0 003f60dd _AdcConversion
0 003f622e _INT13_ISR
0 003f6233 _INT14_ISR
0 003f6238 _datalog_isr
0 003f623d _RTOSINT_ISR
下面 DSP2803x_adc.c 的.lst 部分
800 .dwpsn 文件"C:/ti/C2000Ware_4_01_00_00/device_support/F2803x/common/source/DSP2803x_adc.c"、第333行
801 000001d4 761F! MOVW DP,#_AdcResult+7;[CPU_ARAU]
000001d5 0000
802 000001d6 0E07! MOVU ACC、@$blocked (_AdcResult)+7;[CPU_ALU]|333|
803 000001d7 0742附加 ACC,*-SP[2];[CPU_ALU]|333|
804 000001d8 1E42 MOVL *-SP[2]、ACC;[CPU_ALU]|333|
805 .dwpsn 文件"C:/ti/C2000Ware_4_01_00_00/device_support/F2803x/common/source/DSP2803x_adc.c"、第338行
806 000001d9 $C$L3:
807 .dwpsn 文件"C:/ti/C2000Ware_4_01_00_00/device_support/F2803x/common/source/DSP2803x_adc.c"、第338行
808 000001d9 761F! MOVW DP、#_AdcRegs+4;[CPU_ARAU]
000001da 0000
809 000001db 4104! TBIT @$blocked (_AdcRegs)+4、#1;[CPU_ALU]|338|
810 000001dc 6CFD B $C$L3、NTC;[CPU_ALU]|338|
811;出现 branchcc;[]|338|
812 .dwpsn 文件"C:/ti/C2000Ware_4_01_00_00/device_support/F2803x/common/source/DSP2803x_adc.c"、第343行
813 000001dd 1A05! 或@$blocked (_AdcRegs)+5、#0x0002;[CPU_ALU]|343|
此致、
Ramesh
我是指调试器反汇编窗口--在 Debug 透视图中转到 View -> Disassembly 将其打开。 不过、您的下一篇文章确实回答了我的问题。
当 ADC 中断不在连续模式中时、在 ADCINTFLG 被清零前不会再产生中断脉冲。 而是设置 ADCINTOVF 标志。 因此、我怀疑 ADCINTFLG 在下一个要置位的 EOC 事件中没有及时清零、因此它将收到 ADCINTOVF 事件、并且不会生成中断脉冲来启动下一轮转换。 尽管 ADCINTFLG 最终被清零、但它发生得太晚了。
我不确定启用连续模式是否可以解决问题、但您可以尝试一下。
惠特尼