网上看到的,对咱们有些帮助。
大家擦亮眼睛,一大批文字火速袭来~~~
前段时间调试的时候遇到的一个莫名其妙的问题,后来费了很多周章才解决,现把问题贴出来,可能有的网友已经遇到过,愿能给
更过的网友一点帮助吧。
问题现象:
MSP430无故复位,单步调试发现复位的地方还和代码无关。也就是可能在这个地方复位,也可能在那个地方复位。
问题排查:
我在单步调试复位的地方,加死循环延时,结果在死循环内复位了。不加延时,就在别的地方复位了。跟我的感觉就是好像是和处理的时间有关(当然前面已经排查过N种情况)。与时间最有关的是看门狗,但是我的代码第一行就是标准的停狗代码
WDTCTL = WDTPW + WDTHOLD;
按理看门狗不应该会复位才对。
问题还得解决,要先排除看门狗,得先弄清楚看门狗,查官方资料得知430默认看门狗是开启的,也就是,如果是看门狗复位,只可能是在我关狗之前就时间溢出了。如果不是看门狗,就得另寻它路了。关狗之前就时间溢出?这段时间系统在干什么?经过查找资料,知道C语言在初始化中会对变量初始化,那如果有大量的变量需要初始化那有可能就是溢出的原因了。因此我把代码中,用到的2K的缓存数组去掉,程序又恢复了活力!!!
看来果然是看门狗的问题,问题找到了,事情就好解决了,以下列出我找到的两种解决方法。
问题总结:
MSP430上电默认看门狗开启,而C语言在上电时需要初始化变量,如果有大量缓存变量,初始化的时间就有可能导致喂狗不及时,而出现看门狗复位。
问题解决:
两种方法可以解决:
1. 上电时不初始化变量。IAR中,只需在大缓存数组前增加“no_init”,例如 no_init unsigned char Wave[512]; 那么上电后就不会对该数组进行初始化。
2. 修改启动代码。 程序首先运行的是启动代码,因此在启动代码中关闭看门狗,也能解决问题。
启动文件位于IAR安装文件下D:\Program Files\IAR Systems\Embedded Workbench 5.4 Evaluation\430\src\lib\430\cstartup.s43
将cstartup.s43添加进你的工程并打开。可以看到里面有:
#ifdef DISABLE_WATCHDOG
MOV #WDTPW + WDTHOLD, &WDTCTL
#endif
官方已经考虑到这个问题了,因此,你只需要在最前面宏定义DISABLE_WATCHDOG了。
#define DISABLE_WATCHDOG |