专栏名称: 嵌入式微处理器
关注这个时代最火的嵌入式微处理器,你想知道的都在这里。
目录
相关文章推荐
上饶新闻  ·  敲黑板!《哪吒2》的隐藏知识点来了→ ·  15 小时前  
银幕穿越者  ·  《诡才知道》评分上涨 ... ·  昨天  
桃桃淘电影  ·  9.7分崩到6.4,年度最热新番玩脱了? ·  2 天前  
51好读  ›  专栏  ›  嵌入式微处理器

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

嵌入式微处理器  · 公众号  ·  · 2024-12-06 12:00

正文


大家好,我是小麦。

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

今天分享一个高效、安全、可靠的方案,希望能对大家有所帮助(记得一定要看到最后,会有收获的)。

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

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

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

空闲信号

因为DMA功能有 HC TC 中断;

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

举个例子;

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

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

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

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

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

来自原项目

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

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

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

  • 缓冲区大小20格,这里假设20字节, 情况E 需要接收30个字节,也就是说, 10字节可能会被覆盖

  • 经过前面的四次接收后,串口继续从 字母R 处接收数据至DMA缓冲区;

  • 接收4字节时,会触发 TC 事件,这时候可以将4字节数据处理;

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

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

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

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

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

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

项目主页

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

支持平台

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

例子程序

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

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

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

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








请到「今天看啥」查看全文