vesperW · 11月21日

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

大家好,我是小麦。

在嵌入式开发中,经常会用到串口通讯。面对不同应用场景,需要不同的方案。

今天我们来讲一下高效,可靠,安全的方案,记得看到最后,会有收获。

常见的有串口轮询模式,串口中断模式,串口 DMA 接收传输等等;

利用串口的空闲中断配合 DMA 的环形缓冲区模式,可以高效接收不固定长度的消息报文

下图中经过黄色的高电平时间空闲之后,就会产生一个空闲事件,IDLE EVENT

image.png
空闲信号

因为 DMA 功能有HCTC中断;

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

举个例子;

如下图所示,这里分配了一个 DMA 缓冲区,大小是 12 字节,如果从地址 1 开始接收,会出现以下这两种情况;

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

image.png
HC TC

这个思路其实我之前也有实践过,但是没有很好地利用 HC 和 TC 事件。

所以无法处理这种情况,即 DMA 缓冲区处于环形模式(Circular)的时候,数据覆盖的问题,最近看到了一个非常棒的开源项目,这里的思路非常不错,下面会详细介绍。

下面是DMA HC/DMA TC/Idle组合进行串口接收的细节,如下图所示;

image.png
来自原项目

再次简单介绍一下缩略词的含义;

  • R 读取;
  • W 写入;
  • I 空闲信号;
  • HT Half-Transfer complete DMA 缓冲区半传输完成;
  • TC Transfer-Complete DMA 缓冲区全部接收完成;

这里简单介绍一下情况 E 的解决方案,上面图片最右边小图;

  • 缓冲区大小 20 格,这里假设 20 字节,情况 E 需要接收 30 个字节,也就是说,10 字节可能会被覆盖
  • 经过前面的四次接收后,串口继续从字母 R 处接收数据至 DMA 缓冲区;
  • 接收 4 字节时,会触发TC事件,这时候可以将 4 字节数据处理;

image.png
第一步

  • 因为是环形模式,所以回到第一个字节处,继续接收 10 字节,触发HT事件,这时候可以处理 10 字节数据;

image.png
第二步

  • 第三步,继续接收 10 字节,触发TC事件,其中,已经有 4 字节被覆盖(下图橙色所示),因为之前这部分数据已经处理了,所以,即使覆盖也不影响;

image.png
第三步

  • 第四步,上述已经接收了 24 个字节,所以还有 6 个字节没有接收,后面接收会产生空闲信号,并对之前的数据区域进行覆盖,如下图示所示;

image.png

所以,不难发现,如果只使用空闲中断,如果需要接收的数据长度大于缓冲区,就会出现数据覆盖的情况,而加上 DMA 的 HT 和 TC 中断,就完美解决了这样的问题;

当然除了这些,还有很多优秀的方案,这个项目提供大量的例子。

项目地址https://github.com/MaJerle/stm32-usart-uart-dma-rx-tx

image.png
项目主页

目前这个项目主要支持主流的 STM32 芯片平台和一些开发板上的测试 DEMO,具体如下所示;

image.png
支持平台

相应的例子程序如下所示,除了裸机程序,还有环形缓冲区接收,轮询接收,DMA+ 空闲中断基于 RTOS 的模式接收,挺丰富的,可以参考一下;

image.png
例子程序

作者在 STM32F413-Nucleo 开发板进行程序的测试,发现优化效果很不错;

115200 的串口波特率下,每秒发送 1581 个字节,大约142ms;

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

最后,这个项目目前是基于 STM32CubeIDE 创建的,记得搭建一下环境。如果无法下载,公众号后台回复【高效串口】获取项目代码。

Enjoy  : )

END

作者:小麦大叔
来源:小麦大叔

推荐阅读

欢迎大家点赞留言,更多 Arm 技术文章动态请关注极术社区嵌入式客栈专栏欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
2891
内容数
284
分享一些在嵌入式应用开发方面的浅见,广交朋友
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息