主题 | 内容 | 教学目的/扩展视频 |
---|---|---|
看门狗 | 什么是看门狗,原理分析,启动喂狗方法,读标志位。 | 熟悉在程序里用看门狗。 |
师从洋桃电子,杜洋老师
比喻要素 | 技术对应 |
---|---|
水龙头流速 | 计数器递减频率 |
桶容量 | 初始重载值 |
倒水操作 | 喂狗动作 |
水溢出 | 系统复位 |
特性 | 独立看门狗(IWDG) | 窗口看门狗(WWDG) |
---|---|---|
时钟源 | 独立40kHz RC振荡器 | 主时钟(PCLK1) |
计数器位宽 | 12位递减计数器 | 7位递减计数器 |
工作模式 | 停机/待机模式可用 | 需主时钟运行 |
喂狗时间 | 任意时间 | 指定时间窗口 |
特殊功能 | 自由定时器模式 | 早期预警中断 |
典型应用场景 | 基础监控/低功耗场景 | 时序严格控制系统 |
// IWDG初始化
void IWDG_Init(uint16_t reload, uint8_t prescaler)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
IWDG_SetPrescaler(prescaler);
IWDG_SetReload(reload);
IWDG_ReloadCounter();
IWDG_Enable();
}
// 喂狗操作
void Feed_Dog(void)
{
IWDG_ReloadCounter();
}
// WWDG初始化
void WWDG_Init(uint8_t counter, uint8_t window)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_WWDG, ENABLE);
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_SetWindowValue(window);
WWDG_Enable(counter);
WWDG_ClearFlag();
WWDG_EnableIT();
}
// 中断服务函数
void WWDG_IRQHandler(void)
{
if(WWDG_GetFlagStatus() != RESET) {
// 处理早期预警
WWDG_SetCounter(0x7F);
WWDG_ClearFlag();
}
}
看门狗类型 | 计算公式 | 示例计算(超时1s) |
---|---|---|
IWDG | Tout = (4×2^prescaler) × reload / 40k | prescaler=4(256分频), reload=1250 |
WWDG | Tout = (4096×2^WDGTB) × (T[5:0]+1) / PCLK1 | PCLK1=36M, WDGTB=3, T=54 |
Q1:看门狗导致频繁复位怎么办?
Q2:如何选择看门狗类型?
Q3:窗口看门狗窗口值如何设置?
附:STM32看门狗相关寄存器速查表
寄存器 | IWDG | WWDG |
---|---|---|
控制寄存器 | IWDG_KR | WWDG_CR |
预分频寄存器 | IWDG_PR | WWDG_CFR |
重载寄存器 | IWDG_RLR | WWDG_CFR |
状态寄存器 | - | WWDG_SR |
[1] 洋桃电子B站课程-STM32入门100步
[2] STM32官方文档手册
[3] STM32F103固件函数库用户手册(中文)
[4] 看门狗原理.pptx
下期预告:下一期将探讨看门狗应用程序分析,欢迎持续关注!
点击查阅往期【STM32专栏】文章
版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志:
- v1.0 初始版本(2025-04-06)