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
相关推荐
BackCatK Chen16 小时前
第 8 篇:TMC2240 电机正反转实现|DIR 引脚控制 + 代码优化(稳定不抖动)
stm32·单片机·嵌入式硬件·保姆级教程·电机正反转·tmc2240·dir引脚控制
星马梦缘17 小时前
EDA彩灯电路绘制
单片机·嵌入式硬件·物联网·pcb·eda·嘉立创
Forsete19 小时前
LINUX驱动开发#9——定时器
linux·驱动开发·单片机
Hello_Embed1 天前
libmodbus 移植 STM32(USB 串口后端篇)
笔记·stm32·单片机·嵌入式·freertos·libmodbus
VekiSon1 天前
Linux内核驱动——杂项设备驱动与内核模块编译
linux·c语言·arm开发·嵌入式硬件
来自晴朗的明天1 天前
14、光耦隔离电路(EL3H7)
单片机·嵌入式硬件·硬件工程
G***技1 天前
杰和IB3-272:以低功耗高性能打造新一代工业智能交互核心
单片机·嵌入式硬件·物联网
czhaii1 天前
STC AI8052U单片机特点
单片机
MAR-Sky1 天前
keil5中数据的不同定义和单片机(以stc8为例)里的对应关系(idata,xdata,data,code)
单片机·嵌入式硬件
项目題供诗1 天前
51单片机入门(八)
单片机·嵌入式硬件·51单片机