STM32F4X 独立看门狗 IWDG

STM32F4X 独立看门狗 IWDG

  • 什么是看门狗
  • STM32F4X 独立看门狗的使用
    • 独立看门狗时钟源
    • 独立看门狗寄存器
      • 关键字寄存器
      • 预分频器寄存器
      • 重载寄存器
      • 状态寄存器
    • 独立看门狗计数频率计算
    • 独立看门狗例程

什么是看门狗

我们都知道,当一个嵌入式在运行过程中发生死机或者程序跑飞的情况的时候,我们一般都是要手动进行开关机或者复位,让程序能够重新运行。但是当一个嵌入式系统被安装到一些特殊位置时,如果发生了死机又不能及时进行手动复位,这时候就需要看门狗了。看门狗的作用就是监控嵌入式系统的运行情况,如果系统出现死机或者程序跑飞时,就会自动复位系统,无需人为干预。

STM32F4X 独立看门狗的使用

独立看门狗时钟源

在数据手册上我们可以看到,STM32F4X的独立看门狗的时钟源是用LSI内部32K时钟源。
在这里插入图片描述

独立看门狗寄存器

关键字寄存器

STM32F4X 独立看门狗 IWDG_第1张图片
关键字寄存器主要是通过配置不同的键值来设置独立看门狗的功能。

  • 0xAAAA:重新写入重装载值到重装载寄存器,用于喂狗
  • 0x5555:使能对PR和RLR寄存器的访问
  • 0xCCCC:启动独立看门狗

预分频器寄存器

设置独立看门狗的预分频值
STM32F4X 独立看门狗 IWDG_第2张图片

重载寄存器

设置独立看门狗的计数值
STM32F4X 独立看门狗 IWDG_第3张图片

状态寄存器

判断独立看门狗的状态
STM32F4X 独立看门狗 IWDG_第4张图片
可以看到独立看门狗其实跟普通定时器的原理是一样的,也是通过设置一个频率,然后不停地进行计数。不同的是独立看门狗当计数值超过设定值时,如果我们不进行喂狗,就会复位系统,需要注意的是,看门狗一旦启动就不能停止,只能通过复位或掉电停止。

独立看门狗计数频率计算

独立看门狗的计数频率其实跟普通定时器的计算是一样的。假设独立看门狗的时钟源为32KHZ,预分频为64分频,重载值设为1000。那么独立看门狗的溢出时间可以这样计算。
Tout = ( 1 / (32000 / 64)) * 1000 = 2s
也就是独立看门狗的溢出时间是2s,当这2秒内我们不进行喂狗的话,独立看门狗就会复位系统。

独立看门狗例程

在例程中会将看门狗的复位时间设置成3秒。在main函数中会先以500ms的频率进行10次喂狗,喂狗次数大于10次之后就停止喂狗,看门狗就会在3秒后复位系统。

#include "iwdt.h"
void bsp_iwdg_init(void)
{
	IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); // 使能看门狗寄存器写
	
	IWDG_SetPrescaler(IWDG_Prescaler_64); // 设置预分配为64 也就是 1 / (32000 / 64) = 2ms
	
	IWDG_SetReload(1500); // 计1500个数
	
	IWDG_ReloadCounter(); // 重新写入重装载值到重装载寄存器,用于喂狗
	
	IWDG_Enable(); // 使能看门狗,一旦使能就不能停止
}

void IWDG_Feed(void)
{
	IWDG_ReloadCounter();// 重新写入重装载值到重装载寄存器,用于喂狗
}

int main(void)
{
	int cnt = 10;
	NVIC_PriorityGroupConfig(2);
	system_tick_init();
	
	bsp_usart_init(115200);
	bsp_iwdg_init();
	printf("system init...\r\n");
  while(1){
		while(cnt-- > 0)
		{
			IWDG_Feed();
			delay_ms(500); // 每隔500ms喂一次狗,防止复位
		}	
		printf("看门狗将在3秒后复位\r\n");
		delay_ms(1000);
		printf("看门狗将在2秒后复位\r\n");
		delay_ms(1000);
		printf("看门狗将在1秒后复位\r\n");
		delay_ms(1000);
	}
  
}

STM32F4X 独立看门狗 IWDG_第5张图片

你可能感兴趣的:(STM32学习,stm32,嵌入式硬件,单片机)