窗口看门启动异常复位问题
前言
窗口看门狗(Window watchdog, WWDG),提供了一种在指定时间窗内刷新看门狗的功能。同时 WWDG 提供了一个提前唤醒
中断,能够在 WWDG 计数器值降到触发复位的上一个值时触发。实际应用中,可以在此中断被触发时,刷新 WWDG并记
录当前运行信息,以满足运行错误信息记录等功能需求。
问题描述
问题复现平台: STM3210E_EVAL
IAR for ARM v7.70.1
问题复现程序: 基于 STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples
问题描述:在应用开发过程中,WWDG 开启后,WWDG 的提前唤醒中断立即被触发并且微控制器
复位。
主要实现程序如下所示
……
WWDG_SetPrescaler(WWDG_Prescaler_8);
WWDG_SetWindowValue(80);
/* 在例程基础上添加,开启窗口看门狗中断 */
……
NVIC_Init(&NVIC_InitStructure);
WWDG_ClearFlag();
WWDG_EnableIT();
WWDG_Enable(127);
……
While(1)
{
……
WWDG_SetCounter(127);
……
}
如流程图所示,在应用程序正常运行时,WWDG 中断不会被触发。当程序跑飞等异常情况出现时,
于未能在及时刷新 WWDG导致 WWDG 中断事件被触发。在中断服务程序中刷新 WWDG以免
控制器复位,造成运行信息被破坏,并保存运行信息以供错误分析。
问题分析
利用 IAR 以及 ST-Link V2 进行在线调试,在执行完 WWDG_Enable(127) 指令后,WWDG 寄存器值
如下所示。
其中提前唤醒中断标志 WDGA@WWDG_SR 被置位,意味着提前唤醒中断触发。在中断服务程序中,
存在刷新 WWDG 指令。此时计数器值 T=0x7F@WWDG_CR 不在窗口内(W=0x50@WWDG_CFR)
WWDG 在非窗口中(不允许刷新阶段)重装载计数器值会导致复位,如下图所示