想把一个原来是烧写到DSP的片内RAM的程序修改成是烧写到DSP片内FLASH的程序,不仅仅是修改一个cmd文件就结束了,还需要做其他几个步骤:
第一步:把28335_RAM_lnk.cmd这个从project中移除,用右键选择28335_RAM_lnk.cmd然后选delate。如下图1,然后出现对话框,点YES,如图2。
图1
图2
第二步:右键选择project名称,然后选add file to project,如下图3,然后出现浏览框,在\Code of TMS320F28335 CCS4\v120\DSP2833x_common\cmd这个子文件夹下,选择F28335.cmd,点OK,至此可以在project的文件列表内看到F28335.cmd被添加到project中。
图3
第三步:在main()函数中添加如下语句
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
上述两句话添加在InitPieVectTable();这句的下面的一行。
添加语句的时候,注意不要添加错了,每一个字母都要正确,括号也要用英文括号。
第四步:添加DSP2833x_MemCopy.c这个文件到project中,右键选择project名称,然后选add file to project,然后出现浏览框,找到\Code of TMS320F28335 CCS4\v120\DSP2833x_common\source文件夹中的DSP2833x_MemCopy.c这个文件,然后点OK。
第五步:编译,点rebuild,编译至少要保证没有ERROR,否则请检查一下
在第三步操作的地方是不是有错误。
需要注意的是:不是RAM中运行正确的程序,就在FLASH中运行也一定正确。这是因为同样的程序在DSP的RAM中运行消耗的时间要远远短于在FLASH中运行的时间。
比如,有一个中断函数cpu_timer_isr10ms(),这个函数每隔10ms由CPU定时器1产生中断触发,自动跳转进入执行一次。这个cpu_timer_isr1ms()内部包括三个子函数依次是adc_sanple(),pwm_update(),gpio_toggle()
如下
cpu_timer_isr1ms()
{
adc_sanple();
pwm_update();
gpio_toggle();
}
其中假设adc_sanple()这个子函数在RAM中的执行时间是1ms,pwm_update()这个子函数在RAM中的执行时间是2ms,gpio_toggle()这个子函数在RAM中的执行时间是3ms,那么1+2+3=6<10,所以完全没有问题,在RAM中上面这些程序都可以运行很好。
但是,如果把上面这些程序放到FLASH中运行,很有可能adc_sanple()这个子函数在FLASH中的执行时间是3ms,pwm_update()这个子函数在FLASH中的执行时间是7ms,这是因为同样的程序在DSP的RAM中运行消耗的时间要远远短于在FLASH中运行的时间。这样前两个函数就把10ms都用掉了,根本轮不上gpio_toggle()这个子函数被执行,就被DSP强制终止了,所以很多时候根本就看不到gpio_toggle()的现象。