【车载开发系列】RH850中的看门狗WDTA
RH850中的看门狗WDTA
- 【车载开发系列】RH850中的看门狗WDTA
-
- [一. 什么是WDTA](#一. 什么是WDTA)
- [二. 什么是WDTA0WDTE](#二. 什么是WDTA0WDTE)
- [三. 什么是WDTA0MD](#三. 什么是WDTA0MD)
- [四. WDTA核心寄存器](#四. WDTA核心寄存器)
- [五. 喂狗时机](#五. 喂狗时机)
- [六. WDTA 配置步骤](#六. WDTA 配置步骤)
- [七. WDTA使用注意事项](#七. WDTA使用注意事项)
一. 什么是WDTA
WDTA是(Watchdog Timer A) 的缩写。它是内置的硬件看门狗定时器模块,核心作用是监控程序运行状态(防止死循环 / 跑飞),
超时后触发复位或中断,保障汽车电子系统的安全性(符合 ISO 26262功能安全要求)。
二. 什么是WDTA0WDTE
RH850型号内置多组WDTA,WDTA0就表示第0路WDTA模块。
WDTA0 Watchdog Timer Enable Register(WDTA0 看门狗使能寄存器),WDTA模块的使能控制位,缩写为Watchdog Timer Enable。 它是WDTA模块的总使能位,用于开启 / 关闭看门狗功能,是RH850 WDTA模块的核心开关。该控制位只能写不能回读。
| 配置值 | 功能状态 | 说明 |
|---|---|---|
| 0 | 看门狗禁用 | WDTA 模块停止工作,仅调试阶段使用,量产固件中必须置 1 |
| 1 | 看门狗使能 | WDTA 模块按 WDTA0MD 配置的模式运行,开始计时,需定期喂狗(写刷新寄存器) |
| 操作场景 | 写入值 | 注意事项 |
|---|---|---|
| 启动 WDTA0 | 0xAC | 仅初始化时执行一次,需先配 WDTA0MD |
| 喂狗(运行时) | 0x55 → 0xAA | 周期性执行,顺序不可颠倒 |
三. 什么是WDTA0MD
WDTA0MD是RH850中WDTA0实例的模式寄存器(Watchdog Timer A0 Mode Register),用于配置 WDTA0 的核心工作模式,包括溢出时间、窗口比例、触发动作、时钟分频等关键参数。
| 配置值(二进制 / 十进制) | 工作模式 | 核心功能说明 |
|---|---|---|
| 00 (0) | 基本模式(Basic Mode) | 仅提供基础看门狗功能:超时后直接触发 MCU 复位,无中断预警,适用于简单系统 |
| 01 (1) | 窗口模式(Window Mode) | 需在指定「窗口时间」内喂狗(过早 / 过晚喂狗均触发复位),防程序伪造喂狗信号 |
| 10 (2) | 中断 + 复位模式 | 超时前先触发中断(预留故障处理时间),中断未处理则触发复位,适用于安全关键场景 |
| 11 (3) | 测试 / 调试模式 | 仅用于开发调试,关闭看门狗的复位功能,量产时禁止使用 |
四. WDTA核心寄存器
| 寄存器名 | 寄存器说明 |
|---|---|
| WDTA0CR | 看门狗控制寄存器(启停、模式选择) |
| WDTA0MR | 看门狗模式寄存器(周期、复位 / 中断模式) |
| WDTA0RR | 看门狗喂狗寄存器(唯一喂狗入口) |
| WDTA0SR | 看门狗状态寄存器(故障标记) |
五. 喂狗时机
RH850 的 WDTA 支持「故障注入测试」:可通过寄存器强制触发 WDTA 复位,验证系统恢复逻辑
禁止在中断中喂狗:若中断卡死但主循环跑飞,中断仍会喂狗,WDTA 失效;
推荐在主周期任务中喂狗,确保主逻辑正常才喂狗。
六. WDTA 配置步骤
c
// WDTA 配置宏(车载场景推荐值)
#define WDTA_CLOCK_DIV 0x07u // 分频系数:32kHz / (2^7) = 250Hz
#define WDTA_TIMEOUT_MS 1000u // 看门狗超时时间:1秒(车载常用 500ms~2s)
#define WDTA_RELOAD_VAL (WDTA_TIMEOUT_MS * 250 / 1000) // 重载值:250
// WDTA 寄存器地址(RH850/P1H 示例)
#define WDTA_CTL (*(volatile uint16_t *)0xFFF80000u) // 控制寄存器
#define WDTA_CNT (*(volatile uint16_t *)0xFFF80002u) // 计数寄存器
#define WDTA_REF (*(volatile uint16_t *)0xFFF80004u) // 刷新(喂狗)寄存器
#define WDTA_WIN (*(volatile uint16_t *)0xFFF80006u) // 窗口寄存器
void CDD_MainFunction(uint16_t task_cycle)
{
// 喂狗:每周期调用(需保证 task_cycle < WDTA 超时时间,如 500ms)
static uint32_t feed_dog_cnt = 0UL;
feed_dog_cnt += task_cycle;
if (feed_dog_cnt >= 500u) // 每 500ms 喂一次狗
{
WDTA_FeedDog();
feed_dog_cnt = 0UL;
}
....
}
c
/**
* @brief WDTA 喂狗函数(必须在超时前调用,如每 500ms 调用一次)
* @note RH850 WDTA 要求先写 0x55 再写 0xAA 到 REF 寄存器,顺序不能错
*/
void WDTA_FeedDog(void)
{
// 1. 解锁写保护
SYSTEM_PRCR = 0xA50Bu;
// 2. 双字节喂狗(RH850 强制要求,防单字节误写)
WDTA_REF = 0x55u;
WDTA_REF = 0xAAu;
// 3. 重新锁定
SYSTEM_PRCR = 0xA500u;
}
/**
* @brief RH850 WDTA 初始化(适配解串器主控)
* @note 1. 独立时钟源,2. 超时1秒复位,3. 禁用窗口模式(新手先简化)
*/
void WDTA_Init(void)
{
// 1. 解锁 WDTA 寄存器(RH850 写保护)
SYSTEM_PRCR = 0xA50Bu; // 解除看门狗模块写保护(PRCR[15:8]=0xA5,PRCR[2]=1)
// 2. 配置 WDTA 控制寄存器
WDTA_CTL = 0x0000u;
WDTA_CTL |= (WDTA_CLOCK_DIV << 8); // 分频系数
WDTA_CTL |= (0x01u << 4); // 触发动作:0=复位,1=中断,2=复位+中断
WDTA_CTL |= (0x00u << 2); // 禁用窗口模式(车载简单场景)
WDTA_CTL |= (0x01u << 0); // 使能 WDTA
// 3. 设置计数重载值(超时1秒)
WDTA_CNT = WDTA_RELOAD_VAL;
// 4. 锁定 WDTA 寄存器(防误修改)
SYSTEM_PRCR = 0xA500u;
}
七. WDTA使用注意事项
RH850 的 WDTA 支持功能安全等级 ASIL-B/D,是车载控制器(如解串器主控)的必用模块
若程序跑飞、死循环或中断卡死,WDTA 未被及时 "喂狗",会触发系统复位(Reset)或故障中断(Interrupt);
必须在Timeout时间的 70%~ 90% 内执行喂狗(如 1s Timeout,建议 700~900ms 喂一次);另外还需要避免频繁喂狗(如 1ms 喂一次),不然就会失去看门狗的监控意义。