(Kinetis K60)WDOG看门狗测试
看门狗是一种计数器。当计数的值溢出时会自动复位MCU。(需要在溢出前“喂狗”,避免复位)
看门狗机制可以避免程序跑死(跑死时自动复位)
改变看门狗寄存器参数前必须解锁看门狗。freescale kinetis看门狗解锁步骤是向看门狗的解锁寄存器连续写入0XC520和0xD928.两次写入不能超过20个时钟周期。
注:程序需要烧至flash,否则复位后程序丢失。
初始化看门狗
void WDOG_Init(void) { WDOG_UNLOCK = 0xC520; WDOG_UNLOCK = 0xD928; //解锁看门狗寄存器(重新写入前必须解锁)两次写入不能超过20个时钟周期 WDOG_PRESC = 0x0700; //(7+1)分频 WDOG_TOVALH = 0x0110; //看门狗超时时间设置为3s WDOG_TOVALL = 0x5E90; }
喂狗
void WDOG_Feed(void) { WDOG_REFRESH = 0xA602; WDOG_REFRESH = 0xB480; //喂狗 }
关闭和开启看门狗
void WDOG_Close(void) { WDOG_UNLOCK = 0xC520u; WDOG_UNLOCK = 0xD928u; WDOG_STCTRLH &= ~0x0001; //关闭看门狗 WDOTEN 0 } void WDOG_Open(void) { WDOG_UNLOCK = 0xC520; WDOG_UNLOCK = 0xD928; WDOG_STCTRLH |= 0x0001; //打开看门狗 WDOTEN 1 }
所有代码
#include "LED.h" void WDOG_Init(void); void WDOG_Feed(void); void WDOG_Close(void); void WDOG_Open(void); void main(void) { DisableInterrupts; WDOG_Init(); //初始化看门狗 init_LED(); EnableInterrupts; WDOG_Open(); //开启看门狗 Delay(1500); while(1) { LED1(0); LED2(0); LED3(0); LED4(0); //WDOG_Feed(); //喂狗 } } void WDOG_Init(void) { WDOG_UNLOCK = 0xC520; WDOG_UNLOCK = 0xD928; //解锁看门狗寄存器(重新写入前必须解锁)两次写入不能超过20个时钟周期 WDOG_PRESC = 0x0700; //(7+1)分频 WDOG_TOVALH = 0x0110; //看门狗超时时间设置为3s WDOG_TOVALL = 0x5E90; } void WDOG_Feed(void) { WDOG_REFRESH = 0xA602; WDOG_REFRESH = 0xB480; //喂狗 } void WDOG_Close(void) { WDOG_UNLOCK = 0xC520u; WDOG_UNLOCK = 0xD928u; WDOG_STCTRLH &= ~0x0001; //关闭看门狗 WDOTEN 0 } void WDOG_Open(void) { WDOG_UNLOCK = 0xC520; WDOG_UNLOCK = 0xD928; WDOG_STCTRLH |= 0x0001; //打开看门狗 WDOTEN 1 }
===========================华丽的代码分割===============================
注释掉“喂狗后”LED 1.5秒闪烁(初始化LED为低电平)3秒看门狗复位
喂狗,LED亮1.5后熄灭