跳到主要内容

19 IWDT 独立看门狗实验

在这里插入图片描述

开发板官网https://www.edevkit.com/)

本系列教程目录:


IWDT 独立看门狗实验

本章目标:

  • 了解 RA6M5 处理器的看门狗定时器及其工作原理;
  • 学会使用 RASC 配置独立看门狗定时器、API 函数;

硬件设计

(略,参见配套硬件原理图)

软件设计

新建工程

复制一份“04 GPIO_led”修改文件夹名“19 IWDT”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 iwdt.ciwdt.h,保存到目录下的 src 文件夹下。

FSP 配置

Keil 界面选择“Tools”→“RA Smart Configurator”打开 RASC 界面。

添加 IWDT Stack 模块。

插图01

设置 IWDT 属性

只需设置名称和中断名称。

插图02

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

插图03

  • 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 中断软件重启程序,观察现象。

  1. 打开 IWDT 设备
R_IWDT_Open(wdt_ctrl_t * const p_ctrl, wdt_cfg_t const * const p_cfg);
  1. 刷新 IWDT,也就是喂狗操作
R_IWDT_Refresh(wdt_ctrl_t * const p_ctrl);

此函数会更新 WDT 的 14 位计数器,让它从初始值开始递减;

  1. 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 中断,中断中执行软件重启。