STM32 串口的中断,空闲中断DMA

while(HAL_UART_GetState(&UartHandle) != HAL_UART_STATE_READY)

{

}

在DMA 的时候可能不会返回HAL_UART_STATE_READY

1. HAL_UART_GetState() 的工作原理

HAL_UART_GetState() 返回的是 两个状态的组合

c

复制代码
HAL_UART_StateTypeDef HAL_UART_GetState(UART_HandleTypeDef *huart)
{
  uint32_t temp1 = 0x00U, temp2 = 0x00U;
  temp1 = huart->gState;      // 发送状态
  temp2 = huart->RxState;     // 接收状态
  
  return (HAL_UART_StateTypeDef)(temp1 | temp2);  // 按位或!
}

2. 状态组合表

发送状态 (gState) 接收状态 (RxState) GetState() 返回值
READY (0x20) READY (0x20) READY (0x20)
BUSY_TX (0x21) READY (0x20) BUSY_TX (0x21)
READY (0x20) BUSY_RX (0x22) BUSY_RX (0x22)
BUSY_TX (0x21) BUSY_RX (0x22) BUSY_TX_RX (0x23)

关键点GetState() 返回的是 组合状态 ,不是简单的 READY

原因1:DMA接收导致状态为 BUSY_RX

复制代码
// 当你调用这个函数后
HAL_UART_Receive_DMA(&UartHandle, aRxBuffer, sizeof(aRxBuffer));

// HAL库内部会设置:
huart->RxState = HAL_UART_STATE_BUSY_RX;  // 0x22

// 所以 GetState() 返回的是:
// gState | RxState = 0x20 | 0x22 = 0x22 (BUSY_RX)
// 不是 0x20 (READY)!

原因2:DMA循环模式保持 BUSY 状态

复制代码
// 如果DMA是循环模式(CIRCULAR)
hdma_usart2_rx.Init.Mode = DMA_CIRCULAR;

// 那么接收永远不会"完成"
// RxState 会一直保持为 BUSY_RX
// 所以 GetState() 永远不会返回 READY
相关推荐
AOI小白新手上路1 天前
江科协51单片机 17-2 红外遥控电机调速实验调试总结
单片机·嵌入式硬件·51单片机
oshan20121 天前
零基础STM32入门教程--10-PWM 呼吸灯
stm32·单片机·嵌入式硬件
记帖1 天前
STM32C5A3R开发(7)----ADC电压采集
嵌入式硬件·adc·dac·stm32cubeide·stm32c5·stm32cubemx2·stm32c5a3rgt6
自小吃多1 天前
器件移动、旋转、镜像、对齐、等间距操作笔记
笔记·嵌入式硬件
jianqiang.xue1 天前
智能体整体架构设计:四大模块与目录组织
单片机·嵌入式硬件·物联网·架构·esp32
Messy create1 天前
【BMS-AFE-温度检测】
stm32·单片机·能源
东莞市永盛电气1 天前
三相208V变380V变压器,出海工业设备供电适配方案
python·单片机·嵌入式硬件
桃蹊、1 天前
串口/网络透传实战:FreeRTOS 多任务架构与连接池设计
stm32·物联网·wifi·freertos
Learn-Share_HY1 天前
[IT Network]如何配置反向路徑過濾器(rp_filter),以解決路由不對稱問題?
linux·嵌入式硬件·物联网·网络协议·tcp/ip·http·iot
深圳市宝华视联1 天前
医院内网部署手术示教系统注意事项
嵌入式硬件·实时互动·音视频·实时音视频·视频编解码·嵌入式实时数据库