5.stm32看门狗

1. STM32-独立看门狗IWDG剖析

2. STM32-独立看门狗实例讲解

3. STM32-窗口看门狗WWDG剖析

4. STM32-窗口看门狗实例讲解

一.基础原理

1. 简单理解:

        使用LSI(外部低速时钟),计数,及时喂狗不会复位(看门狗没有减到0喂狗,就认为程序正常工作),不及时喂狗就会导致复位.

2. 看门狗用途

         它的主要功能是在发生系统软件故障时,将系统复位。也可以用于将系统从休眠或空闲模式唤醒。

3.看门狗分类

        (1)STM32 结合安全度、计时精确度和易用性提供了IWDG和WWDG两种看门狗

           监测软件跑飞,或未按预想地运行的情况        

           触发系统复位或产生中断(中断仅针对窗口看门狗)

        (2)独立看门狗IWDG      

           专用时钟LSI       低功耗模式仍可运行      

           对定时的控制比较松 

        (3)窗口看门狗WWDG      

           总线时钟APB1      对定时控制比较严  

           要求主应用程序在规定时间窗口内喂狗

4.看门狗的原理图分析

 注意:看门狗使用LSI,特殊的定时器,固定32KHZ

二.独立看门狗实验一:IWDG

1. 实验要求:

        开启STM32的独立看门狗,按键按下即喂狗,如果超时未喂狗,则看门狗复位系统,用指示灯指示系统复位

2.cubemx创建项目

(1)RCC使用外部晶振,固定配置:目的->项目运行速度最快

IWDG:打开

USART1:打开

按钮,灯:打开

 IWDG配置:

(2)步骤:

mian.c中

<1>while(1){}前

/*
set为高电平,reset为低电平
*/
printf("I am coming \n");
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET);	

<2>while(1){}中

if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)==GPIO_PIN_RESET){
//独立看门狗的喂狗
HAL_IWDG_Refresh(&hiwdg);
}

<3>实验结果

3s左右没有复位(key6按下),看门狗复位,灯先灭后亮,及时喂狗后灯常亮.


三.stm32窗口看门狗WWDG

1.原理分析

 2.适用情况

 3.原理图分析

 4.看门狗的时钟

连在在APB1上,频率42KHZ

5.注意:

        窗口看门狗的计数器是一个递减计数器,共有 7 位,其值存在控制寄存器 CR 的位 6:0, 即 T[6:0],当 7 个位全部为 1时是 0X7F,这个是最大值

        当递减到 T6 位变成 0时,即从0X40 变为 0X3F时候,会产生看门狗复位。这个值 0X40 是看门狗能够递减到的最小值,

         当递减计数器递减到 0X40 的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR 位 9 EWI 置 1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了,

        那么在提前唤醒中断的处理程序中我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。

 四.实验二:窗口看门狗的实验

1.实验要求

        开启STM32的窗口看门狗,并使能唤醒中断。主程序正常运行时喂狗,用按键中断模拟程序故障死机,此时将触发唤醒中断并产生复位,用LED灯指示唤醒中断的触发。

2.cubemx创建工程

(1)key6设为中断(GPIO_EXPI0),中断就可以看作异常,我们按键按下模拟死机,窗口看门狗复位

(2)PF7(灯)设为输出,RCC设为外部高频时钟

(3)WWDG看门狗设置

 

 原因:看门狗中断要大于按键中断,才可以进行复位

3.步骤:

(1)main.c中

HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_SET);  //熄灭灯

uint8_t wr, tr;

wr = WWDG->CFR & 0x7f ;   //获取设置的上窗口值

while(1){
		
        tr = WWDG->CR & 0x7f;//获取实时的寄存器值
		
		if(tr < wr)    //计数器的值小于上窗口的值,进行喂狗
		
        {
			
        HAL_WWDG_Refresh(&hwwdg);  //喂狗(Hal库找)
		
        }

}

(2)按键中断的回调函数

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
	if(GPIO_Pin==GPIO_PIN_0){
		printf("程序故障\n");
		while(1){}    //死循环模拟故障
	}
}

(3)窗口看门狗的回调函数

void HAL_WWDG_EarlyWakeupCallback(WWDG_HandleTypeDef* hwwdg)
{
	HAL_GPIO_WritePin(GPIOF, GPIO_PIN_7, GPIO_PIN_RESET);  //灯亮
	
	printf("EarlyWakeup INT\n");
}

注意:<1>由于窗口看门狗运行时间很短,所以printf还没有打印完就结束了

<2>灯RESET为低电平,低电平为亮

4.结果

按键按下中断,灯灭,看门狗复位,灯亮.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值