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