STM32基于HAL库的串口接收中断触发机制和适用场景
1. HAL_UART_Receive_DMA函数
基本功能
- 作用:启动一个固定长度的 DMA 数据接收。
- 特点:
- 需要预先指定接收数据的长度(
Size
参数)。 - DMA 会一直工作直到接收到指定数量的数据,接收完成后触发
HAL_UART_RxCpltCallback
回调函数。 - 如果在数据未接收完整之前发送停止信号或超时,不会自动停止 DMA 接收。
- 需要预先指定接收数据的长度(
使用场景
- 适合已知固定数据长度的通信,例如:
- 一次性传输的数据长度固定(如帧协议固定长度)。
- 数据传输中不会因传输长度未知而中断。
使用方式
HAL_UART_Receive_DMA(&huart1, buffer, length);
限制
- 只能接收固定长度的数据,无法处理长度未知或可变的数据帧。
- 在需要停止 DMA 接收时,需要手动调用
HAL_UART_DMAStop()
。
2. HAL_UARTEx_ReceiveToIdle_DMA
基本功能
- 作用:启动 DMA 接收并监控 UART 的空闲中断(IDLE Line Interrupt)。
- 特点:
- 数据接收过程中,检测到 UART 空闲线(IDLE)事件时停止 DMA 并触发回调函数(
HAL_UARTEx_RxEventCallback
)。 - 空闲线事件指的是 UART 接收线路在规定时间内未接收到新数据。
- 支持接收数据长度不确定的通信模式,适用于处理变长或帧协议中的帧间间隔。
- 数据接收过程中,检测到 UART 空闲线(IDLE)事件时停止 DMA 并触发回调函数(
使用场景
- 适合处理长度不固定或带帧协议的通信,例如:
- 通信协议中帧数据长度不确定,通过帧间超时来区分帧。
- 变长数据传输场景,如 Modbus、串口 JSON 数据包等。
使用方式
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, buffer, bufferSize);
实现机制
- UART 接收到数据时,DMA 会将数据存入接收缓冲区。
- 如果在帧数据间隔超时时间内,UART 检测到空闲线中断(IDLE),则认为当前数据帧结束,调用
HAL_UARTEx_RxEventCallback
通知用户。 - 回调函数参数中可以获取实际接收到的数据长度。
优势
- 动态接收长度,支持变长数据包。
- 减少通信协议解析的复杂性,适合帧协议。
3. 区别对比
特性 | HAL_UART_Receive_DMA | HAL_UARTEx_ReceiveToIdle_DMA |
---|---|---|
触发机制 | 固定长度接收完成后触发 | 空闲线中断或接收缓冲区满触发 |
适用场景 | 固定长度数据接收 | 变长数据帧或基于超时的通信协议 |
回调函数 | HAL_UART_RxCpltCallback | HAL_UARTEx_RxEventCallback |
需要指定数据长度 | 是 | 否 |
支持帧协议 | 不支持 | 支持 |
实现复杂度 | 简单 | 较复杂 |
是否依赖空闲中断 (IDLE) | 否 | 是 |
4. 应用场景举例
HAL_UART_Receive_DMA
- 固定长度帧:例如每次接收 128 字节的数据帧。
- 流式数据:例如传感器数据流,帧长度固定或无帧分隔要求。
HAL_UARTEx_ReceiveToIdle_DMA
- 变长帧协议:例如 Modbus 通信协议,根据帧间间隔判断一帧结束。
- 通信间隔大:例如设备与主机间隔性发送数据,帧长度未知,帧间间隔可以用空闲中断检测。
5. 总结
- 如果数据长度固定,选择
HAL_UART_Receive_DMA
。 - 如果数据长度不固定或基于帧间间隔的协议,选择
HAL_UARTEx_ReceiveToIdle_DMA
。这种方法更灵活,但依赖空闲中断的处理。
原文地址:https://blog.csdn.net/weixin_48503637/article/details/144216268
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!