打印
[疑难问答]

看门狗定时器

[复制链接]
97|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jackcat|  楼主 | 2025-4-16 11:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一般来说,看门狗我们也叫他看门狗定时器,从本质上面来看,其实它就是一个计数器,在使用的时候,我们需要给它一个数值,随后看门狗的计数器根据计数方向开始累计,在看门狗的计数器达到预设的数值之前,我们可以进行重置看门狗计数器的操作,简称“喂狗”。但当我们没有在计数器发生溢出之前进行及时喂狗的话,看门狗就会产生复位请求或者不可屏蔽中断请求(NMI-Non Maskable Interrupt)。

瑞萨R2E1
瑞萨R2E1的看门狗模块包括2个32位计数器, CNT 和 RST。CNT 计数器用于记录内部时钟计数, RST 计数器用于记录看门狗超时时间。当CNT 计数器的计数值达到 RST 计数器的值时,看门狗硬件将自动产生复位信号,重置系统。这个复位可以参考:单片机——复位操作详述

瑞萨R2E1看门狗模块的主要特点如下:

精度高:R2E1 的看门狗模块精度高,超时时间可设置为 0.16 秒到 8192 秒,同时还支持极精准的微秒级超时时间。


配置灵活:R2E1 看门狗模块具有多种配置模式,支持溢出、时间窗口等模式选择,并且在不同模式下还可设置不同的超时时间。


系统保护:看门狗模块可以保护系统在异常情况下的稳定运行,当系统出现死循环、死机等情况时,看门狗硬件可以及时地产生复位信号,重启系统。


低功耗:R2E1 看门狗模块具有低功耗特性,可以有效地提高系统电量使用效率。


值得注意的是,看门狗模块虽然可以保护系统运行,防止死机现象,但也可能带来一定的安全风险。如果看门狗定时器设置过短,容易误判系统出现问题,直接重启系统。因此,在设计系统时,需要认真选取看门狗超时时间,并采用恰当的检测机制,确保其能够正确地监控系统状态,而不会对系统的正常运行产生负面影响。

具体实现
硬件方面,看门狗模块一般由一个计数器和一个输出/复位电路组成,计数器每隔一定时间加1,如果系统正常运行,软件会在计数器加1的过程中定时清除计数器的值,这样可以保证计数器一直处于计数中,当系统出现故障导致软件不能正常清除计数器时,当计数器的计数值达到预先设定的阈值时,输出/复位电路会将系统复位,重启系统,从而达到保护系统的效果。

软件方面,看门狗模块需要由程序员编写相应的代码实现,具体过程如下:

初始化看门狗模块,包括设置看门狗定时器的超时时间和模式等参数。
在主程序中定时清除看门狗定时器计数器的值,以免定时器超时导致系统复位。
若代码进入死循环等非正常状态,导致主程序无法正常执行,程序无法清除看门狗计数器的值,看门狗定时器会在特定时间后超时,产生复位信号,重启系统。
在软件中加入容错机制,保证程序正常运行,如加入异常处理代码,避免程序出错导致系统复位。


#include "r2e1.h"



WDT.WTCNT = WDT_CNT_VALUE;     //设置看门狗计数值

WDT.WTCSR.BIT.OVFINT = 0;      //禁止溢出中断

WDT.WTCSR.BIT.WTIT = 0;        //禁止计数器超时中断

WDT.WTCSR.BIT.WOVWE = 0;       //禁止写入看门狗计数器

WDT.WTCSR.BIT.WTIS = 2;        //设置看门狗计数器时钟源



WDT.WTCSR.BIT.CNTCLR = 1;   //定时清除计数器的值



#pragma interrupt INTWDTI(vect=VECT_WDTI)

void INTWDTI(void)

{

   WDT.WTCSR.BIT.CNTCLR = 1; //定时清除计数器的值

}



WDT.WTCSR.BIT.WDTE = 0;   //关闭看门狗模块

当看门狗定时器达到预设的超时时间时,会产生看门狗中断,并自动复位系统。同时也可以通过设置看门狗模块的 RSTEN 位实现看门狗产生复位信号直接重启系统。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

1647

帖子

0

粉丝