想把一個原來是燒寫到DSP的片內(nèi)RAM的程序修改成是燒寫到DSP片內(nèi)FLASH的程序,不僅僅是修改一個cmd文件就結束了,還需要做其他幾個步驟:
第一步:把28335_RAM_lnk.cmd這個從project中移除,用右鍵選擇28335_RAM_lnk.cmd然后選delate。如下圖1,然后出現(xiàn)對話框,點YES,如圖2。
圖1
圖2
第二步:右鍵選擇project名稱,然后選add file to project,如下圖3,然后出現(xiàn)瀏覽框,在\Code of TMS320F28335 CCS4\v120\DSP2833x_common\cmd這個子文件夾下,選擇F28335.cmd,點OK,至此可以在project的文件列表內(nèi)看到F28335.cmd被添加到project中。
圖3
第三步:在main()函數(shù)中添加如下語句
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
InitFlash();
上述兩句話添加在InitPieVectTable();這句的下面的一行。
添加語句的時候,注意不要添加錯了,每一個字母都要正確,括號也要用英文括號。
第四步:添加DSP2833x_MemCopy.c這個文件到project中,右鍵選擇project名稱,然后選add file to project,然后出現(xiàn)瀏覽框,找到\Code of TMS320F28335 CCS4\v120\DSP2833x_common\source文件夾中的DSP2833x_MemCopy.c這個文件,然后點OK。
第五步:編譯,點rebuild,編譯至少要保證沒有ERROR,否則請檢查一下
在第三步操作的地方是不是有錯誤。
需要注意的是:不是RAM中運行正確的程序,就在FLASH中運行也一定正確。這是因為同樣的程序在DSP的RAM中運行消耗的時間要遠遠短于在FLASH中運行的時間。
比如,有一個中斷函數(shù)cpu_timer_isr10ms(),這個函數(shù)每隔10ms由CPU定時器1產(chǎn)生中斷觸發(fā),自動跳轉(zhuǎn)進入執(zhí)行一次。這個cpu_timer_isr1ms()內(nèi)部包括三個子函數(shù)依次是adc_sanple(),pwm_update(),gpio_toggle()
如下
cpu_timer_isr1ms()
{
adc_sanple();
pwm_update();
gpio_toggle();
}
其中假設adc_sanple()這個子函數(shù)在RAM中的執(zhí)行時間是1ms,pwm_update()這個子函數(shù)在RAM中的執(zhí)行時間是2ms,gpio_toggle()這個子函數(shù)在RAM中的執(zhí)行時間是3ms,那么1+2+3=6<10,所以完全沒有問題,在RAM中上面這些程序都可以運行很好。
但是,如果把上面這些程序放到FLASH中運行,很有可能adc_sanple()這個子函數(shù)在FLASH中的執(zhí)行時間是3ms,pwm_update()這個子函數(shù)在FLASH中的執(zhí)行時間是7ms,這是因為同樣的程序在DSP的RAM中運行消耗的時間要遠遠短于在FLASH中運行的時間。這樣前兩個函數(shù)就把10ms都用掉了,根本輪不上gpio_toggle()這個子函數(shù)被執(zhí)行,就被DSP強制終止了,所以很多時候根本就看不到gpio_toggle()的現(xiàn)象。