参考资料:
1、正点原子探索者STM32f407开发板-《STM32f407开发指南-库函数版本》-第11章;
2、STM32F4xx 官方参考资料《STM32F4xx中文参考手册》-第18章。
目录
看门狗:用于监测单片机程序运行状态的模块或者芯片。
解决问题:
在启动正常运行的时候,系统不能复位。
在程序异常执行时候,系统复位,程序重新执行。
IWDG与WWDG的区别:
故障它仍有效。
独立看门狗适合应用于需要看门狗作为一个在主程序之外、能够完全独立工
作,并且对时间精度要求低的场合。
来检测应用程序非正常的过迟或过早操作。
窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。
启用IWDG:
在键值寄存器IWDG_KR中写入0xCCCC,此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。如果程序异常,就无法正常喂狗,从而系统复位。
IWDG框架图:
![](https://img-blog.csdnimg.cn/885a9d31997748ea8b52d5d07edb9282.png)
键值寄存器IWDG_KR: 0~15位有效。
预分频寄存器IWDG_PR:0~2位有效。
具有写保护功能,要操作先取消写保护
重装载寄存器IWDG_RLR:0~11位有效。
具有写保护功能,要操作先取消写保护。
状态寄存器IWDG_SR:0~1位有效。
IWDG超时时间
溢出时间计算详解(看门狗的喂狗时间):
溢出时间就是“从重装载值递减至0的时间”。
1、f=(总时钟频率)/(分频系数)=32/(4×2^prer)
①、时钟频率LSI=32KHz;
②、prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7,假设prer是0,那么(4×2^prer)=2^(2+prer)=2^(2+0)=4,也就是4分频,这就是为什么PR寄存器上面[2:0]位最低设置为000却是4分频;
③、rlr 为看门狗的重装载值(IWDG_RLR 的值);
2、我们知道频率T=1/f,Tout=(计算次数)*T,计算次数就是rlr装载的值,所以:
Tout=((4×2^prer) ×rlr) /32 (M4)
①、一个看门狗时钟周期就是最短超时时间;
②、最长超时时间=IWDG_RLR寄存器最大值x看门狗时钟周期。
IWDG独立看门狗操作库函数
void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);//取消写保护:0x5555使能
void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);//设置预分频系数:写PR
void IWDG_SetReload(uint16_t Reload);//设置重装载值:写RLR
void IWDG_ReloadCounter(void);//喂狗:写0xAAAA到KR
void IWDG_Enable(void);//使能看门狗:写0xCCCC到KR
FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);//状态:重装载/预分频 更新
函数分布在stm32f4xx_iwdg.h和stm32f4xx_iwdg.c中。
IWDG操作步骤
使用示例:
//独立看门狗初始化函数
void IWDG_Init(u8 prer,u16 rlr)
{
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对IWDG->PR IWDG->RLR的写
IWDG_SetPrescaler(prer); //设置IWDG分频系数
IWDG_SetReload(rlr); //设置IWDG装载值
IWDG_ReloadCounter(); //reload
IWDG_Enable(); //使能看门狗
}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//reload
}
这里设置预分频系数prer和装载值rlr(就是循环次数)
比如IWDG_Init(4, 500);的含义就是prer=64,Tout=(4*2^4)*500/32000=1(s),即每一秒钟要喂一次狗🐕。
Fin.