第十一篇,看门狗定时器编程

1.概念

单片机平台的嵌入式产品,运行环境各种各样,所处环境可能有比较恶劣的情形(强电磁场,极端温湿度......)。

由于外接干扰,可能导致单片机内部数据混乱,程序运行出错,导致程序跑飞或者死循环,程序无法正常运行,这种情况需要纠正。

看门狗的作用是周期性地查看芯片的运行情况,一旦芯片发生错误,看门狗就会发送复位信号,让系统复位,从而恢复程序正常运行。

2.原理

看萌狗本质上是一个定时器,当看门狗超时,可以选择向芯片发送复位信号,正常运行时要避免看门狗超时,可以通过周期性地重置看门狗定时器的计数器来防止看门狗超时,这种操作叫做喂狗。如果程序跑飞或者进入死循环,不执行喂狗的代码,看门狗定时器就会超时,导致系统复位。

3.看门狗的分类

看门狗分为内部看门狗和独立看门狗

内部看门狗使用芯片本身的时钟和电源,如果芯片异常导致了看门狗异常,造成监控的作用弱化。

独立看门狗使用独立的时钟和电源,不会受到芯片本身异常的影响,监控效果更好。

4.stm32的独立看门狗

原始时钟使用的是低速内部振荡时钟 ------- LSI RC -------- 32KHz

stm32的看门狗寄存器具有写保护的功能,操作这些寄存器之前必须关闭写保护

解除写保护:IWDG_KR =====> 0x5555 启动看门狗:IWDG_KR =====> 0xcccc 喂狗::IWDG_KR =====> 0xaaaa

5.stm32f407看门狗的编程实现

工程中加入看门狗库函数源码:

(1)关闭看门狗寄存器写保护

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

(2)设置看门狗的预分频系数和看门狗的初始计数值

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);

参数: * @arg IWDG_Prescaler_4: IWDG prescaler set to 4

           * @arg IWDG_Prescaler_8: IWDG prescaler set to 8

           * @arg IWDG_Prescaler_16: IWDG prescaler set to 16

           * @arg IWDG_Prescaler_32: IWDG prescaler set to 32

           * @arg IWDG_Prescaler_64: IWDG prescaler set to 64

           * @arg IWDG_Prescaler_128: IWDG prescaler set to 128

           * @arg IWDG_Prescaler_256: IWDG prescaler set to 256

void IWDG_SetReload(uint16_t Reload);

//参数就是初始值

//比如设置为1s

IWDG_SetPrescaler(IWDG_Prescaler_32);

//1KHz

IWDG_SetReload(1000);

(3)将重装载值装入计数器(喂狗)

void IWDG_ReloadCounter(void);

(4)启动看门狗

void IWDG_Enable(void);

6.窗口看门狗

窗口看门狗常用来保证某个操作必须在指定的时间范围内完成,基本原理和独立看门狗类似,区别是对喂狗时间进行了限制。

//看门狗编程实现

include <stm32f4xx.h>
#include <iwdg.h>

void iwdg_init(void)
{
	//1.关闭寄存器写保护
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
	
	//2.设置周期 1s
	IWDG_SetPrescaler(IWDG_Prescaler_32);//1KHz
	IWDG_SetReload(1000);
	
	//3.喂狗
	IWDG_ReloadCounter();
	
	//4.启动看门狗
	IWDG_Enable();
}

猜你喜欢

转载自blog.csdn.net/weixin_44651073/article/details/125708401