这里除了提供软件看门狗复位的方法,还提供其他的软件复位方式。
看门狗的复位代码:#define SW_RESET() WDTCTL = WDT_MRST_0_064; while(1);
在5xx/6xx和 CC430系列中有PMM (电源管理模块), 可以使用软件的BOR和POR如下:
#define SW_RESET() PMMCTL0 = PMMPW + PMMSWBOR + (PMMCTL0 & 0x0003);
#define SW_RESET() PMMCTL0 = PMMPW + PMMSWPOR + (PMMCTL0 & 0x0003);
如何追踪复位的原因呢?在5xx/6xx系列中,可以通过判断SYSRSTIV寄存器来检测上次复位的原因。
为了调试方便,使用如下的代码来保存SYSRSTIV寄存器的数值。
对于 CCS 编译器:
//定义全局变量保存复位的原因 #pragma NOINIT (SysRstIv); unsigned int SysRstIv; int _system_pre_init(void) { //停止看门狗 WDTCTL = WDTPW + WDTHOLD; //保存复位信息 SysRstIv = SYSRSTIV; return 1; }
对于IAR编译器:
//定义全局变量保存复位的原因
__no_init unsigned int SysRstIv; int __low_level_init(void) {
//停止看门狗
WDTCTL = WDTPW + WDTHOLD; SysRstIv = SYSRSTIV; return 1; }