ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
* 导师视频讲解:[**去听课**](https://www.bilibili.com/video/BV1k34y1D7Vz?p=14) >[success] **技术支持说明:** >**1**.一般以自主学习为主 > **2**.可到官方问答社区中提问:[**去提问**](https://bbs.csdn.net/forums/zigbee) > **3**.工程师**会尽快**解答社区问题,但他们是一线开发,【**难以保证**】解答时效,解答辛苦,感谢理解! <br/> ## **理论基础** * **看门狗定时器**:看门狗定时器也是定时器,相对对于定时器T1和T3,其特殊性在于:时间到了后会复位芯片。 ### * **喂狗**:为阻止看门狗定时器复位芯片,我们可以在看门狗定时器计时结束之前,让其重新开始计时(即清零定时器)。这个清零定时器的动作我们称之为”喂狗”。 ### * **程序跑飞**:程序在正常运行的过程中,有时候可能会突然遇到意外(例如静电干扰)而不正常,没有按正常的流程运行,这个现象我们称之为“程序跑飞”。在遇到程序跑飞现象时,看门狗没有及时被“喂”,时间一到就会去复位芯片。复位芯片后,我们可以通过技术手段让程序恢复正常。(这也是看门狗定时器的意义所在) ### * **应用场景**:看门狗定时器可用在电噪声大、电源故障率高或静电放电等恶劣环境中,或对可靠性有更高要求的场合中。如果系统不需要用到看门狗,则可配置成间隔定时器,在指定的时间间隔内发生中断。 <br/> ## **相关寄存器** ![](https://img.kancloud.cn/a8/6b/a86b8b5f00d3ef5780057ddfe7377121_890x1116.png =600x) ### 初始化配置: ``` 1.WDCTL = 0x00;  // 打开 IDLE模式才能设置看门狗   2.WDCTL = 0x08;  // 看门狗模式、定时1秒 ``` ### 喂狗配置: ``` 1.WDCTL |= (0xA << 4);  // 在Bit[7:4]依次写入0xA和0x5,定时器被清除   2.WDCTL |= (0x5 << 4); ``` <br/> ## **程序分析** 主函数: ``` void main() { initLed(); initWatchDogTimer(); while(1) { #if 0 //0 or 1 delayMs(SYSCLK_16MHZ, 1500); #else delayMs(SYSCLK_16MHZ, 500); watchDogFeet(); delayMs(SYSCLK_16MHZ, 500); watchDogFeet(); delayMs(SYSCLK_16MHZ, 500); watchDogFeet(); #endif LED = (LED == LED_ON)?LED_OFF : LED_ON; } } ``` &emsp;&emsp;代码中把看门狗定时器设置成了定时1秒,所以必须在1秒内进行喂狗。 ### &emsp;&emsp;第一段程序直接延时了1.5秒,然后翻转LED灯。由于没有及时喂狗,所以系统不断地复位,而且看不到LED灯闪烁过程 ### &emsp;&emsp;第二段程序虽然也延时了1.5秒,但是是分三次延时且每隔500ms就喂狗一次,所以看门狗不会导致复位,程序正常运行,LED灯闪烁。 <br/> ## **调试仿真** >[danger] 在学习本节课前,需要先掌握基本的程序下载及仿真操作,参考:[程序下载及仿真](2482302) 打开第一段程序预编译:#if 1,编译下载到开发板,LED灯一直是灭的! ### 打开第二段程序预编译:#if 0,编译下载到开发板,LED灯闪烁! <br/> <br/> ## **项目定制** * 如需项目定制开发,可扫码添加项目经理好友(注明“**项目定制**”) * 定制范围:**NB-IoT**、**CATn(4G)**、**WiFi**、**ZigBee**、**BLE Mesh**以及**STM32**、**嵌入式Linux**等IoT技术方案 * 善学坊官网:[www.sxf-iot.com](https://www.sxf-iot.com/) ![](https://img.kancloud.cn/ca/73/ca739f92cab220a3059378642e3bd502_430x430.png =200x) * 非项目定制**勿扰**,此处**非**技术支持