前言:

在 STM32 中,若要通过 串口唤醒 Stop 模式,由于 Stop 模式下内核时钟关闭,串口外设本身无法工作,因此必须借助 RX 引脚的外部中断(EXTI) 来实现唤醒。
唤醒后,再重新初始化串口外设,恢复正常通信。

核心思路:

进入 Stop 前:

      关闭串口外设,将 RX 引脚(如 PA10) 配置为 下降沿触发的外部中断(EXTI),并使能。

Stop 模式中:

          MCU 断电停时钟,EXTI 中断仍可响应,串口数据起始位(下降沿)触发唤醒。

唤醒后:

           重新初始化系统时钟,恢复 RX 引脚为串口功能,重新初始化 UART 外设。

 

简要流程:

主程序运行

   ↓

准备进入低功耗

   ↓

关闭串口 → RX 配置为 EXTI 下降沿触发

   ↓

执行 WFI → 进入 Stop 模式

   ↓

串口收到数据 → RX 下降沿 → EXTI 中断 → 唤醒 MCU

   ↓

唤醒后重新初始化时钟 + 串口

   ↓

继续执行主程序

代码实现示例:


进入 Stop 模式前:RX 引脚配置为 EXTI:

void UART_RX_SetAsExit(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // 1. 关闭 UART 外设,防止冲突
    HAL_UART_DeInit(&huart2);

    // 2. 使能 GPIO 时钟
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // 3. 配置 RX 引脚(PA3)为输入下拉,下降沿触发
    GPIO_InitStruct.Pin = GPIO_PIN_3;
    GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
    GPIO_InitStruct.Pull = GPIO_PULLDOWN;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 4. 配置 EXTI 中断优先级并使能
    HAL_NVIC_SetPriority(EXTI3_IRQn, 2, 0);
    HAL_NVIC_EnableIRQ(EXTI3_IRQn);
}

进入 Stop 模式((使用 WFI))

void Enter_Stop_Mode(void)
{
    // 关闭全局中断,防止唤醒后立即进中断
    __disable_irq();

    // 配置 RX 为 EXTI
    UART_RX_SetAsExit();

    // 清除 EXTI 挂起位
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_3);

    // 进入 Stop 模式(Low Power Regulator)
    HAL_PWR_EnterSTOPMode(PWR_MAINREGULATOR_ON, PWR_STOPENTRY_WFI);

    // === 唤醒后从这里继续执行 ===
    SystemClock_Config();  // 重新初始化时钟(HSI 默认)
    MX_USART2_UART_Init(); // 恢复串口配置
    __enable_irq();
}

唤醒后:恢复 RX 为串口功能

void MX_USART2_UART_Init(void)
{
    huart2.Instance = USART2;
    huart2.Init.BaudRate = 115200;
    huart2.Init.WordLength = UART_WORDLENGTH_8B;
    huart2.Init.StopBits = UART_STOPBITS_1;
    huart2.Init.Parity = UART_PARITY_NONE;
    huart2.Init.Mode = UART_MODE_TX_RX;
    huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
    huart2.Init.OverSampling = UART_OVERSAMPLING_16;
    huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
    if (HAL_UART_Init(&huart2) != HAL_OK)
    {
        Error_Handler();
    }
}

 EXTI 中断回调(空实现即可,唤醒用)

注意事项

  1. 下拉电阻若 RX 悬空,建议 硬件下拉 或 配置为下拉输入,避免误触发。
  2. 首字节丢失唤醒后 重新初始化串口 会导致第一个字节丢失,无法避免,建议上位机重发机制。或者使用无效数据唤醒单片机后再发送有效数据
  3. 时钟恢复唤醒后必须 重新配置系统时钟(默认 HSI),否则串口波特率错误
  4. Stop 模式选择仅 Stop 0/1 支持 EXTI 唤醒,Stop 2 不支持(仅 LPUART 可唤醒)

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐