19 IWDT 独立看门狗实验

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

设置 IWDT 属性
只需设置名称和中断名称。

下一步配置 OFS0 寄存器参数,切换到 BSP 界面选择“RA6M5 Family”→“OFS0 register settings”。

- Start Mode Select:IWDT 启动模式选择
- Timeout Period:IWDT 计数周期值
- Dedicated Clock Frequency Divisor:IWDT 时钟分频系数(1/16/32/64/128/256),默认 128;
- Window End Position:窗口监测结束位置,默认 0%,没有结束位置
- Window Start Position:窗口监测开始位置,默认 100%,没有开始位置
- Reset Interrupt Request:选择使能触发复位的中断请求(NMI 或 Reset)
- Stop Control:停止对 WDT 控制的条件
独立看门狗的时钟源是一个独立的时钟 IWDTCLK,PCLKB 最大的时钟频率是 15 kHz。
根据配置参数,分频 16,周期 2048 cycles,则超时时间
2048 × 16 ÷ 15 kHz ≈ 2.1 s
配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击“Generate Project Content”按钮,让软件自动生成配置代码即可。
程序设计
开启看门狗功能,看门狗配置的最大喂狗时间是 2.1 秒,程序初始化后亮灯 3 秒后,在循环中每 0.5 秒翻转 LED 快闪代表程序正常运行,每隔 1 秒喂狗操作,计数喂狗十次后也就是 10 秒后停止喂狗,进入 NMI 中断软件重启程序,观察现象。
- 打开 IWDT 设备
R_IWDT_Open(wdt_ctrl_t * const p_ctrl, wdt_cfg_t const * const p_cfg);
- 刷新 IWDT,也就是喂狗操作
R_IWDT_Refresh(wdt_ctrl_t * const p_ctrl);
此函数会更新 WDT 的 14 位计数器,让它从初始值开始递减;
- WDT NMI 中断
void iwdt_NMI_callback (wdt_callback_args_t * p_args)
当喂狗超时后会进入中断,一般代表程序出现问题卡死,跑飞等,执行软件重启操作重启设备。
程序编写
在 iwdt.h 头文件里定义初始化函数、喂狗函数。
#ifndef BSP_IWDT_H_
#define BSP_IWDT_H_
#include "hal_data.h"
void iwdt_Init(void);
void iwdt_FeedDog(void);
#endif
在 iwdt.c 里实现初始化函数、中断函数和喂狗函数。
#include "iwdt.h"
//初始化
void iwdt_Init(void)
{
//如果使用J-Link调试器进行调试的话需要加上这一句话
//R_DEBUG->DBGSTOPCR_b.DBGSTOP_WDT = 0;
//打开WDT设备
R_IWDT_Open(&g_iwdt0_ctrl, &g_iwdt0_cfg);
//刷新一次喂狗
//R_IWDT_Refresh(&g_iwdt0_ctrl);
}
//喂狗
void iwdt_FeedDog(void)
{
R_IWDT_Refresh(&g_iwdt0_ctrl);
}
// NMI中断回调
void iwdt_NMI_callback(wdt_callback_args_t * p_args)
{
(void) p_args;
//软件复位MCU
__NVIC_SystemReset();
}
在 hal_entry.c 文件中添加头文件 iwdt.h,在 hal_entry 入口函数初始化 IWDT。
uint16_t feedCnt = 0;
void hal_entry(void)
{
/* TODO: add your own code here */
led_Init(); // LED 初始化
//开机led亮1秒
LED1_ON();
R_BSP_SoftwareDelay(1000, BSP_DELAY_UNITS_MILLISECONDS);
//开启看门狗
iwdt_Init();
while(1)
{
LED1_TOGGLE();
R_BSP_SoftwareDelay(200, BSP_DELAY_UNITS_MILLISECONDS);
feedCnt++;
if(feedCnt % 5 == 0 && feedCnt < 50)
{
//每秒喂狗,执行10次后不再喂狗
//10s后,则会进入NMI中断重启程序
iwdt_FeedDog();
}
else if(feedCnt > 70)
{
feedCnt = 0;
}
}
#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}
下载验证
连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完成后,观察实验结果。
开机 LED 灯会亮 1 秒,进入循环后 LED 每 200 ms 翻转,在 10 秒之后程序重启重复操作:LED 先亮 1 秒,进入循环 200 ms 翻转。
前 10 秒在循环中每秒会喂狗,程序正常运行,10 秒后停止喂狗会进入 NMI 中断,中断中执行软件重启。