STM32F407 独立看门狗 个人笔记

什么是看门狗

如果程序跑飞了怎么办?
可以用看门狗来监控。
看门狗是:
一个递减的计数器,如果不按时给计数器赋值,计数器的值减到一定程度,就会使系统复位。
也就是说如果程序运行异常,无法正常给计数器赋值(喂狗),系统会自动复位。
STM32F407有两种看门狗:

  1. 独立看门狗
  2. 窗口看门狗

独立看门狗

  • 在键值寄存器(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
}
原文地址:https://www.cnblogs.com/YuQiao0303/p/10064757.html