如何預(yù)防DSP BOOT程序因超頻產(chǎn)生異常?本文Advancechip將為您詳細(xì)介紹。
1、在CCS連接上DSP情況下,選擇CPU Reset (Ctrl+Shift+R),PC指針到 3ff8a1位置。
此時(shí)程序的PLLSTS[8:7].DIVSEL=10b (0x0101); PLLCR[].DIV=1100b (0x000C); 根據(jù)sprui10.pdf資料page70 Figure 1-23所示,為OSCCLK的12倍頻,2分頻。
注意:在配置PLLCR之前,需先把DIVSEL置0.
根據(jù)CLKCTL的值0x6400,判斷XTALOSCOFF=1,XCLKINOFF=1, INTOSC2OFF=1.
時(shí)鐘源的配置為選擇內(nèi)部OSC1的10M時(shí)鐘OSCCLK輸入,此時(shí)的DSP主頻為60M。
2、3ff8a1的起始位置即BOOT ROM中InitBoot()函數(shù)入口,當(dāng)函數(shù)進(jìn)入到SelectBootMode()時(shí),程序會(huì)重新配置PLLSTS.DIVSEL。
3、通過(guò)Assembly Step Info (Ctrl+Shift+F5),將持續(xù)執(zhí)行完3ff4b8后,PLLSTS值變成0x0181。
上圖中可以看出MOVW DP, 0x1c0 和 OR @0x11, #0x0180 即實(shí)現(xiàn)了將DIVSEL寄存器設(shè)置成3,也就是代碼 SysCtrlRegs.PLLSTS.bit.DIVSEL = DIVSEL_BY_1;此時(shí)CLKCTL和PLLCR都是原來(lái)的值,DSP運(yùn)行在120M超頻狀態(tài)。
注意:以上過(guò)程在TMS320F28035同樣會(huì)發(fā)生。
4、為了預(yù)防上述事件發(fā)生,在CPU Reset后,PC指向3ff8a1時(shí),手動(dòng)在Registers窗口設(shè)置SYSCTRL.PLLCR=0; 再往下執(zhí)行程序,可預(yù)防部分DSP主頻無(wú)法達(dá)到120M時(shí)產(chǎn)生的燒錄異常。
異?,F(xiàn)象:
因超頻原因,程序在CPU Reset復(fù)位后,首次運(yùn)行到boot28.asm中c_int00之后無(wú)法引導(dǎo)到main(),而是再次運(yùn)行InitBoot() -> code_start -> _c_int00 -> main() 實(shí)現(xiàn)正常運(yùn)行。
步驟如下圖,在CodeStartBranch.asm中_c_int00和 main() 函數(shù)處設(shè)置斷點(diǎn),觀察運(yùn)行情況。
在運(yùn)行時(shí)復(fù)位后運(yùn)行,PLLCR、PLLSTS、CLKCTL均保持上次程序運(yùn)行時(shí)的值,且WDCR = 0x00C0,看門(mén)狗關(guān)閉(由code_start:關(guān)閉)如下圖:
繼續(xù)運(yùn)行發(fā)現(xiàn)PLLCR被清0,CLKCTL復(fù)位,PLLSTS依然是1分頻配置,程序再次復(fù)位運(yùn)行回到_c_int00 位置。
再運(yùn)行程序,即可因PLLCR=0的原因,PC指針正確引導(dǎo)到main()入口函數(shù),如下圖:
注意:換在TMS320F28035上測(cè)試,不會(huì)有第二次c_int00復(fù)位執(zhí)行發(fā)生,且PLLCR沒(méi)有清0(一直保持0x000C)。