最近在使用STM32L071C8Tx芯片做低功耗项目时,遇到了一个奇怪的Bug:
USART1 115200波特率 HSI时钟源(HSI RC Div 4分频 输出频率4M)
按照官方手册及HAL库提供的函数,使用 HAL_UARTEx_EnableStopMode()
允许串口Rx数据包将MCU从Stop状态唤醒,并使用HAL_UART_Receive_IT()
使能串口中断方式接收后进入Stop状态,上位机发送1字节数据极小概率能唤醒MCU。检测发现数据发送后MCU有将HSI时钟重新上电,并USART1中断有进入,但很快又关闭了HSI时钟,重新进入Stop状态。
由于STOP模式无法使用Debug,因此未找到具体中断源。
怀疑中断后未正确清空各中断Flag和置位各中断Enable位,但排查后并未找到原因。
官方手册描述了一种可能的情况会导致重新进入Stop状态:
并且提醒了使用串口唤醒Stop状态有波特率限制:
考虑可能问题出在MCU检测到Rx数据包时序不正确,所以并未生成唤醒事件,导致MCU并未从Stop状态唤醒。计算后发现串口波特率在容许的波特率范围内,问题并未出在外部唤醒信号上。
手册接下来描述了各低功耗模式下串口的工作状况,其中有一个细节: