看门狗硬核拆解:1.6秒不喂狗,硬件强制"掀桌子"

很多工程师在产品测试时遇到"无故重启"就怀疑是电源不稳或芯片体质差,书稿1.4节却用一个经典芯片MAX706点破真相:看门狗(WDT)是一个独立于CPU的硬件计时器------若1.6秒内WDI引脚未收到电平翻转("喂狗"信号),MAX706立即在RESET引脚输出140ms低电平,强制单片机复位。这好比领导每隔1.6秒问你"还活着吗"------你若超过时间不回复,他就直接按重启键,不管你是在忙还是已经死机。
1. 喂狗窗口的"生死时速"
书稿提到MAX706的超时时间为1.6s(典型值),但未给出计算逻辑。我的补充:喂狗间隔必须小于1.6s,但不能太短(如每100μs喂一次),否则频繁的GPIO翻转会浪费CPU时间且增加功耗。最佳实践:主循环最大耗时 + 20%安全裕量 < 看门狗超时时间。例如主循环最坏情况耗时800ms(含RS485通信重试、EEPROM写入等),则喂狗间隔设为1.0s,既保证不会误触发,又留足400ms冗余。
2. 看门狗复位 vs POR上电复位:谁干的?
书稿1.5节提到POR(上电复位)和PDR(掉电复位),但未提及如何区分复位源。我的补充:ARM32的RCC_CSR寄存器(复位与时钟控制状态寄存器)记录了复位原因:
- PINRSTF(引脚复位标志):外部RESET引脚被拉低------看门狗复位或手动按键复位都会置1。
- PORRSTF(上电复位标志):VCC从0V上升触发的复位。
- WDGRSTF (独立看门狗复位标志):IWDG(内部看门狗)触发的复位------MAX706 外部看门狗不会置位此标志。
若想区分"外部看门狗咬人"和"手动按键复位",需在RCC_CSR中综合判断------外部看门狗复位时PINRSTF=1且PORRSTF=0,而手动按键复位时PINRSTF=1但复位前无"喂狗失败"的上下文。

3. 调试阶段的"与狗斗智"(我的补充)
书稿未提及调试时的看门狗冲突------仿真器断点时,CPU暂停运行,但外部看门狗MAX706仍在倒计时。若断点停留超过1.6s,看门狗超时复位,仿真连接断开,调试被迫中断。我的解法:
- 硬件跳线:在PCB上预留WDI跳线帽,调试时断开跳线(停止喂狗信号),但需同时拉高WDI或禁用看门狗(MAX706无禁用脚,只能断开)。
- 软件条件编译:在调试版本中不初始化喂狗GPIO,让外部看门狗自生自灭(但注意:WDI浮空可能导致MAX706内部计时紊乱,最好外部上拉至高电平或接地)。
- 终极方案:采用带"看门狗使能脚"的复位芯片(如MAX706的MR脚可手动触发复位,但不能禁用看门狗),或改用内部IWDG(可通过调试寄存器冻结)。
4. 冷知识:看门狗也能"被狗咬"
书稿4.14节的RS485恒温控制实验中,若PID算法计算耗时过长(如浮点运算较多),导致主循环周期超过1.6s,外部看门狗会触发复位------这时你看到的现象是"温控器每隔几秒重启一次",很容易误判为电源问题。实际上只需将喂狗操作移到定时器中断中,保证每500μs翻转一次WDI,而主循环再慢也无妨。
5. 实战喂狗代码模板(我的补充)
c
// 定时器中断(每100μs触发)中喂狗
void TIM2_IRQHandler(void) {
if (TIM2->SR & TIM_SR_UIF) {
TIM2->SR &= ~TIM_SR_UIF;
static uint8_t wdt_toggle = 0;
wdt_toggle ^= 1; // 每次中断翻转电平
HAL_GPIO_WritePin(WDI_GPIO_Port, WDI_Pin, wdt_toggle);
}
}
这种"中断喂狗"方式彻底隔离了主循环的耗时影响------即使主循环因阻塞而超时,看门狗也不会误触发。但代价是定时器中断频繁执行(每100μs一次),功耗略有增加。
6. 软狗 vs 硬狗(我的补充)
结语 :外部看门狗是单片机系统的"最后一道防线"------当程序死机、跑飞或陷入死循环时,它是唯一能让你"起死回生"的硬件机制。记住:喂狗不是"例行公事",而是系统健康状况的"心跳监测"。学会与看门狗共舞,你的产品才能在严酷环境中持续奔跑而不"猝死"。
