STM32F407的看门狗

看门狗时钟

两种看门狗

  • 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它仍有效。
    独立看门狗适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。
  • 窗口看门狗由从APB1时钟分频后得到时钟驱动。通过可配置的时间窗口来检测应用程序非正常的过迟或过早操作。
    窗口看门狗最适合那些要求看门狗在精确计时窗口起作用的程序。

IWDG结构图

在这里插入图片描述

作用

IWDG Independent watch door dog独立看门狗

  • STM32 的独立看门狗由内部专门的 40Khz 低速时钟驱动,即使主时钟发生故障,它也仍然有效。
  • 单片机系统在的干扰下会出现程序跑飞的现象导致出现死循环,看门狗电路就是为了避免这种情况的发生。看门狗的作用就是在一定时间内(通过定时计数器实现)没有接收喂狗信号(表示 MCU 已经挂了),便实现处理器的自动复位重启(发送复位外界信号)
  • 结果:在程序跑飞之后,系统复位,程序重新运行。

寄存器

IWDG_KR键值寄存器

在这里插入图片描述
开启IWDG

  • 键值寄存器(IWDG_KR)中写入 0xCCCC,开始启用独立看门狗
    • 此时计数器开始从其复位值 0xFFF 递减计数。
    • 当计数器计数到末尾 0x000 时,会产生一个复位信号(IWDG_RESET)。
    • 只要键寄存器 IWDG_KR 中被写入 0xAAAA, IWDG_RLR 中的值就会被重新加载到计数器中从而避免产生看门狗复位 。

IWDG_PR预分频寄存器

F407中文参考手册18.4.2
在这里插入图片描述
该寄存器用来设置看门狗时钟的分频系数。

2-0 PR预分频器系数

在这里插入图片描述

IWDG_RLR重装载寄存器

该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32位寄存器,但是只有低 12 位是有效的。

IWDG_SR状态寄存器

在这里插入图片描述

1RVU 重载值更新

在这里插入图片描述

0 PVU 预分频值更新

在这里插入图片描述

注意

在这里插入图片描述

写保护

F407中文参考手册18.3.2
在这里插入图片描述

IWDG 在一旦启用,就不能再被关闭!想要关闭,只能重启

独立看门狗相关的库函数和定义分布在文件 stm32f10x_iwdg.h 和stm32f10x_iwdg.c 中

超时时间

在这里插入图片描述
溢出时间计算:
Tout=((4×2^prer) ×rlr) /32 (M4)

使用步骤

取消寄存器 写保护

(向 IWDG_KR 写入 0X5555 )

IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);

设置预分频系数和重装载值

设置看门狗的分频系数的函数是

void IWDG_SetPrescaler(uint8_t IWDG_Prescaler); //设置 IWDG 预分频值

设置看门狗的重装载值的函数是:

void IWDG_SetReload(uint16_t Reload); //设置 IWDG 重装载值

看门狗溢出时间(单位为 ms)

Tout=((4×2^prer) ×rlr) /32

  • prer 为看门狗时钟预分频值(IWDG_PR 值),范围为 0~7
  • rlr 为看门狗的重装载值(IWDG_RLR 的值)
  • 40/(4*2^prer)是频率,反之即为时间,与计数值相乘为总时间。若总时间为1s,可以设prer是4,则(64/32)*500ms合适
  • 这里需要提醒大家的是,看门狗的时钟不是准确的 40Khz,所以在喂狗的时候,最好不要太晚了

喂狗

(向IWDG_KR 写入 0XAAAA )
库函数里面重载计数值的函数是:

IWDG_ReloadCounter(); //按照 IWDG 重装载寄存器的值重装载 IWDG 计数器

启动看门狗

(向 向 IWDG_KR 写入 0XCCCC)
库函数里面启动独立看门狗的函数是:

IWDG_Enable(); //使能 IWDG

程序

主程序

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);  //初始化延时函数
	LED_Init();				//初始化LED端口
	KEY_Init();		  	//初始化按键
  delay_ms(100);    //延时100ms 
	IWDG_Init(4,500); //与分频数为64,重载值为500,溢出时间为1s	
	LED0=0;					  //先点亮红灯
	while(1)
	{
		if(KEY_Scan(0)==WKUP_PRES)//如果WK_UP按下,则喂狗
		{
			IWDG_Feed();//喂狗
		}
		delay_ms(10);
	};

}

函数

//初始化独立看门狗
//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)
{
	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
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万码无虫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值