STM32F407 独立看门狗 个人笔记
什么是看门狗
如果程序跑飞了怎么办?
可以用看门狗来监控。
看门狗是:
一个递减的计数器,如果不按时给计数器赋值,计数器的值减到一定程度,就会使系统复位。
也就是说如果程序运行异常,无法正常给计数器赋值(喂狗),系统会自动复位。
STM32F407有两种看门狗:
- 独立看门狗
- 窗口看门狗
独立看门狗
- 在键值寄存器(IWDG_KR)中写入0xCCCC:开始启用独立看门狗。
- 此时计数器开始递减
- 当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。
- 无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗),
- 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。
- 如果程序异常,就无法正常喂狗,从而系统复位。
- 时钟源是频率为32K的LSI(low speed internal 时钟),经过预分频寄存器的值分频后,即为独立看门狗的计数器的频率。
- 预分频寄存器IWDG_PR和键值寄存器IWDG_KR都有写保护功能,要操作他们需要先取消写保护。
独立看门狗时间计算
如何计算超时时间,即独立看门狗多久不喂会复位?
下图适用与M4:
由图可知
分频系数 = (2^PR寄存器的值)×4
∴超时时间= 周期×初值
=(分频系数/32K)× rlr
=(2^PR寄存器的值)×4 ×rlr
独立看门狗适用场合
- 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效。
- 独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
独立看门狗代码写法
#include "iwdg.h"
//////////////////////////////////////////////////////////////////////////////////
//初始化独立看门狗
//prer:分频数:0~7(只有低3位有效!)
//rlr:自动重装载值,0~0XFFF.
//分频因子=4*2^prer.但最大值只能是256!
//rlr:重装载寄存器值:低11位有效.
//时间计算(大概):Tout=((4*2^prer)*rlr)/32 (ms).
void IWDG_Init(u8 prer,u16 rlr)
{
//1.取消寄存器写保护:0x5555使能
IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //使能对IWDG->PR IWDG->RLR的写
//2. 设置IWDG分频系数:写PR
IWDG_SetPrescaler(prer);
//3. 设置IWDG装载值
IWDG_SetReload(rlr);
//4. 喂狗:写0xAAAA到KR,赋初值
IWDG_ReloadCounter(); //reload
//5. 使能看门狗:写0xCCCC到KR
IWDG_Enable();
}
//喂独立看门狗
void IWDG_Feed(void)
{
IWDG_ReloadCounter();//喂狗:写0xAAAA到KR
}