杂项知识——单片机的stop模式串口唤醒方法——个人笔记
·
前言:
在 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 中断回调(空实现即可,唤醒用)
注意事项
- 下拉电阻:若 RX 悬空,建议 硬件下拉 或 配置为下拉输入,避免误触发。
- 首字节丢失:唤醒后 重新初始化串口 会导致第一个字节丢失,无法避免,建议上位机重发机制。或者使用无效数据唤醒单片机后再发送有效数据
- 时钟恢复:唤醒后必须 重新配置系统时钟(默认 HSI),否则串口波特率错误
- Stop 模式选择:仅 Stop 0/1 支持 EXTI 唤醒,Stop 2 不支持(仅 LPUART 可唤醒)
更多推荐

所有评论(0)