-
1.结论摘要
- MD24 MCAL 的 EWDG_SetCompareHigh() 形参类型为 uint8,而 EWDG 的 CMPH 寄存器字段为 16 位。客户配置 1s 超时(CompareHigh = 10000)时,高 8 位被静默截断,实际写入寄存器的值为 0x10(= 16),实测看门狗 2.3712ms 即触发复位。MC03 的同名函数形参为 uint16,不存在该问题。
- 影响:所有 CompareHigh(及 CompareLow,见第 5 节)配置值 大于 255 的 MD24 客户,看门狗都会提前复位;由于配置值 ≤ 255 时表现正常,该缺陷在简单测试中不易暴露。
- 修复:将形参类型改为 uint16(与寄存器字段位宽一致),并补充超范围参数校验以防再次静默截断。修复后的实测结果见第 6节。
2. 问题描述
客户在 MD24 上配置 EWDG 超时时间为 1s,实际超时时间远小于 1s,看门狗持续触发复位;相同配置在 MC03 上表现正常。
客户的 EWDG 硬件设计如下图所示:EWDG_OUT 通过一个二极管连接到复位脚,EWDG_OUT 拉低即触发复位。
图 2-1:客户 EWDG 硬件设计

MD24 侧的 MCAL WDG 配置如下:
图 2-2:MCAL WDG 配置(CompareHigh = 10000)

实测现象:EWDG_OUT 从初始化完成到拉低仅 2.3712ms,远小于配置的 1s。
图 2-3:实测 EWDG_OUT 波形(2.3712ms)

3. 复现步骤
- 基于 MCAL 配置工具,将 EWDG 的 CompareHigh 配置为 10000(按配置工具口径对应 1s 超时,即 1 计数 = 100µs);
- 初始化并启动 EWDG,不再喂狗;
- 用示波器测量 EWDG_OUT 从启动到拉低的时间;
- 实测结果为 2.3712ms,而预期为 1s。
说明:客户原始场景中上一步骤的"停止喂狗"由功能未及时喂狗自然触发,此处为便于复现改为主动停止。
4. 根因分析
- 4.1 配置值与寄存器实际值的差异
配置项 CompareHigh = 10000,但读回寄存器发现实际写入值为二进制 10000b,即 16。
图 4-1:配置项截图

图 4-2:寄存器实际值截图

- 4.2 定位:形参类型与寄存器字段位宽不匹配
对比 MC03 与 MD24 驱动实现,发现 EWDG_SetCompareHigh 的形参类型存在差异:
- MC03:形参 Value 类型为 uint16;
- MD24:形参 Value 类型为 uint8。
图 4-3:MC03 与 MD24 形参类型对比

而 MD24 的 EWDG -> CMPH 寄存器字段与 MC03 一致,均为 16 位:
图 4-4:MD24 EWDG CMPH 寄存器定义(16 位)

- 4.3 失效机理
CompareHigh = 10000 ↓ 十进制转十六进制 0x2710 (占 16 位) ↓ 传入形参 uint8 Value(仅 8 位),高位被丢弃 0x10 = 16 (写入寄存器的实际值)由于该截断发生在赋值处,既不会有编译告警,也不会触发 DET 参数校验,属于典型的静态静默截断:配置工具显示正常、代码编译通过、只有运行时行为异常。
5.修复方案
当前临时修复:在 EWDG_SetCompareHigh 的条件编译处补上 MD24 分支,使其形参类型与寄存器字段位宽一致(uint16)。
图 5-1:修复代码

6. 回归验证
实测结果:
图 6-1:修复后实测波形

-
Y yt0069 从 MCAL BUGS 移动了该主题
快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...