1897|0

3

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

如何预防DSP BOOT程序因超频产生异常? [复制链接]

 

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超频状态。

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()入口函数,如下图:

 
点赞 关注(1)
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表