IWDG的本质
Independent watchdog,即独立看门狗。
本质是:能产生系统复位信号的计时器。
- 递减的计数器。
- 时钟由独立的RC振荡器提供(不是来自于主时钟HSE或HSI),可在待机或者停止模式下运行。
- 看门狗被激活后,当递减计数器计数到0x000时产生复位。
喂狗:在计数器计数到0之前,重装载计数器的值,防止复位。
当发生以下任一事件时,产生一个系统复位:
- NRST引脚上的低电平
- 窗口看门狗计数终止(WWDG复位)
- 独立看门狗计数终止(IWDG复位)
- 软件复位(SW复位)
- 低功耗管理复位
IWDG的作用
异常:单片机在运行时可能由于外界电磁干扰或者自身系统(硬件或软件)异常,导致程序跑飞,如:陷入某个不正常的死循环(死机),打断正常的程序运行。
作用:检测外界电磁干扰,或硬件异常导致的程序跑飞问题。(软件异常由WWDG解决)
应用:在一些高稳定性的产品中,并且对时间精度要求较低(IWDG来源于RC振荡器,RC振荡器时钟频率不太稳定)。
独立看门狗是异常处理的最后手段,不可依赖,应在设计时尽量避免异常的发生。
IWDG工作原理
CPU必须及时喂狗,否则系统复位重启!
LSI:低速内部振荡器(RC振荡器),启用IWDG后,LSI时钟会自动开启。LSI时钟频率并不精确,F1用40kHz。
12位递减计数器,最大能装4095值。
密钥寄存器:进行解锁。
IWDG寄存器
键寄存器(IWDG_KR)
- 用于喂狗。
- 解除PR寄存器和PLR寄存器写访问保护。
- 启动看门狗工作。
硬件看门狗:系统复位后,看门狗会由硬件自动启动,且不能关闭。
软件看门狗:由在IWDG_KR写入0xCCCC,启动看门狗工作。
预分频器寄存器(IWG_PR)
重装载寄存器(IWDG_RLR)
状态寄存器(IWDG_SR)
用于判断预分频值和重装载值是否已经被更新。
寄存器配置操作
- 通过在键寄存器(IWDG_KR)中写入0xCCCC来使能IWDG。
- 通过在键寄存器(IWDG_KR)中写入0x5555来使能寄存器访问。
- 通过将预分频器寄存器(IWDG_PR)编程为0~7中的数值来配置预分频器。
- 对重载寄存器(IWDG_RLP)进行写操作。
- 等待寄存器更新(IWDG_SR=0x0000 0000)。
- 刷新计数器值为IWDG_RLP的值当IWDG_KR=0xAAAA。——喂狗
IWDG溢出时间计算
Tout是看门狗溢出时间
fIWDG是看门狗的时钟源频率
psc是看门狗预分频系数
rlr是看门狗重装载值
寄存器设置分频系数的方法
prer是IWDG_PR 的值
IWDG溢出时间计算公式(寄存器)
IWDG最短最长超时时间
IWDG配置步骤
- 取消PR/RLP寄存器写保护,设置IWDG的预分频系数和重装载值,启动IWDG。HAL_IWDG_Init()
- 及时喂狗,写入0xAAAA到IWDG_KR。HAL_IWDG_Refresh()
typedef struct{
IWDG_TypeDef *Instance;//IWDG寄存器基地址
IWDG_InitTypeDef Init; //IWDG初始化参数
}IWDG_HandleTypeDef;
typedef struct{
uint32_t Prescaler;//预分频系数
uint32_t Reload; //重装载值
}IWDG_InitTypeDef;