18 WDT 看门狗定时器实验

开发板官网(https://www.edevkit.com/)
本系列教程目录:
- 瑞萨单片机开发教程[一] e2-studio + DAP LINK开发环境搭建
- 瑞萨单片机开发教程[二] Keil/RASC开发环境搭建
- 瑞萨单片机开发教程[三] 新建RASC工程
- 瑞萨单片机开发教程[四] GPIO输出——led实验
- 瑞萨单片机开发教程[五] GPIO输入——按键key实验
- 瑞萨单片机开发教程[六] ICU外部中断实验
- 瑞萨单片机开发教程[七] SCI UART串口通信实验
- 瑞萨单片机开发教程[八] DMAC 串口数据传输实验
- 瑞萨单片机开发教程[九] ADC 电压采集实验
WDT 看门狗定时器实验
本章目标:
- 了解 RA6M5 处理器的看门狗定时器及其工作原理;
- 学会使用 RASC 配置看门狗定时器、API 函数;
硬件设计
(略,参见配套硬件原理图)
软件设计
新建工程
复制一份“04 GPIO_led”修改文件夹名“18 WDT”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 wdt.c 和 wdt.h,保存到目录下的 src 文件夹下。
FSP 配置
Keil 界面选择“Tools”→“RA Smart Configurator”打开 RASC 界面。
添加 WDT Stack 模块。

设置 WDT 属性

设置 WDT 的启动方式

- Start Mode Select:WDT 启动模式选择
- Timeout Period:WDT 计数周期值
- Clock Frequency Division Ratio:WDT 时钟分频系数(4/64/128/512/2048/8192)
- Window End Position:窗口监测结束位置,默认 0%,没有结束位置
- Window Start Position:窗口监测开始位置,默认 100%,没有开始位置
- Reset Interrupt Request:选择触发复位的中断请求(NMI 或 Reset)
- Stop Control:停止对 WDT 控制的条件
PCLKB 时钟 50 MHz,设置分频 8192,设置循环周期 16384,则看门狗频率 50 MHz / 8192 ≈ 6.103 kHz,周期时间 1 / 6.103 kHz ≈ 163.85 μs,最大超时时间 163.85 μs × 16384 ≈ 2.68 s。
配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击“Generate Project Content”按钮,让软件自动生成配置代码即可。
程序设计
开启看门狗功能,看门狗配置的最大喂狗时间是 2.68 秒,程序初始化后亮灯 3 秒后,在循环中每 0.5 秒翻转 LED 快闪代表程序正常运行,每隔 1 秒喂狗操作,计数喂狗十次后也就是 10 秒后停止喂狗,进入 NMI 中断软件重启程序,观察现象。
- 打开 WDT 设备
R_WDT_Open(wdt_ctrl_t * const p_ctrl, wdt_cfg_t const * const p_cfg);
- 刷新 WDT,也就是喂狗操作
R_WDT_Refresh(wdt_ctrl_t * const p_ctrl);
此函数会更新 WDT 的 14 位计数器,让它从初始值开始递减;
- WDT NMI 中断
void wdt_NMI_callback (wdt_callback_args_t * p_args)
当喂狗超时后会进入中断,一般代表程序出现问题卡死,跑飞等,执行软件重启操作重启设备。
程序编写
在 wdt.h 头文件里定义初始化函数、喂狗函数。
#ifndef BSP_WDT_H_
#define BSP_WDT_H_
#include "hal_data.h"
void wdt_Init(void);
void wdt_FeedDog(void);
#endif
在 wdt.c 里实现初始化函数、中断函数和喂狗函数。
#include "wdt.h"
//初始化
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 wdt_FeedDog(void)
{
R_WDT_Refresh(&g_wdt0_ctrl);
}
// NMI中断回调
void wdt_NMI_callback(wdt_callback_args_t * p_args)
{
(void) p_args;
//软件复位MCU
__NVIC_SystemReset();
}
在 hal_entry.c 文件中添加头文件 wdt.h,在 hal_entry 入口函数初始化 WDT。
uint16_t feedCnt = 0;
void hal_entry(void)
{
/* TODO: add your own code here */
led_Init();
key_Init();
//开机led亮3秒
LED1_ON();
R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_SECONDS);
//开启看门狗
wdt_Init();
while(1)
{
LED1_TOGGLE();
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
feedCnt++;
if(feedCnt % 2 == 0 && feedCnt < 20)
{
//每秒喂狗,执行10次后不再喂狗
//10s后,则会进入NMI中断重启程序
wdt_FeedDog();
}
else if(feedCnt > 30)
{
feedCnt = 0;
}
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
下载验证
连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完成后,观察实验结果。
开机 LED 灯会亮 3 秒,进入循环后 LED 每 500 ms 翻转,在 10 秒之后程序重启重复操作:LED 先亮 3 秒,进入循环 500 ms 翻转。
前 10 秒在循环中每秒会喂狗,程序正常运行,10 秒后停止喂狗会进入 NMI 中断,中断中执行软件重启。