历史上的今天
返回首页

历史上的今天

今天是:2026年01月12日(星期一)

正在发生

2023年01月12日 | STM32如何高效接收串口数据

2023-01-12 来源:zhihu

硬件:stm32f103cbt6

软件:STM32F10x_StdPeriph_Lib_V3.5.0

DMA,直接内存存取,可以用它的双手释放CPU的灵魂,所以,本文通过USART3进行串口收发,接受使用DMA的方式,无需CPU进行干预,当接受完成之后,数据可以直接从内存的缓冲区读取,从而减少了CPU的压力。

具体的代码实现如下:

  • usart_driver.h 封装了接口,数据接收回调函数类型,基本数据结构等;

  • usart_driver.c 函数原型实现,中断服务函数实现等;

拷贝这两个文件即可,可以根据目录下的参考用例,进行初始化。

头文件usart_driver.h已经声明了外部函数可能用到的接口;

USART3_DR的地址

因为USART3接收到数据会存在DR寄存器中,而DMA控制器则负责将该寄存器中的内容一一搬运到内存的缓冲区中(比如你定义的某个数组中),所以这里需要告诉DMA控制去哪里搬运,因此需要设置USART3_DR的总线地址。

USART3的基址如下图所示;

DR寄存器的偏移地址如下图所示;

所以最终地址为:0x40004800 + 0x004#define USART_DR_Base 0x40004804

DMA的通道

因为有很多外设都可以使用DMA,比如ADC,I2C,SPI等等,所以,不同的外设就要选择属于自己的DMA通道,查找参考手册;

DMA通道

因此USART3_RX在这里会使用DMA1的通道3,这都是硬件上已经预先分配好的,我们需要遵循这个规则。所以在代码中我们做出相应的定义;如下所示;

DMA的中断

DMA支持三种中断:传输过半,传输完成,传输出错;

DMA中断

因此在使用是相当安全也相当灵活,而本文只是用了传输完成中断;如下定义了,传输完成中断的标志位,DMA1_FLAG_TC3也就对应了图中的TCIF;

USART接收回调函数

在STM32的HAL中封装了大量外设的回调函数,使用起来十分方便,但是标准库中则没有这样的做法,但是这里我们可以自己实现,rx_cbk就是回调,即串口数据接收完成就会执行已经注册的回调函数;

通过使用接口usart_set_rx_cbk进行回调函数的注册,pargs为将传递的参数指针;

头文件源码

DMA的基本配置

串口接收DMA的配置在函数dma_init中;

已经定义了数据缓冲区,如下:

因此需要在DMA的配置中设置USART_DR的地址,和数据缓冲区的地址,以及两者的大小;还有就是数据流向;

  • 寄存器流向内存;

  • 内存流向寄存器;这个需要搞清楚;相关配置如下所示;

注意:DMA_DIR_PeripheralSRC表示,外设作为源地址,数据是从外设寄存器流向内存,即DMA会把数据从地址USART_DR_Base搬运到RxBuffer去。如果这个地方搞错,会导致RxBuffer始终没有你想要的数据。

环形队列接收数据

线性缓冲区会因为缓冲器接收数据已满导致无法继续接收的问题;而环形队列进行接收的话,会自动进行覆盖,这样一来,在读取数据的时候,也要配置一个环形队列进行数据处理,下面的配置是把DMA配置为循环模式;

在结构体user_uart_mod中,则用两个变量分别指向队首head和队尾tail;具体数据的读取在函数USART3_IRQHandler中,会把数据从内存的RxBuffer读取到结构体user_uart_mod的成员变量rx_buf中;最终调用回调函数。

函数原型

usart_driver.c

参考用例

这里需要调用usart_init,并设置回调函数,如果不设置,则不会执行回调。

总结

本文简单介绍了基于STM32基于DMA,利用串口空闲中断进行串口数据接收的具体配置和实现方法,代码基于标准库3.5版本;

因为标准库ST目前已经不再更新,并且ST提供了cubemx工具可以进行基于HAL库和LL库的外设快速配置,从而简化大量工作;当然为了不掉头发感觉撸寄存器也不错,最终适合自己的才是最好的。


推荐阅读

史海拾趣

昭华(CHA)公司的发展小趣事

随着市场需求的不断变化,昭华公司敏锐地捕捉到了防水型轻触开关的市场潜力。他们投入大量资金进行技术研发,成功开发出了一系列防水性能优异、稳定性强的防水型轻触开关。这些产品一经推出便受到了市场的热烈欢迎,为昭华公司带来了可观的利润。此外,昭华公司还不断探索新的技术路线,成功将LED与开关结合,推出了发光开关系列产品,进一步丰富了公司的产品线。

Andigilog公司的发展小趣事

昭华(CHA)公司自2007年成立以来,就致力于拨码开关与轻触开关的研发制造。在初创阶段,公司面临着技术挑战、资金短缺以及市场竞争激烈等多重困难。然而,昭华团队凭借着对技术的热情和执着,通过不断的技术创新和产品优化,逐渐在市场上树立了自己的品牌。他们不仅成功研发出多款高性能的开关产品,还积累了丰富的行业经验,为公司的后续发展奠定了坚实的基础。

CONTTEK Group GmbH公司的发展小趣事

随着市场竞争的加剧,CONTTEK Group GmbH公司意识到只有不断创新才能在行业中立足。因此,公司加大了对研发的投入,积极引进新技术、新材料和新工艺,不断推动产品的升级换代。通过持续的技术创新,公司成功推出了一系列具有创新性和竞争力的新产品,进一步巩固了其在电子连接器领域的领先地位。

Galaxy ( Bel )公司的发展小趣事

CONTTEK Group GmbH公司的创立,标志着电子行业内一颗璀璨的新星开始崭露头角。公司在创立初期,便凭借对市场的敏锐洞察力和对技术的深刻理解,确立了在电子连接器领域的专业地位。通过引进先进的生产设备和技术人才,公司成功开发出了一系列高质量、高性能的连接器产品,并逐渐在市场中获得了认可。

Analog公司的发展小趣事

CONTTEK Group GmbH公司深知品质是企业的生命线。因此,公司建立了严格的质量管理体系,从原材料的采购到产品的生产、检测、包装等每一个环节都进行严格把控。这种对品质的执着追求,使得公司的产品赢得了客户的广泛信赖和好评。许多知名电子企业都选择与CONTTEK Group GmbH公司建立长期合作关系,共同推动电子行业的发展。

Digi International公司的发展小趣事

Digi International与UR集团达成了战略协议,共同关注铁路、公共汽车和智慧城市等领域的发展。这一合作不仅为公司带来了新的市场机会,也促进了其在智能交通系统领域的业务拓展。通过与UR集团的紧密合作,Digi International的智能铁路解决方案在英国市场上得到了广泛应用,提高了铁路运输的效率和安全性。

问答坊 | AI 解惑

如何用万用表测出双向晶闸管的三个极

双向晶闸管除了一个电极G仍然叫控制极外,另外两个电极通常不再叫阳极和阴极,而统称为主电极T1和T2。双向晶闸管是一种N-P-N-P-N型5层结构的半导体,其符号和内部结构图见图1-1。 用万用表区分双向晶闸管电极的方法是:首先找出主电极T2。将万用表 ...…

查看全部问答>

nios添加pwm IP核 问题

    今天在用PWM——IP核时,但在生成的.bdf模块中没有PWM_OUT,感觉是在添加组件是向导中的signal时,PWM_out的interface和signal type没有选好,但试了好些interface和signal type还是没搞好,pwm_out应该是选择export,但我用的是Quartu ...…

查看全部问答>

寻找ARM7平台C开发人员

我朋友自己公司的一个自行车出租管理系统,现在数据库管理这一块已经完成,手持式终端这一块的功能没有人做,朋友开价8万,要求在年后系统可以运行,不知道有没有人感兴趣?手持式终端这边的设备有现成的,基本配置如下: 1. ARM7主芯片 2. GPRS ...…

查看全部问答>

一万个数中选出前100个最大的数

最高效的方法 一万个数中选出前100个最大的数 …

查看全部问答>

ch375/ch372设备方式的速度问题

我的MCU是at89s52(12个时钟周期为1个机器周期) 24M晶振下PC的每次读1024或2048byte,上传速度是70KB/s左右 33M晶振下PC的每次读2048byte,上传速度是90-95KB/s 1.请问下这个速度是否正常?对于CH375+at89s52、并行 而言 2.33M晶振下PC的如果每 ...…

查看全部问答>

最强51单片机开发板,超值51开发板,51开发板

开发板中心网址:http://www.huanor.com 开发板中心论坛:http://www.huanor.com/bbs 淘宝网址:http://shop36289907.taobao.com QQ: 1060087047或者871001268 手机:13466617480或者15801405586 座机:010-82534219 Email:huanor_sales@hot ...…

查看全部问答>

帮忙啊,急得吃不下饭了。

http://community.eeworld.net/Expert/topic/5413/5413343.xml?temp=.3037989…

查看全部问答>

Precautions for connecting APA outputs to other devices

本帖最后由 dontium 于 2015-1-23 13:38 编辑 Precautions for connecting APA outputs to other devices …

查看全部问答>

LED芯片制造设备现状及其工艺介绍

 一、上游外延片生长设备国产化现状   LED产业链通常定义为上游外延片生长、中游芯片制造和下游芯片封装测试及应用三个环节。从上游到下游行业,进入门槛逐步降低,其中LED产业链上游外延生长技术含量最高,资本投入密度最大,是国际竞争最激烈 ...…

查看全部问答>