所谓“WDT”即是指看门狗定时器,从本质上来讲它就是一个计数器,在使用的时候,需要给它一个数值, 随后看门狗的计数器会开始计时,在看门狗计数器达到预设值之前,可执行重置看门狗计数器的操作,简称“喂狗”。 若在计数器发生溢出之前没有及时喂狗的话,看门狗就会产生复位请求或不可屏蔽中断请求。
根据该特点,可防止程序在运行期间跑飞的异常情况发生。
在FPB-RA6E2开发板上要进行WDT功能测试,可利用板载的2个LED灯及按键来测试。
在RASC中对LED引脚P206和P207的配置见图1所示,对按键引脚P304的配置如图2所示。

图1 配置引脚P206

图2 配置按键引脚
为使用WDT,需在栈中添加WDT,见图3和图4所示。

图3 添加WDT

图4完成添加
对WDT的属性配置见图5所示,随后即可生成项目工程。

图5 属性配置
在进入生成的KEIL工程后,需添加的程序如下:
喂狗函数:
void WDT_Feed(void){
//喂狗,刷新递减计数器的值
R_WDT_Refresh(&g_wdt0_ctrl);
}看门狗NMI发生时的中断回调函数:
void wdt_callback (wdt_callback_args_t * p_args){
//防止编译器产生关于函数中没有使用形参的警告
(void) p_args;
//ED1亮,在这里LED灯函数代指实际应用中应该放置重要的函数,如保存重要数据等
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_SECONDS);
// 通过软件复位MCU
__NVIC_SystemReset();
}看门狗初始化函数:
void WDT_Init(void)
{
//如果使用J-Link调试器进行调试的话需要加上这一句话
R_DEBUG->DBGSTOPCR_b.DBGSTOP_WDT = 0;
//初始化看门狗(WDT)模块
R_WDT_Open(&g_wdt0_ctrl, &g_wdt0_cfg);
//刷新看门狗计数器,其作用是初次启动寄存模式下的看门狗计数器,除非是在刷新允许的范围内,否则自启动模式下不应该使用该函数。
R_WDT_Refresh(&g_wdt0_ctrl);
}测试主程序:
void hal_entry(void)
{
R_BSP_PinAccessEnable();
R_BSP_PinWrite(BSP_IO_PORT_02_PIN_06, BSP_IO_LEVEL_LOW);
R_BSP_PinWrite(BSP_IO_PORT_02_PIN_07, BSP_IO_LEVEL_LOW);
R_BSP_PinWrite(BSP_IO_PORT_03_PIN_04, BSP_IO_LEVEL_HIGH);
R_BSP_PinAccessDisable();
//LED2亮3秒
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_06, BSP_IO_LEVEL_HIGH);
R_BSP_SoftwareDelay(3,BSP_DELAY_UNITS_SECONDS);
//初始化看门狗并开启计数器
WDT_Init();
while(1)
{
//LED2灯灭代指实际应该写的需要被WDT监控的程序
R_IOPORT_PinWrite(&g_ioport_ctrl, BSP_IO_PORT_02_PIN_06, BSP_IO_LEVEL_LOW);
if(R_BSP_PinRead(BSP_IO_PORT_03_PIN_04)==BSP_IO_LEVEL_LOW)
{
WDT_Feed();
}
}
}经程序的编译和下载,其测试效果为:
先是点亮LED2,在延时3秒后会熄灭LED2。随后会点亮LED1,表示已发生看门狗NMI事件,经3秒的延时系统将进行复位重启。也就是因为没有及时的喂狗,意味着程序已出现异常被强制重启运行。
而在LED2熄灭后,若按下按键,则强制进行喂狗会导致系统无法进入看门狗NMI事件,即不会出现重启的现象。
我要赚赏金
