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.结果
按键按下中断,灯灭,看门狗复位,灯亮.