HAL_IWDG_Refresh 导致看门狗立即在 STM32L432KC 上跳闸
HAL_IWDG_Refresh causes watchdog to immediately trip on STM32L432KC
我在使用 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)
关于为什么会发生此重置的任何想法?
Stm32L4系列独立看门狗有window选项。启用后,如果过早重新加载看门狗,它将重置 MCU - 当看门狗计数器值高于 window 值时。
如果不需要选项,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
值重新加载计数器,而不是重置为零
我在使用 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)
关于为什么会发生此重置的任何想法?
Stm32L4系列独立看门狗有window选项。启用后,如果过早重新加载看门狗,它将重置 MCU - 当看门狗计数器值高于 window 值时。
如果不需要选项,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
值重新加载计数器,而不是重置为零