HAL_IWDG_Refresh 导致看门狗立即在 STM32L432KC 上跳闸

Posted

技术标签:

【中文标题】HAL_IWDG_Refresh 导致看门狗立即在 STM32L432KC 上跳闸【英文标题】:HAL_IWDG_Refresh causes watchdog to immediately trip on STM32L432KC 【发布时间】:2022-01-08 08:20:32 【问题描述】:

我在使用 ST 的 Nucleo L432KC 开发板时遇到了一个奇怪的问题。当我使用以下代码启动 IWDG 时:

IWDG_HandleTypeDef IwdgHandle;

IwdgHandle.Instance = IWDG;
IwdgHandle.Init.Prescaler = IWDG_PRESCALER_256;
IwdgHandle.Init.Reload    = 30 * 125; 
// 30 sec * 125 watchdog pulses per sec using the LSI frequency of ~32kHz and prescaler 256

然后尝试使用以下命令“宠爱”看门狗:

  HAL_IWDG_Refresh(&IwdgHandle); // resets the IWDG counter back to value of reload

设备立即复位并设置RCC_FLAG_IWDGRST,表明复位是由于看门狗超时。

使用相同代码的这个问题在 Nucleo L152RE 上完美运行(唯一的区别是现在依赖于 L4xx 系列而不是 L1xx)

关于为什么会发生此重置的任何想法?

【问题讨论】:

【参考方案1】:

Stm32L4 系列中的独立看门狗具有窗口选项。启用后,如果看门狗重新加载过早 - 当看门狗计数器值高于窗口值时,它将重置 MCU。

IwdgHandle.Init.Window 如果不需要选项,则应设置为 0xFFF(最大值)。如果您在 bss 中声明了 IwdgHandle - Window 字段将为零,如果计数器大于零,则会导致看门狗刷新时重置。

typedef struct

  uint32_t Prescaler;  /*!< Select the prescaler of the IWDG.
                        This parameter can be a value of @ref IWDG_Prescaler */

  uint32_t Reload;     /*!< Specifies the IWDG down-counter reload value.
                        This parameter must be a number between Min_Data = 0 and Max_Data = 0x0FFF */

  uint32_t Window;     /*!< Specifies the window value to be compared to the down-counter.
                        This parameter must be a number between Min_Data = 0 and Max_Data = 0x0FFF */
 IWDG_InitTypeDef;

PS:看门狗的定时器是一个递减计数器。 HAL_IWDG_Refresh 使用 Reload 值重新加载计数器,而不是重置为零

【讨论】:

以上是关于HAL_IWDG_Refresh 导致看门狗立即在 STM32L432KC 上跳闸的主要内容,如果未能解决你的问题,请参考以下文章

看门狗卡住烧瓶网页[重复]

STM32入门笔记——窗口看门狗

STM32入门笔记——窗口看门狗

STM32之独立看门狗(IWDG)与窗口看门狗(WWDG)总结

看门狗芯片--SP706SEN--调试记录

嵌入式 02 STM32 09 独立/窗口看门狗实验