开发平台:CCS10, C2000Ware_4_00_00_00
使用芯片:TMS320F28035PNS
烧写到RAM和烧写到FLASH 的配置有些许不同。主要区别在于.cmd文件。
烧写到FLASH的需求是当烧写到RAM 之后,掉电之后,程序不会保存在MCU中。如果需要程度掉电后再上电时能够继续存在,就需要把程序烧写到FLASH之中去。
1)采用RAM烧写时,需要选择28035_RAM_Ink.cmd。方法如下:

图1 在project->properties 中配置28035_RAM_Ink.cmd
2)对28035_RAM_Ink.cmd 中进行修改,在28035_RAM_lnk.cmd 中找到如下文段:

图2 原文件
删去一些部分,修改成如下

图3 修改后(这里建议最好时用注释的方法进行操作)
完成上述操作之后,就可以进行烧写和调试。
1)首先要进行F28035.cmd文件的选择,选择如下:

图4 project->properties 中配置28035.cmd
2)修改F28035.cmd的内容

图5 F28035.cmd内容的修改
3)还需要在main.c中添加:
#include <string.h>
#include <stdint.h>
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadSize;
extern Uint16 RamfuncsRunStart; 同时,在main主函数的InitPieVectTable();之后添加以下代码。
memcpy((uint16_t *)&RamfuncsRunStart,(uint16_t *)&RamfuncsLoadStart,(unsigned long)&RamfuncsLoadSize);
InitFlash(); NOTE:
1) 此外,在官方手册《TMS320x2803x Piccolo Technical Reference Manual》中,提到FLASH模式的硬件引脚配置,建议GPIO37和GPIO34上拉10k电阻到3.3V,TRST引脚下拉10k电阻到GND,当然,你也可以选择用拨码开关进行切换。

图6 官方手册中提到的FLASH模式的引脚配置
2)对于老版本的CCS(有多老我就不确定,以后确定了再补充),有些教程会使用MemCopy,而不是用的memcpy。我查了一下ti论坛,找到以下帖子:
https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/849265/ccs-tms320f28035-memcopy-ramfuncsloadstart-ramfuncsloadend-ramfuncsrunstart-is-right
其中,“Do note that we don't recommend that use of MemCopy. memcpy is now recommended. “,说明了不再推荐使用MemCopy,而推荐使用memcpy。
3) InitFlash()在DSP2803x_SysCtrl.c中,所以要确保你的工程文件夹中存在该文件。
1) 该函数定义在DSP2803x_Examples.h中,函数具体文件为DSP2803x_usDelay.asm,
对于DELAY_US()延时函数,在官方DSP2803x_usDelay.asm 的配置如下:

图7 DSP2803x_usDelay.asm的内容
参考 up主小靜靜紫陌璃的文章的说法,这一步的目的就是指定把ramfuncs放在RAM中运行,这样就解决了程序在Flash中卡死和编译警告的问题。【作者:小靜靜紫陌璃 网页链接 出处:bilibili】
2)所以不用做额外的修改,可以直接使用DELAY_US()。为了验证在FLASH中是否运行良好。我采用了GPIO口电平翻转实验,每隔100us进行翻转。其中while(1)循环代码如下:
GpioDataRegs.GPBTOGGLE.bit.GPIO39 = 1 ;
DELAY_US(100);

图8 DELAY_US(100)在FLASHZ中的运行效果图
从实验结果来看,DELAY_US()函数在FLASH中的运行是相当成功的。
对于你想要在RAM中运行的函数,你可以在main.c之前添加以下代码
#pragma CODE_SECTION(XXX, "ramfuncs"); 其中,xxx就是你想要运行的代码函数名,它可以是中断服务函数等。
1. 关于RAM和FLASH运行速度的差别
来自 <https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/17797/delay_us>
首先,ramfuncs段中的内容我们都是要让它在RAM中跑的,里面包含一些flash的初始化设置函数,这些函数必须只能在RAM中运行,还有一些对时间比较敏感的函数,也是需要复制在RAM中运行的,因为RAM的速度远快于flash,我们通常讲的60MHz的执行速度,指的是去RAM的运行速度,flash一般只能跑到1/3的速度。 DELAY_US是1us的延时,它是基于RAM的速度来实现的精确的1us延时,如果把这段代码放在flash,由于flash的初始化等待状态不同,会导致flash执行速度不同,不能精确的得到1us的延时,只能是大于1us。
2. TI C2000 , .cmd文件,.TI.ramfunc,将程序分配为在RAM中运行/Flash运行的配置方法和原理讲解,(如28375S ,280049,28335等等芯片)
来自 <https://www.codeleading.com/article/79925786096/>
3. 细读DSP延时函数DSP28x_usDelay()及解决烧录至FLASH出错的方法
来自 <https://blog.csdn.net/weixin_44387442/article/details/109703582>
4. memCopy()函数的理解
来自 <https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/45022/memcopy>
InitFlash函数对Flash的访问的等待周期等进行设置,主要配置PAGEWAIT,RANDWAIT和OTPWAIT,在对这些寄存器配置之前,都是有默认值的,分别是15、15和32个sysclk,所以没有InitFlash函数并不影响访问Flash空间。谢谢!
5. tms320f28069 程序运行问题
来自 <https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/142909/tms320f28069>
跑不起了,copy在ram里程序 执行时间不对, 不是代码逻辑的问题, 搞定了,主要是 注意 copy到ram的函数 相应调用的子函数 要靠考虑效率, 小的函数用 static lnline 声明, 大的函数 也同样 段声明 CODE_SECTION(cpu_timer0_isr, "ramfuncs"); 然后运行时间就对了