我使用的是STM32U585系列芯片,开启了IWDG,并在运行模式下测试提前唤醒中断正常触发,但在进入STOP2模式后,提前唤醒中断无法触发导致无法喂狗,看门狗超时后芯片复位。
手册中写道IWDG可以在停止模式生成唤醒中断,如下图:


并且我核查了FLASH选项字节是默认值0x1FEF F8AA无改动,则位17为1,IWDG在停止模式下运行,如下图:

CubeMX配置如下图:


测试代码如下:
/* USER CODE BEGIN 0 */
/**
* @brief IWDG提前唤醒中断
* @param None
* @retval None
*/
void HAL_IWDG_EarlyWakeupCallback(IWDG_HandleTypeDef *hiwdg)
{
HAL_IWDG_Refresh(hiwdg);
}
/**
* @brief 进入停止模式2
* @param None
* @retval None
*/
void sys_api_power_stop2(void)
{
HAL_SuspendTick();
/* Enter the system to STOP2 mode */
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWREx_EnterSTOP1Mode(PWR_STOPENTRY_WFI);
/* Check that the system was resumed from stop 2 */
if(__HAL_PWR_GET_FLAG(PWR_FLAG_STOPF) == 0U)
{}
/* Clear stop flag */
__HAL_PWR_CLEAR_FLAG(PWR_FLAG_STOPF);
/* Check that stop flag is cleared */
if(__HAL_PWR_GET_FLAG(PWR_FLAG_STOPF) != 0U)
{}
HAL_ResumeTick();
}
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the System Power */
SystemPower_Config();
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ICACHE_Init();
MX_IWDG_Init();
/* USER CODE BEGIN 2 */
sys_api_power_stop2();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
HAL_IWDG_Refresh(&hiwdg);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
|
测试了SLEEP、STOP0、STOP1、STOP2和STANDBY模式,仅有SLEEP模式可以正常触发提前唤醒中断。