打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
看门狗的学习与应用

为什么要看门狗?

在单片机构成的微型计算机系统中,由于单片机的工作容易受到来自外界电磁场的干扰,导致程序跑飞,陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果。
所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的模块或者芯片,俗称“看门狗”(watchdog) 。
在启动正常运行的时候,若系统不能复位,或者在系统跑飞(程序异常执行)的情况下,看门狗可以触发系统复位,程序重新执行。

STM32F10x看门狗

STM32F10x 内置 两个看门狗
提供了更高的安全性、时间的精确性和使用的灵活性。
两个看门狗设备(独立看门狗和窗口看门狗)可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。

  1. 独立看门狗(IWDG)由专用的低速时钟(LSI)驱动,即使主时钟发生故障它也仍然有效。

  2. 窗口看门狗由从APB1时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的操作。
    看门狗应用场景

  3. 独立看门狗使用专用的低速时钟(LSI)驱动),适合应用于需要看门狗作为一个在主程序之外 能够完全独立工作,并且对时间精度要求低的场合。

  4. 窗口看门狗从APB1时钟分频后得到时钟驱动,最适合那些要求看门狗在精确计时窗口起作用的程序。

独立看门狗

1、独立看门狗基本原理
  1. 在键值寄存器(IWDG_KR)中写入0xCCCC,开始启用独立看门狗。

  2. 此时计数器开始从其复位值0xFFF递减,当计数器值计数到尾值0x000时会产生一个复位信号(IWDG_RESET)。

  3. 无论何时,只要在键值寄存器IWDG_KR中写入0xAAAA(通常说的喂狗), 自动重装载寄存器IWDG_RLR的值就会重新加载到计数器,从而避免看门狗复位。

  4. 如果程序异常,就无法正常喂狗,从而系统复位

2、独立看门狗计时周期

时钟频率为40khz,若选择: 预分频 4 ,重转载值0xFFF
最长时间:1s / (40000hz /4) * 0x1000 * 1000 = 409.6ms

3、独立看门狗配置步骤
  • 取消寄存器写保护:0x5555使能
    void IWDG_WriteAccessCmd(uint16_t IWDG_WriteAccess);

  • 设置独立看门狗的预分频系数,确定时钟,写PR
    void IWDG_SetPrescaler(uint8_t IWDG_Prescaler);

  • 设置重装载值:确定溢出时间,写RLR
    void IWDG_SetReload(uint16_t Reload);

  • 使能看门狗:写0xCCCC到KR
    void IWDG_Enable(void);

  • 喂狗:写0xAAAA到KR
    void IWDG_ReloadCounter(void);

  • 获取状态:重装载/预分频 更新
    FlagStatus IWDG_GetFlagStatus(uint16_t IWDG_FLAG);

4、独立看门狗代码部署

5、独立看门狗测试例程

代码部署如下:
喂狗标志为0时,不执行喂狗,系统一直复位;
喂狗标志不为0时,执行喂狗,系统正常运行;

int sign; //喂狗标记
int main(void)
 {              
        IWDG_Init(4,625);    //与分频数为64,重载值为625,溢出时间为1s  
        while(1)
        {
                if(sign != 0)
                {
                        IWDG_Feed();//如果WK_UP按下,则喂狗
                }
        };       
}

在初始化处打断点,
设置sign = 0时,每个一秒重新执行初始化;
再设置sign = 3时,不重新初始化,正常运行;
重新设置sign = 0时,重新执行初始化;

窗口看门狗

1、窗口看门狗概念

窗口看门狗,之所以称为窗口是因为其喂狗时间是一个有上下限的范围(窗口),喂狗的时间不能过早也不能过晚。(上限:0x7FH-0x40H,下限:0x3FH,若上限值小于0x3FH,则无窗口直接复位


使用窗口看门狗,可以根据预测的程序正常执行的时间设置刷新看门狗的时间窗口,保证不会提前刷新看门狗也不会滞后刷新看门狗,就可以检测程序是否正常运行,非正常地跳过某些程序段的情况。

2、窗口看门狗触发条件
  1. 当喂狗的时候如果计数器的值大于某一设定数值W[6:0]时,此设定数值在WWDG_CFR寄存器定义。

  2. 当计数器的数值从0x40减到0x3F时【T6位跳变到0】

3、窗口看门狗计时周期

PCLK1 = 36MHZ,若WDGTB = 0,则:
最长时间:1000ms / (36000000hz) * 4096 * 2 º * (0x3F +1) = 7.2818ms

4、窗口看门狗配置步骤
  • 使能看门狗时钟
    RCC_APB1PeriphClockCmd();

  • 设置分频系数
    WWDG_SetPrescaler();

  • 设置上窗口值
    WWDG_SetWindowValue();

  • 开启提前唤醒中断并分组(可选)
    WWDG_EnableIT();
    NVIC_Init();

  • 使能看门狗
    WWDG_Enable();

  • 喂狗
    WWDG_SetCounter();

  • 编写中断服务函数
    WWDG_IRQHandler();

5、窗口看门狗代码部署


6、测试现象如下:

注释 main 中 while 内的喂狗部分代码,通过 “Record”获取喂狗计数值。
“WWDG_IRQHandler” 在计数值为 0x40时触发。
由于监视窗口刷新问题,可知 “Record”至少为 266369 ;


则开放 main 中 while 内的喂狗部分代码,将“sign”设为50000(小于Record值,没有标准计时,故测试了几个值,需要保证喂狗时,看门狗计数值在窗口值与0x3F之间,选择合适的50000),进行喂狗,则不触发看门狗中断,也不进行复位。此时修改sign为20000,过早喂狗,相当于程序运行不正常,系统复位初始化;


结合上两个实验,在窗口值与0x3FH之间进行喂狗,才可以保证程序正常运行;程序异常,导致过早或过晚喂狗,那么系统进行复位。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
汪汪汪WDG
STM32看门Dog
IWDG和WWDG分析
STM32双看门狗
STM32 看门狗详解
stm8的独立看门狗与窗口看门狗
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服