【车载开发系列】RH850中的看门狗WDTA

【车载开发系列】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 喂一次),不然就会失去看门狗的监控意义。

相关推荐
没有医保李先生2 小时前
可变参函数底层解析
开发语言·stm32·单片机
v先v关v住v获v取2 小时前
ZG-6右箱体双面钻专用机床右主轴箱设计1张总装图+零件图cad+设计说明书
科技·单片机·51单片机
17(无规则自律)2 小时前
【Linux驱动实战】:最简单的内核模块
linux·c语言·驱动开发·嵌入式硬件
GodKK老神灭2 小时前
SWD协议中BANK机制详解
单片机·keil
逆小舟2 小时前
【SWM320】学习使用UART
单片机·学习·嵌入式软件
单片机设计星球2 小时前
51单片机的【智能家居系统】仿真设计
嵌入式硬件·51单片机·智能家居
逐步前行2 小时前
STM32_SysTick_系统定时器
stm32·单片机·嵌入式硬件
逐步前行3 小时前
STM32_外部中断_寄存器操作
stm32·单片机·嵌入式硬件
Saniffer_SH4 小时前
【高清视频】AI服务器调试利器:PCIe功耗分析设备 Quarch PAM 深度解析
网络·人工智能·驱动开发·嵌入式硬件·测试工具·计算机外设·压力测试