WDOG 无法使用 8 位序列刷新 我无法使用 4 个 8 位写入来刷新 S32K144 的看门狗。16 位和 32 位都可以接受,但 8 位不行。我尝试了图片中的 8 位写入法,但都失败了: 如果 WDOG_CS[CMD32EN]为 0,刷新写入序列可以是 - 两个 16 位写入 (0xA602, 0xB480) 或四个 8 位写入 (0xA6, 0x02, 0xB4, 0x80);如果 WDOG_CS[CMD32EN]为 1,刷新写入序列可以是 - 一个 32 位写入 (0xB480_A602)。 到 CNT 寄存器。这两种方法都必须在 WDG 超时之前发生;否则, 监视程序会重置 MCU。 Re: WDOG cannot use 8-bit sequence refresh 启动刷新序列前,请禁用全局 中断。否则,如果中断发生在刷新 写入完成之前,则可能导致 刷新序列无效。序列结束后,恢复全局 中断控制状态。 中断检查提示 Re: WDOG cannot use 8-bit sequence refresh 我确认在喂狗之前和之后都中断了开关。在同样的情况下,只改变进料顺序和使用 16 位进料方法成功了,但 8 位进料方法失败了,调整 8 位进料顺序也不起作用。 Re: WDOG cannot use 8-bit sequence refresh 你好 @GXY,
WDOG 支持 8 位刷新序列,但对时序要求非常严格。即使标准 C 代码生成 STRB 指令,该序列也可能由于在字节写入之间插入了额外的堆栈访问或地址重新加载而失败。使用紧凑的 GCC 内联汇编代码块有助于确保 8 位刷新操作能够可靠地执行。
static inline void WDOG_Refresh8_AsmInline(void)
{
__asm volatile(
// "mrs r2, PRIMASK \n"
// "cpsid i \n"
// "dsb \n"
"ldr r0, =0x40052004 \n"
"movs r1, #0xA6 \n"
"strb r1, [r0, #1] \n"
"movs r1, #0x02 \n"
"strb r1, [r0, #0] \n"
"movs r1, #0xB4 \n"
"strb r1, [r0, #1] \n"
"movs r1, #0x80 \n"
"strb r1, [r0, #0] \n"
// "dsb \n"
// "isb \n"
// "msr PRIMASK, r2 \n"
);
}
此致,
丹尼尔
記事全体を表示