STM32 HAL库 DMA 串口空闲中断
时间: 2025-02-09 20:11:00 浏览: 85
### STM32 HAL库使用DMA实现串口空闲中断
#### 函数介绍
为了利用STM32的硬件特性高效处理通信任务,HAL库提供了`HAL_UARTEx_ReceiveToIdle_DMA()`函数用于配置串口接收数据至指定缓冲区并监听空闲线状态变化事件[^3]。
此方法允许设备在检测到线路空闲时自动停止DMA传输,并触发回调通知应用程序读取已接收到的数据帧。这种方式非常适合于未知长度的消息包收发场景,在不增加CPU负担的情况下实现了灵活可靠的数据交换机制。
#### 初始化设置
当基于CubeMX工具完成基本外设初始化之后,需手动编写部分代码片段以完善功能需求:
```c
UART_HandleTypeDef huart1;
uint8_t rxBuffer[64];
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
int main(void){
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
// 启动DMA接收直到空闲线被激活
if (HAL_UARTEx_ReceiveToIdle_DMA(&huart1, rxBuffer, sizeof(rxBuffer)) != HAL_OK) {
Error_Handler(__FILE__, __LINE__);
}
}
```
上述代码展示了如何启动DMA接收过程直至遇到空闲信号为止。这里调用了`HAL_UARTEx_ReceiveToIdle_DMA()`并将目标缓冲区地址以及最大容量作为参数传递给它[^2]。
#### 处理回调
每当发生特定条件下的事件(比如空闲线上升沿),就会执行相应的钩子函数来进行后续操作。对于本案例而言,则是在每次成功捕获一段完整的消息体后更新全局变量或调用其他业务逻辑接口:
```c
// UART RX DMA Idle Callback function prototype declaration.
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size);
/* Private application code */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
if(huart->Instance==USART1){
// Process received data here...
// Restart reception after processing current buffer content
if(HAL_UARTEx_ReceiveToIdle_DMA(&huart1,rxBuffer,sizeof(rxBuffer))!= HAL_OK){
Error_Handler(__FILE__,__LINE__);
}
}
}
```
这段示例中定义了一个名为`HAL_UARTEx_RxEventCallback`的回调处理器,其会在每轮DMA事务结束时由固件框架自动调用。在此处可对接收到的信息做初步解析或是简单存储起来等待更高层模块提取分析[^4]。
阅读全文
相关推荐


















