Appearance
IWDG独立看门狗
Independent watchdog
本质实际上就是一个可以产生系统复位信号的计数器
IWDG是一个递减的计数器, 他的时钟是独立RC振荡器提供, 可以在待机或者停止的情况下运行, 看门狗被激活以后, 递减计数器计数到0的时候会产生复位
在计数器计数到0之前需要进行喂狗, 重装载计数器的值, 防止复位
作用
- 异常, 外界的电磁干扰或者自身系统的硬件或者软件异常, 导致不正常的死循环, 打断程序正常运行
- 作用, 用于检测外界电磁干扰, 或硬件异常导致的软件跑飞
- 应用, 在一些需要高稳定性的产品, 对时间精度要求比较低的场景里面
异常处理的最后手段, 不可以依赖
工作原理
CPU必须及时喂狗
寄存器
- IWDG_KR密钥寄存器
用于喂狗, 关闭写保护, 以及开启看门狗, 硬件看门狗介绍在用户闪存手册里面
硬件看门狗=>硬件复位以后会由硬件自己启动看门狗, 不能关闭
软件看门狗=>不会自己启动, 软件写入以后才会启动
c
#define OB ((OB_TypeDef *)OB_BASE)
对应这一个寄存器
- IWDG_PR预分频器寄存器
- IDWG_RLR重装载寄存器
- IWDG_SR状态寄存器
- IWDG_WINR(F1没有)窗口寄存器
十二位有效, 递减计数器低于设个寄存器的值的时候并且大于0的时候必须喂狗, 受到写保护, 实际上是缩短了喂狗的时间, 只有在这一个区间范围里面的时候才可以喂狗
寄存器配置步骤
- 通过在键寄存器 (IWDG_KR) 中写入 0xCCCC 来使能 IWDG。
- 通过在键寄存器 (IWDG_KR) 中写入 0x5555 来使能寄存器访问。
- 通过将预分频器寄存器 (IWDG_PR) 编程为 0~7 中的数值来配置预分频器。
- 对重载寄存器 (IWDG_RLR) 进行写操作。
- 等待寄存器更新 (IWDG_SR = 0x0000 0000)。
- 刷新计数器值为 IWDG_RLR 的值 (IWDG_KR = 0xAAAA)。
溢出计算
- F1
- F4F7H7
判断实际发生的复位类型
在RCC寄存器里面有一个RCC_CSR寄存器