STM32看门狗
1、IWDG
- 简介
- 全称
- Independent watchdog,即独立看门狗
- 本质
- 能产生系统复位信号的计数器
- 特性
- 递减的计数器
- 时钟由独立的RC振荡器提供(可在待机和停止模式下运行)
- 看门狗被激活后,当递减计数器计数到0x000时产生复位
- 喂狗
- 计数器计数到0之前,重新装载计数器的值,防止复位
- 全称
独立看门狗是异常处理的最后手段,不可依赖,应在设计时尽量避免异常的发生
- 工作原理
- CPU必须及时喂狗,否则系统复位重启
- 框图
- IWDG寄存器
- 键寄存器(IWDG_KR)
- 位[15:0]:用于喂狗,解除PR和RLR寄存器写访问保护,启动软件看门狗工作
- 预分频器寄存器(IWDG_PR)
- 位[2:0]:4 * 2预分频因子 = 预分频系数
- 重装载寄存器(IWDG_RLR)
- 位[11:0]:用于存放重装载值,最大值为4096
- 状态寄存器(IWDG_SR)
- 位1:判断重装载值是否已被更新
- 位0:判断预分频值是否已被更新
- 键寄存器(IWDG_KR)
- IWDG溢出时间计算
- Tout = psc * rlr / fIWDG
- Tout是看门狗溢出时间
- fIWDG是看门狗的时钟源频率
- psc是看门狗预分频系数( 4 * 2预分频因子 = 预分频系数 )
- rlr是看门狗的重装载值
- Tout = ( 4 * 2prer ) * rlr / fIWDG
- prer为预分频因子,预分频器寄存器(IWDG_PR)的位[2:0]
- Tout = psc * rlr / fIWDG
- IWDG配置步骤
- 取消PR/RLR寄存器写保护,设置IWDG预分频系数和重装载值,启动IWDG
- HAL_IWDG_Init()
- 及时喂狗,即 0xAAAA 写入到 IWDG_KR
- HAL_IWDG_Refresh()
- 取消PR/RLR寄存器写保护,设置IWDG预分频系数和重装载值,启动IWDG
2、WWDG
-
简介
- 全称
- Window watchdog,即窗口看门狗
- 本质
- 能产生系统复位信号和提前唤醒中断的计数器
- 特性
- 递减的计数器
- 当递减计数器值从 0x40减到 0x3F时复位(即位6跳变到0)
- 计数器的值大于W[6:0](窗口上限值)时喂狗会复位
- 提前唤醒中断(EWI):当递减计数器等于 0x40时可产生
- 喂狗
- 在窗口期间重装载计数器的值,防止复位
- 全称
-
工作原理
- 框图
- WWDG寄存器
- 控制寄存器(WWDG_CR)
- 位7:使能窗口看门狗工作
- 位[6:0]:重装载计数器值
- 配置寄存器(WWDG_CFR)
- 位9:提前唤醒中断
- 位[8:7]:设置预分频系数
- 位[6:0]:窗口上限值
- 状态寄存器(WWDG_SR)
- 位0:判断是否发生了WWDG提前唤醒中断
- 控制寄存器(WWDG_CR)
- WWDG超时时间计算
- Tout = 4096 * 2WDGTB * ( T[5:0] + 1 ) / FWWDG
- Tout是WWDG溢出时间
- FWWDG是WWDG的时钟源频率
- 4096是WWDG固定的预分频系数
- 2WDGTB是WWDG_CFR寄存器设置的预分频系数值
- T[5:0]是WWDG计数器低6位
- Tout = 4096 * 2WDGTB * ( T[5:0] + 1 ) / FWWDG
- IWDG配置步骤
- WWDG工作参数初始化
- HAL_IWDG_Init()
- WWDG Msp初始化
- HAL_WWDG_MspInit() 配置NVIC、CLOCK等
- 设置优先级,使能中断
- HAL_NVIC_SetPriority()、HAL_NVIC_EnableIRQ()
- 编写中断服务函数
- WWDD_IRQHandler() -> HAL_WWDG_IRQHandler()
- 重定义提前唤醒回调函数
- HAL_WWDG_EarlyWakeupCallback()
- 在窗口期内喂狗
- HAL_WWDG_Refresh()
- WWDG工作参数初始化
IWDG和WWDG主要区别
对比点 | 独立看门狗 | 窗口看门狗 |
---|---|---|
时钟源 | LSI(40KHz) | PCLK1 |
复位条件 | 递减计数到0 | 计数值大于W[6:0]值喂狗或减到0x3F |
中断 | 没有中断 | 计数值减到0x40可产生中断 |
递减计数器 | 12位(最大计数范围:4096 ~ 0) | 7位(最大计数范围:127 ~ 63) |