常见问题

如何预防DSP BOOT程序因超频产生异常?

2022-01-25 来源:原创 浏览量:3792

如何预防DSP BOOT程序因超频产生异常?本文Advancechip将为您详细介绍。

1、在CCS连接上DSP情况下,选择CPU Reset (Ctrl+Shift+R),PC指针到 3ff8a1位置。

此时程序的PLLSTS[8:7].DIVSEL=10b (0x0101); PLLCR[].DIV=1100b (0x000C); 根据sprui10.pdf资料page70 Figure 1-23所示,为OSCCLK的12倍频,2分频。

注意:在配置PLLCR之前,需先把DIVSEL置0.

根据CLKCTL的值0x6400,判断XTALOSCOFF=1,XCLKINOFF=1, INTOSC2OFF=1.

时钟源的配置为选择内部OSC1的10M时钟OSCCLK输入,此时的DSP主频为60M。

2、3ff8a1的起始位置即BOOT ROM中InitBoot()函数入口,当函数进入到SelectBootMode()时,程序会重新配置PLLSTS.DIVSEL。

3、通过Assembly Step Info (Ctrl+Shift+F5),将持续执行完3ff4b8后,PLLSTS值变成0x0181。

上图中可以看出MOVW DP, 0x1c0 和 OR @0x11, #0x0180 即实现了将DIVSEL寄存器设置成3,也就是代码 SysCtrlRegs.PLLSTS.bit.DIVSEL = DIVSEL_BY_1;此时CLKCTL和PLLCR都是原来的值,DSP运行在120M超频状态。

注意:以上过程在TMS320F28035同样会发生。

4、为了预防上述事件发生,在CPU Reset后,PC指向3ff8a1时,手动在Registers窗口设置SYSCTRL.PLLCR=0; 再往下执行程序,可预防部分DSP主频无法达到120M时产生的烧录异常。

异常现象:

因超频原因,程序在CPU Reset复位后,首次运行到boot28.asm中c_int00之后无法引导到main(),而是再次运行InitBoot() -> code_start -> _c_int00 -> main() 实现正常运行。

步骤如下图,在CodeStartBranch.asm中_c_int00和 main() 函数处设置断点,观察运行情况。

在运行时复位后运行,PLLCR、PLLSTS、CLKCTL均保持上次程序运行时的值,且WDCR = 0x00C0,看门狗关闭(由code_start:关闭)如下图:

继续运行发现PLLCR被清0,CLKCTL复位,PLLSTS依然是1分频配置,程序再次复位运行回到_c_int00 位置。

再运行程序,即可因PLLCR=0的原因,PC指针正确引导到main()入口函数,如下图:

注意:换在TMS320F28035上测试,不会有第二次c_int00复位执行发生,且PLLCR没有清0(一直保持0x000C)。

电话咨询

0731-88731027

微信公众号

微信公众号

微信公众号

移动二维码

移动二维码

移动二维码

返回顶部