1.IWDG简介
- IWDG的全称:Independent watchdog,即独立看门狗,
- IWDG的本能:产生系统复位信号的计数器
- IWDG的特性:递减的计数器,时钟由独立的RC振荡器提供(可在待机和停止模式下运行)
看门狗被激活后,当递减计数器计数到0x000时产生复位 - 喂狗:在计数器计数到0之前,重装载计数器的值,防止复位
IWDG的所用
- 异常:外界电磁干扰或者自身系统(硬件或软件)异常,造成程序跑飞,如:陷入某个不正常的死循环,打断正常的程序运行
- 作用:主要用于检测外界电磁干扰,或硬件异常导致的程序跑飞问题
- 应用在一些需要高稳定性的产品中,并且对时间精度要求较低的场合
独立看门狗是异常处理的最后手段,不可依赖,应在设计时尽量避免异常的发生
2.IWDG工作原理
CPU必须及时喂狗,否则系统复位重启。
3.IWDG框图
- 启用IWDG后,LSI时钟会自动开启
- LSI时钟频率并不精确,F1用40kHz,F4/F7/H7用32kHz进行计算即可
4.IWDG寄存器
-
键寄存器(IWDG_KR)
-
预分频器寄存器 (IWDG_PR)
-
重装载寄存器(IWDG_RLR)
-
状态寄存器(IWDG_SR)
寄存器配置步骤:
- 通过在键寄存器 (IWDG_KR) 中写入 0xCCCC 来使能 IWDG。
- 通过在键寄存器 (IWDG_KR) 中写入 0x5555 来使能寄存器访问。
- 通过将预分频器寄存器 (IWDG_PR) 编程为 0~7 中的数值来配置预分频器。
- 对重载寄存器 (IWDG_RLR) 进行写操作。
- 等待寄存器更新 (IWDG_SR = 0x0000 0000)。
- 刷新计数器值为 IWDG_RLR 的值 (IWDG_KR = 0xAAAA)。
5.IWDG溢出时间计算
6.IWDG配置步骤
- 取消PR/RLR寄存器写保护,设置IWDG预分频系数和重装载值,启动IWDG
HAL_IWDG_Init(IWDG_HandleTypeDef *hiwdg) - 及时喂狗,即写入0xAAAA 到IWDG_KR
HAL_IWDG_Refresh(IWDG_HandleTypeDef *hiwdg)
关键结构体:
typedef struct
{
IWDG_TypeDef *Instance; /* IWDG 寄存器基地址 */
IWDG_InitTypeDef Init; /* IWDG 初始化参数 */
}IWDG_HandleTypeDef;
typedef struct
{
uint32_t Prescaler; /* 预分频系数 */
uint32_t Reload; /* 重装载值 */
} IWDG_InitTypeDef;
7.编程实战:验证不及时喂狗,系统将复位重启
代码暂不贴出