问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

推荐一个高效、可靠、安全的串口通讯开源方案

创作时间:
作者:
@小白创作中心

推荐一个高效、可靠、安全的串口通讯开源方案

引用
CSDN
1.
https://blog.csdn.net/u010632165/article/details/143949205

在嵌入式开发中,串口通讯是一个常见的需求。本文将介绍一种高效、可靠且安全的串口通讯方案,通过串口的空闲中断配合DMA的环形缓冲区模式,可以实现对不固定长度消息报文的高效接收。

在嵌入式开发中,串口通讯是一个常见的需求。面对不同应用场景,需要不同的方案。本文将介绍一种高效、可靠且安全的串口通讯方案,通过串口的空闲中断配合DMA的环形缓冲区模式,可以实现对不固定长度消息报文的高效接收。

串口通讯常见模式

常见的串口通讯模式有轮询模式、中断模式和DMA模式等。其中,DMA(直接内存访问)模式可以显著降低CPU的负载,提高数据传输效率。

DMA与空闲中断结合方案

利用串口的空闲中断配合DMA的环形缓冲区模式,可以高效接收不固定长度的消息报文。当串口接收到空闲信号(IDLE EVENT)时,会触发相应的中断处理。

DMA中断机制

DMA功能包含两种中断:

  • HC(Half Complete):DMA传输一半成功标志
  • TC(Total Complete):DMA传输完成成功标志

环形缓冲区模式

假设分配了一个12字节的DMA缓冲区,从地址1开始接收数据:

  • 当DMA接收到第6个字节时,会触发HC事件
  • 当DMA接收到第12个字节时,会触发TC事件

环形缓冲区数据覆盖问题解决方案

在环形模式下,如果需要接收的数据长度大于缓冲区大小,就会出现数据覆盖的问题。下面介绍一种解决方案:

假设缓冲区大小为20字节,需要接收30个字节的数据:

  1. 接收4字节时,触发TC事件,处理这4字节数据
  2. 回到缓冲区起始位置,继续接收10字节,触发HT事件,处理这10字节数据
  3. 继续接收10字节,触发TC事件,此时前4字节已被覆盖,但因为之前这部分数据已经处理过,所以不影响
  4. 最后接收6个字节,产生空闲信号

通过结合使用空闲中断和DMA的HT/TC中断,可以完美解决数据覆盖问题。

开源项目案例

推荐一个优秀的开源项目:stm32-usart-uart-dma-rx-tx。该项目主要支持主流的STM32芯片平台,并提供了丰富的测试DEMO和示例程序,包括:

  • 裸机程序
  • 环形缓冲区接收
  • 轮询接收
  • DMA+空闲中断基于RTOS的模式接收

在STM32F413-Nucleo开发板上的测试结果显示,在115200波特率下,每秒发送1581个字节(约142ms):

  • 不使用DMA时,CPU负载为14%
  • 使用DMA时,CPU负载为0%

这个项目基于STM32CubeIDE创建,建议读者搭建相应的开发环境进行实践。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号