历史上的今天
返回首页

历史上的今天

今天是:2025年03月16日(星期日)

正在发生

2021年03月16日 | STM32串口DMA容易忽视的问题

2021-03-16 来源:eefocus

博主昨天晚上在STM32串口DMA的问题上纠结了好长时间,所以今天上午写篇博客来谈谈我对串口DMA发送的理解→_→今天主要讨论三个问题:1、什么叫串口DMA 请求;2、串口简要复习;3、串口DMA发送流程。


1、什么叫串口DMA 请求(博主用的是战舰STM32开发板)


说这个问题之前先简单回顾DMA的基本特性。先导出原子哥的PPT内容:


DMA全称Direct Memory Access,即直接存储器访问。


DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。


STM32有两个DMA控制器(DMA2只存在于大容量产品中),DMA1有7个通道,DMA2有5个通道,每个通道专门用来管理来自于一个或者多个外设对存储器的访问请求。还有一个仲裁器来协调各个DMA请求的优先权。


作用:为CPU减负!


下面上图→_→



DMA各通道


从外设(TIMx、ADCx、SPIx、I2Cx、和USARTx)产生的DMA请求,通过逻辑或输入到DMA控制器,这就意味着同时只能有一个请求有效(在同一时间,就只能使用其中的一个,其他通道也类似)。外设的DMA请求,可以通过设置相应的外设寄存器中的控制位,被独立的开启或关闭。


看到这里串口DMA请求的定义就出来了:先举个例子:譬如我想用串口发送数据到PC机,一般做法是CPU通过APB1/APB2总线往串口写数据,然后串口发送;或者是CPU通过总线从串口取(读)数据;如果此时CPU处理的任务非常多,这就会耗费CPU的处理时间。


而我们如果用DMA来传送数据那就很快了,DMA会通过自己的特定通道将数据从一个地址空间复制到另一个地址空间,而且不需要CPU的干预。所以串口DMA请求的定义是:串口要发送/接收数据会请求DMA来完成数据的写和读。(注意这句话只针对本文!)


2、串口简要复习(博主用的是战舰库函数)


本来想给读者准备个帖子,关于printf重定向和半主机模式的讲解,但是链接发不了。只能读者自己去搜索了。。。


这里简要复习一下战舰STM32串口的知识点。举个例子:我想用PC机往STM32串口发送个数据,然后STM32接收到后将数据原样返回给PC机(显示在串口调试助手中)。下面来给大家屡下思路→_→


首先我们会在串口初始化函数中配置串口接收中断,当你PC机往串口发送数据时,串口会产生接收中断;并在中断服务函数中,判断接没接收完,如果接收完毕就会把接收状态寄存器的接收完成标志位置1。到这儿是接收中断的作用。。


然后在主函数中,我们不断检测接收状态寄存器的接收完成标志,看接没接收完。如果接收完了,就通过for循环将接收到的数据,全部发给串口的USART_DR寄存器(当向该寄存器写数据时,串口就会自动发送)。于是我们通过PC机发给串口的数据就会被STM32通过串口发回来了,显示在串口调试助手中。


3、串口DMA发送流程(博主用的是战舰STM32库函数)


战舰实验:通过按键KEY0来控制DMA发送,每按一次KEY0,DMA就传送一次数据到USART1,然后在TFTLCD模块上显示进度信息。这个现在理解就不难了吧。。。来,博主给读者屡一下思路→_→


从主函数入手!首先我们在STM32的SRAM中开辟一段5200(这个数字越大DMA传输越慢,反之越快)字节的空间SendBuff[],作为我们的存储器(内存),存储要往外设(USART1)发送的数据。


然后我们在SendBuff[]中写满TEXT_TO_SEND[]里的内容。这里战舰往SendBuff[]里写的算法非常巧妙,应该学习;(读者有兴趣可以自己上网上搜索战舰STM32第26章实验--DMA实验)


现在SendBuff[]中已经存满了要发送给串口的数据。这时我们还要检测KEY0有没有按下,如果按下了,就通过两个函数:1、使能串口发送(在STM32库函数stm32f10x_usart.c中,配置USART_CR3中的DMA使能位DMAT);2、使能DMA1通道4,启动传输(在dam.c中,最后也是调用了stm32f10x_dma.c中的DMA_Cmd();函数来使能通道)。加上之前(本文没有)对DMA参数的初始化(初始化存储器和外设基地址等),就可以启动一次传输了。


如果读者对传输时间感兴趣或有疑问,博主给大家点一下,非常简单的计算。传输时间将跟波特率密切相关。比如波特率是9600,意思就是每秒钟发送或接受的速率为9600bit/s,8bit=1Byte(字节),故当波特率为9600时,串口的传输速率为1200字节每秒。上文我们申请的存储器(内存)空间是5200字节,故串口要传输完这个大小的空间内容内容,预计需要5200/1200约4秒多。。。这个很简单啊!


讲到这里,不知道读者听没听懂,反正我表述的不是很清楚→_→读者可以调试代码,观察现象。


推荐阅读

史海拾趣

聚辰(Giantec)公司的发展小趣事

在快速发展的同时,港源公司始终不忘履行社会责任。公司秉承绿色环保、节能减排的理念,在生产经营活动中以预防为主、全员参与为行动纲领,防治污染、节废减排。港源公司选用绿色环保RoHS材料,严格管控生产制造过程,确保生产出的产品符合国际环保标准。此外,公司还积极参与社会公益活动,为社会和谐发展贡献自己的力量。

Altmustech公司的发展小趣事

Altmustech公司的创立源于一次技术突破。创始人李博士带领的团队成功研发了一款高效能、低成本的半导体芯片,这一创新技术解决了当时电子行业面临的能效问题,迅速引起了市场的关注。随着技术的不断完善和产品的推出,Altmustech逐渐在半导体市场上崭露头角,为公司的快速发展奠定了坚实的基础。

Electronic公司的发展小趣事

华为,作为中国的科技巨头,其在电子行业的发展历程中展现出了强大的技术实力和全球视野。华为在通信领域取得了多项技术突破,如5G技术的领先和智能手机拍照技术的创新。同时,华为还积极拓展全球市场,与全球运营商建立了广泛的合作关系。然而,面对国际市场的复杂环境和竞争压力,华为也面临着诸多挑战和不确定性。

AMRI Enterprise Co Ltd公司的发展小趣事

品质是AMRI Enterprise Co Ltd的生命线。公司始终坚持品质至上的原则,通过严格的质量管理体系和持续改进的工艺流程,确保产品的稳定性和可靠性。同时,AMRI还注重品牌建设,通过提升品牌形象和塑造企业文化,增强客户对公司的信任度和忠诚度。这些努力使得AMRI的产品在市场上赢得了良好的口碑和广泛的认可。

Bipolarics Inc公司的发展小趣事

在快速发展的过程中,Bipolarics Inc始终重视人才培养和团队建设。公司注重从高校和研究机构引进优秀人才,同时加强内部员工的培训和晋升机制。通过打造一支高效、专业的团队,Bipolarics Inc在技术研发、市场营销等方面取得了显著成绩。此外,公司还积极营造良好的企业文化氛围,激发员工的创新精神和团队凝聚力。

BENCENT公司的发展小趣事

BENCENT公司在成立之初,面临着资金短缺、技术瓶颈和市场认知度低等多重挑战。创始人带领团队夜以继日地研发,通过不断尝试和改进,终于成功开发出了一款具有竞争力的电子产品。这款产品凭借其高性能和创新性,在市场上获得了初步认可,为公司的后续发展奠定了基础。

问答坊 | AI 解惑

CE驱动程序快速入门

CE驱动程序快速入门…

查看全部问答>

贡献classAB的好文章!

Compact_Low-Voltage_Power-Efficient_Operational_Amplifier_Cells_for_VLSI.…

查看全部问答>

高分请教PDA与PC的通信问题

大家好,我现在工作上遇到一个难题,几个月都没解决好,请高手帮忙给个思路。 我现在要做的是PDA与PC上的通信,在正常情况下通过activesync,用socket就行了,但现在要实现在一台PC连接多台PDA,activesync只充许一台PDA连PC,所以我要做的是直接 ...…

查看全部问答>

嵌入式开发入门!!

嵌入式开发入门 从哪儿入手,我想从LINUX开始,请专家指教! 需要哪些书籍和开发板! …

查看全部问答>

stm32---liunx

作为一个低端的arm芯片,cortex-m3内核在上次上海培训的时候有说会达到1G的主频,有没有以后出支持LIUNX芯片的计划。芯片未来前景怎样,就目前的情况来说STM32利用目前的策略,市场反应应该还是不错的。    我只是想知道 ...…

查看全部问答>

关于STM32中MAP文件的内容

大家好! 在MAP文件中,可以看到 6 926 bytes of readonly  code memory     582 bytes of readonly  data memory   1 348 bytes of readwrite data memory 的内容。 我知道“6 926 bytes of ...…

查看全部问答>

ST-LINK使用问题

调试程序时显示:connection error (usb:// usb): swim error[3006]: comm init error: chip does not answer. 我用的是3合1(STM32,STM8,STLINK)板上的STLINK,MCU为STM8L152C6, 但直接用板上的STM8S207却可以连接的调试的。这是什么原因?…

查看全部问答>

新手问题,关于sdram的,谢谢指导

1\dsp为TMS320VC5510,用两片4M,16-bit的SDRAM芯片构造32-bit的SDRAM空间. 我不解的地方是:根据datasheet,4M32-bit的SDRAM占据了所有四个EMIF空间.那么要使用这四兆32位空间,是不是把所有四个CE控制寄存器都设置成SDRAM模式,而硬件上只连接CE0? ...…

查看全部问答>

关于485通信遇到的奇怪问题

我做了一块用于监控电流的板子,用的STC12C5A32AD和MAX485,测试RS485通信的时候遇到奇怪的问题,如果直接用MAX485通信就无法工作,但是如果先用RS232收发数据后,再切换到RS485通信,就可以正常工作了,这是什么原因造成的呢?…

查看全部问答>

瑞萨DIY

第一次用到瑞萨单片机,检验一下他的功能的强大。…

查看全部问答>