一文带你搞懂看门狗

1 看门狗基础知识

 1.1 看门狗的概念

    看门狗(WDT)是一个定时器,开启看门狗定时器之后(比如定时100ms),在单片机程序中每隔一段时间(小于100ms)就要"喂狗"一次,即将看门狗定时器清零。这样做的用处是,一旦单片机程序跑飞,没有在定时的时间之内去喂狗,那么定时达到200ms时,看门狗自动将单片机复位。

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

    根据功能不同,通常分为独立看门狗和窗口看门狗。因为独立看门狗受工作场合因素的影响会多一点,仅适用于一些对时间精度要求较低的场合;窗口看门狗适用于对时间精度高的场合。

1.2 独立看门狗(IWDG)

 1.2.1 IWDG简介

     独立看门狗本质上是一个定时器,这个定时器有一个输出端,可以输出复位信号。该定时器是一个 12 位的递减计数器,当计数器的值减到 0 的时候,就会产生一个复位信号。如果在计数没减到 0 之前,重置计数器的值的话,那么就不会产生复位信号,这个动作我们称为喂狗。 看门狗功能由 VDD 电压域供电,在停止模式和待机模式下仍然可以工作。
IDWG 框图

    

       从 IWDG 框图整体认知就是, IWDG 有一个输入(时钟 LSI ),经过一个 8 位的可编程预分
频器提供时钟给一个 12 位递减计数器,满足条件就会输出一个复位信号。STM32F103 的独立看门狗由内部专门的 40Khz 低速时钟(LSI)驱动,即使主时钟发生故障,它也仍然有效。这里需要注意独立看门狗的时钟是一个内部 RC 时钟,所以并不是准确的40Khz,而是在 30~60Khz 之间的一个可变化的时钟,只是我们在估算的时候,以 40Khz 的频率来计算,看门狗对时间的要求不是很精确,所以,时钟有些偏差,都是可以接受的。

1.2.2 IWDG寄存器

       IDWG主要用到三个寄存器,一个预分频寄存器(IWDG_PR),键寄存器(IWDG_KR),重载寄存器(IWDG_RLR)。

键寄存器(IWDG_KR)

       键寄存器是独立看门狗的控制寄存器。下面是使用其的规则:

    1. 写入0xCCCC,开始启用独立看门狗,计数器开始从复位值0xFFF递减计数,当计数器计数到0x000时开始产生复位信号。

    2. 写入0xAAAA,IWDG_RLR中的值会被加载到计数器中从而避免复位。

    3. 需要先写入0x5555,IWDG_PR和IWDG_RLR的值才能修改,如果将其他值写入这个寄存器将会打乱操作顺序,寄存器将会重新被保护。

    

  预分频寄存器(IWDG_PR)
      

    

       该寄存器用来设置看门狗时钟( LSI )的分频系数,最低为 4 ,最高位 256 ,该寄存器是一个 32 位的寄存器,但是我们只用了最低 3 位,其他都是保留位。 
重载寄存器(IWDG_RLR)
       该寄存器用来保存重装载到计数器中的值。该寄存器也是一个 32 位寄存器,只有低 12 位 是有效的。

1.2.3 独立看门狗的溢出时间计算

  T_{out} = (4 * 2^{per} * rlr ) / f_{clk}
        其中, T_{out}为看门狗溢出时间(单位为ms)
        per为看门狗时钟分频值,范围为0~7, 4 * 2^{per}为总的分频,比如per为4,则分频系数为64.
        rlr为看门狗时钟重装载值。
        比如我们设定的per值为4,则预分频系数为64,stm32的看门狗时钟为为40khz,如果需要得到溢出时间为1s,则可以算出rlr为625,这时候只要在1s内写入0xAAAA到IWDG_KR,就不会导致看门狗复位。这里需要提醒大家的是,看门狗的时钟不是准确的 40Khz,所以在喂狗的时候,最好不要太晚了,否则,有可能发生看门狗复位。

1.2.4 独立看门狗的配置步骤

     1. 取消寄存器保护,向键寄存器写入0x5555, 然后设置预分频系数和重装载值。
     2. 在键寄存器写入0xCCCC,开始启动看门狗,计数器从0xFFF开始计数。
     3. 在溢出时间内重载计数值喂狗,把0xAAAA写入到键寄存器,从而触发计数器重载也就是喂狗,否则发生复位。

1.3 窗口看门狗(WWDG)

 1.3.1 WWDG简介

        窗口看门狗(WWDG)通常被用来监测由外部干扰或不可预见的逻辑条件造成的应用程序背离正常的运行序列而产生的软件故障。窗口看门狗跟独立看门狗一样,也是一个递减计数器不同的是它们的复位条件不一样。窗口看门狗产生复位信号有两个条件:

        1) 当递减计数器的数值减到0x40时还不喂狗的时候,到下一个计数0X3F就会产生复位,这个值称为窗口的下限值,这个是固定的值,不能改变。

         2) 当喂狗的时候如果计数值大于看门狗配置寄存器WWDF_CFR的低七位数值,也会产生复位,这个值叫窗口的上限,上限值由用户设置。,这个数值要大于0x40.

1.3.2 WWDG框图

 1.3.3 WWDG寄存器

控制寄存器(WWDG_CR)

        WDGA 位则是看门狗的激活位,该位由软件置 1 ,启动看门狗,并且一定要注意的是该位
一旦设置,就只能在硬件复位后才能清零了。其中 T[6 0] 用来存储看门狗的计数器的值,当计数器的值从0x40变为0x3F的时候将产生看门狗复位。
配置寄存器(WWDG_CFR)
       
       该寄存器中的 EWI 位是提前唤醒中断, 如果该位置 1 ,当递减计数器等于 0x40 时产生提
前唤醒中断,我们就可以及时喂狗以避免 WWDG 复位。 因此,我们一般都会用该位来设置中
断,当窗口看门狗的计数器值减到 0X40 的时候,如果该位设置,并开启了中断,则会产生中
断,我们可以在中断里面向 WWDG_CR 重新写入计数器的值,来达到喂狗的目的。注意这里在
进入中断后,必须在不大于 1 个窗口看门狗计数周期的时间.
状态寄存器(WWDG_SR)
        
        该寄存器用来记录当前是否有提前唤醒的标志。该寄存器仅有位 0 有效,其他都是保留位。
当计数器值达到 0x40 时,此位由硬件置 1。它必须通过软件写 0 来清除。对此位写 1 无效。即
使中断未被使能,在计数器的值达到 0x40 的时候,此位也会被置 1 。 
超时时间
            
         结合寄存器分析窗口看门狗的上限值和下限值。 W[6:0] WWDG_CFR 寄存器的低 7 位,
用于与递减计数器 T[6:0] 比较的窗口值,也就是我们说的上限值,由用户设置。 0x40 就是下限
值,递减计数器达到这个值就会产生复位。 T6 位就是 WWDG_CR 寄存器的位 6 ,即递减计数
T[6:0] 的最高位。
        
       上限值 W[6:0] 是由用户自己设置,但是一定要确保大于 0x40 ,否则就不存在上图的窗口了,
下限值 0x40 是固定的,不可修改。
        知道了窗口看门狗的工作原理,下面学习如何计算窗口看门狗的超时公式:
               T_{WWDG} = (4096 * 2^{WDGTB} * T[0:5])/F_{pclk1}
         其中:
               T_{WWDG}:WWDG超时时间(ms)
               F_{PCLK1}: APB1的时钟频率
               2^{WDGTB}: WWDG_CFR寄存器设置的预分频系数值
               T[0:5]: 是WWDG计数器的低6位
          根据以上公式,假设F_{PCLK1} = 36Mhz,那么可以得到最小-最大超时时间表如下表所示:
                                        

1.3.4 窗口看门狗配置步骤

        1. 使能WWDG时钟,WWDG时钟与IWDG不同,IWDG有自己独立的40kHZ时钟,而WWDG使用的是PCLK1的时钟,需要先使能时钟。

         2. 设置窗口值,分频数和计数器初始值

         3. 开启WWDG,通过设置控制寄存器的WDGA(bit7)位为1实现开启窗口看门狗

         4. 使能中断通道和配置优先级(如果开启了WWDG中断),如果在配置寄存器中将

             EWI 位置1则需要开启中断函数使能并设置相应优先级,并编写相应的中断服务函                 数。

         5.在相应的窗口时间内喂狗,如果使能了中断可以在中断回调函数中进行喂狗,但是

            喂狗要快,否则当窗口看门狗计数器值减到 0X3F 的时候,就会引起软复位了。

1.3 独立看门狗和窗口看门狗的区别 

          1. 独立看门狗没有中断,窗口看门狗有中断。独立看门狗没有中断功能,只要在计数器减到0(下限)之前,重新装载计数器的值,就不会产生复位,窗口看门狗有中断,这个中断的作用是在计数器达到下限0x40的时候,产生中断,让你喂狗;如果你不喂狗,计数器的值变为0x3f的时候,将会产生系统复位;即使是喂狗,也应该在中断里快速喂狗,要不时间长了计数器减1也会变成0x3f产生复位。

           2. 窗口看门狗有上限和下限值,独立看门狗只有下限。窗口看门狗还有一个上限值,这个值如果大于计数器的初始值,那么就没有任何作用了;这个值小于计数器初始值的时候,当计数器的值大于上限值时你对计数器进行装载,将会产生复位,只有在计数器减到小于上限值时,你才能重新装载计数器。意思就是说只有计数器的值在上限值和下限值之间你才能装载计数器,否则就会产生系统复位,当上限值小于下限值,也没有意义。

           3. 独立看门狗是12位递减,独立看门狗从0xFFF开始递减,窗口看门狗的初始值是七位递减,初始值需要自己设置,最大为0x7F.

           4.独立看门狗使用的是内部大约为40kHZ的RC振荡器,窗口看门狗使用的是系统时钟APB1CLK。

            5. 独立看门狗一般用于避免程序跑飞或者死循环,窗口看门狗避免程序不按预定逻辑执行,比如先于理想环境完成,或者后于极限时间超时。

常见面经

1. 什么是嵌入式系统中的看门狗定时器(Watchdog Timer)?

看门狗本质是一个定时器电路,一般有一个输入叫“喂狗”,一个输出连接到MCU的复位端。在MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给看门狗电路清零,如果在超过规定的时间不喂狗,WDT定时超时,就会回给一个复位信号到达MCU,使MCU复位,MCU认为系统故障,会进入中断处理程序或强制系统复位。。

2. 看门狗的作用是什么?

答:在系统跑飞或者系统运行错误后无法喂狗时,看门狗超时重启系统,恢复正常程序逻辑。

3. 看门狗的原理是什么?

看门狗的工作原理:在整个系统运行以后就启动了看门狗的计数器,此时看门狗就开始自动计时,如果到达了一定的时间还不去给它清零,看门狗计数器就会溢出从而引起看门狗中断,造成系统的复位。

4. 窗口看门狗和独立看门狗的区别?

  •  独立看门狗没有中断,窗口看门狗有中断。窗口看门狗可以通过设置配置寄存器的提前唤醒中断位实现在计数器减少到0x40时产生中断,可以通过这个中断实现按时喂狗。
  • 独立看门狗有软件硬件之分,窗口看门狗只能软件控制。
  • 窗口看门狗有上限和下限值,独立看门狗只有下限。独立看门狗计数器减少为0会产生复位,窗口看门狗计数器在窗口上限值(自己设置)和下限值(0x40)内喂狗就不会产生复位。
  • 独立看门狗是12位递减,独立看门狗从0xFFF开始递减,窗口看门狗的初始值是七位递减,初始值需要自己设置,最大为0x7F.
  • 独立看门狗使用的是内部大约为40kHZ的RC振荡器,窗口看门狗使用的是系统时APB1CLK。
  • 独立看门狗一般用于避免程序跑飞或者死循环,窗口看门狗避免程序不按预定逻辑执行,比如先于理想环境完成,或者后于极限时间超时。

链接

嵌入式软件-看门狗测试思路_测试看门狗狗咬时间和喂狗时间-CSDN博客

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值