• 【STM32】看门狗


    STM32】看门狗

    看门狗简介

    看门狗起始就是一个定时器,从功能上说它可以让微控制器在程序发生意外(程序进入死循环或跑飞)的时候,能重新恢复到系统刚上电状态,以保障系统出问题的时候可以重启一次。说的简单一点,看门狗就是能让程序出问题时能重新启动系统。STM32有两个看门狗,独立看门狗和窗口看门狗。

    独立看门狗(Independent Watchdog,IWDG)

    独立看门狗号称宠物狗,它有一个12位的递减计数器,当计数器的值从某个值一直减到0的时候,系统就会产生一个复位信号,即IWDG_RESET。如果在计数器没有减到0之前,刷新了计数器的值,那么就不会产生复位信号,这个动作就是我们经常说的喂狗。

    独立看门狗时钟

    独立看门狗的时候由独立的RC振荡器LSI提供,即使主时钟发生故障它仍然有效,非常独立。LSI的频率一般在30~60KHz之间,所以独立看门狗的定时时间并不一定非常准确,只适用于对时间精度要求比较低的场合。

    在这里插入图片描述

    上图中,配置的IWDG时钟CK_IWDG=32KHz。

    独立看门狗计数器时钟

    递减计数器的时钟由LSI经过一个8位的预分频器得到,我们可以操作预分频器寄存器IWDG_PR来设置分频因子,分频因子可以是:[4,8,16,32,64,128,256],计数器时钟CK_CNT=CK_IWDG/IWDG_PR。

    重装载寄存器

    重装载寄存器是一个12位的寄存器,里面装着要刷新到计数器的值,这个值的大小决定着独立看门狗的溢出时间。超时时间Tout=1/CK_CNT*rlv,rlv是重装载寄存器的值。

    在这里插入图片描述

    如上图的配置,IWDG_PR=32,rlv=2000,所以CK_CNT=32KHz/32=1KHz,Tout=1/1000*2000=2s。意味着2s之内我们就得喂狗,不然系统就会重启。

    关于喂狗时机,作者本人习惯在单独的线程中间隔执行,一般就是呼吸灯线程中喂狗。

    void StartBreathingLightTask(void* argument)
    {
        /* USER CODE BEGIN StartBreathingLightTask */
        /* Infinite loop */
        hp_printf("%s", __func__);
        for(;;)
        {
            HAL_IWDG_Refresh(&hiwdg1);
            HAL_GPIO_TogglePin(Breathing_Light_GPIO_Port, Breathing_Light_Pin);
    			  osDelay(1000);
        }
        /* USER CODE END StartBreathingLightTask */
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    窗口看门狗(Window Watchdog,WWDG)

    窗口看门狗号称警犬,它也有一个递减计数器不断的往下递减计数,当减到一个固定值0x40时还不喂狗的话,就会产生复位,这个值叫窗口的下限,是固定值,不能改变。不同的是,窗口看门狗的计数器在减到某一个数之前喂狗也会产生复位,这个值叫窗口的上限,上限值由用户独立设置。窗口看门狗计数器的值必须在上窗口和下窗口之间才可以喂狗,这就是窗口看门狗中窗口两个字的含义。

    窗口看门狗时钟

    WWDG时钟由APB时钟经预分频后提供。例如在H743平台上,WWDG1外设在APB3总线上。

    在这里插入图片描述
    在这里插入图片描述

    窗口看门狗计数器时钟

    计数器时钟由 CK 计时器时钟经过预分频器分频得到,计数器时钟CK_CNT=CK_IWDG/4096/IWDG_PR。为什么要除以4096是手册规定的。

    在这里插入图片描述

    计数器

    窗口看门狗的计数器是一个递减计数器,共有 7 位,其值存在控制寄存器 CR 的位 6:0,即 T[6:0],当 7 个位全部为 1 时是 0X7F,这个是最大值,当递减到 T6 位变成 0时,即从0X40 变为 0X3F时候,会产生看门狗复位。这个值 0X40 是看门狗能够递减到的最小值,所以计数器的值只能是:0X40~0X7F之间,实际上用来计数的是 T[5:0]。当递减计数器递减到 0X40 的时候,还不会马上产生复位,如果使能了提前唤醒中断:CFR 位 9 EWI 置 1,则产生提前唤醒中断,如果真进入了这个中断的话,就说明程序肯定是出问题了,那么在中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。

    窗口值

    出问题了,那么在中断服务程序里面我们就需要做最重要的工作,比如保存重要数据,或者报警等,这个中断我们也叫它死前中断。

    窗口值

    窗口值具体要设置成多大?这个得根据我们需要监控的程序的运行时间来决定。如果我们要监控的程序A运行时间位Ta,当执行完这段程序之后就要进行喂狗,如果在窗口时间内没有喂狗的话,那程序就肯定是出问题了。一般计数器的值TR设置成最大0x7F,窗口值为WR,计数器减一个数的时间为T,那么时间:(TR-WR)*T应该稍微大于Ta即可,这样就能做到刚执行完程序段A之后喂狗,起到监控的作用,这样也就可以算出WR的值是多少。

  • 相关阅读:
    代码随想录训练营二刷第四十四天 | 01背包问题 416. 分割等和子集
    线性表顺序表综合应用题P18
    护网(HVV)技术详解:网络安全演习的核心技能要求
    ultraEdit正则匹配多行(xml用)
    超详细:ARM64 汇编实现 C 标准库中的 memset() 函数
    使用 Typescript 封装 Axios
    限流器设计思路(浅入门)
    「高效程序员的修炼」快速上手高效开发利器 Visual Studio Code (VS Code)
    ABAP-VL02N修改交货单外部标识BAPI
    素描的正方体怎么绘制面
  • 原文地址:https://blog.csdn.net/zhudaokuan/article/details/133684428