电力电子技术
直播中

王文娥

7年用户 140经验值
私信 关注
[问答]

DMA如何接收不定长的数据?

STM32串口DMA如何接收不定长的数据呢?

回帖(8)

肖东菁

2020-12-21 14:18:00
在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢?
同学A:数据来了就会进入串口中断,在中断中读取数据就行了!
中断就是打断程序正常运行,怎么能保证高效呢?经常把主程序打断,主程序还要不要运行了?
同学B:串口可以配置成用DMA的方式接收数据,等接收完毕就可以去读取了!
这个同学是对的,我们可以使用DMA去接收数据,不过DMA需要定长才能产生接收中断,如何接收不定长的数据呢?
举报

张易

2020-12-21 14:18:18
  什么是DMA
  DMA:全称Direct Memory Access,即直接存储器访问
  在STM32的DMA资源
  STM32F1系列的MCU有两个DMA控制器(DMA2只存在于大容量产品中),DMA1有7个通道,DMA2有5个通道,每个通道专门用来管理来自于一个或者多个外设对存储器的访问请求。还有一个仲裁器来协调各个DMA请求的优先权。
  
  STM32F1
  
  STM32F1
  而STM32F4/F7/H7系列的MCU有两个DMA控制器总共有16个数据流(每个DMA控制器8个),每一个DMA控制器都用于管理一个或多个外设的存储器访问请求。每个数据流总共可以有多达8个通道(或称请求)。每个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。
  
  STM32F4
  
  STM32F4
举报

李悠冉

2020-12-21 14:18:39
  DMA+串口空闲中断
  这两个资源配合,简直就是天衣无缝啊,无论接收什么不定长的数据,管你数据有多少,来一个我就收一个,就像广东人吃“山竹”,来一个吃一个~(最近风好大,我好怕)。
  可能很多人在学习stm32的时候,都不知道idle是啥东西,先看看stm32串口的状态寄存器:
  
  idle
  
  idle说明
  当我们检测到触发了串口总线空闲中断的时候,我们就知道这一波数据传输完成了,然后我们就能得到这些数据,去进行处理即可。这种方法是最简单的,根本不需要我们做多的处理,只需要配置好,串口就等着数据的到来,dma也是处于工作状态的,来一个数据就自动搬运一个数据。
举报

孙缅禧

2020-12-21 14:18:54
  DMA接收数据
  DMA在接收数据的时候,串口接收DMA在初始化的时候就处于开启状态,一直等待数据的到来,在软件上无需做任何事情,只要在初始化配置的时候设置好配置就可以了。等到接收到数据的时候,告诉CPU去处理即可。
  判断数据接收完成
  那么问题来了,怎么知道数据是否接收完成呢?
  其实,有很多方法:
  对于定长的数据,只需要判断一下数据的接收个数,就知道是否接收完成,这个很简单,暂不讨论。
  对于不定长的数据,其实也有好几种方法,麻烦的我肯定不会介绍,有兴趣做复
  接收完数据时处理
  串口接收完数据是要处理的,那么处理的步骤是怎么样呢?
  暂时关闭串口接收DMA通道,有两个原因:1.防止后面又有数据接收到,产生干扰,因为此时的数据还未处理。2.DMA需要重新配置。
  清DMA标志位。
  从DMA寄存器中获取接收到的数据字节数(可有可无)。
  重新设置DMA下次要接收的数据字节数,注意,数据传输数量范围为0至65535。这个寄存器只能在通道不工作(DMA_CCRx的EN=0)时写入。通道开启后该寄存器变为只读,指示剩余的待传输字节数目。寄存器内容在每次DMA传输后递减。数据传输结束后,寄存器的内容或者变为0;或者当该通道配置为自动重加载模式时,寄存器的内容将被自动重新加载为之前配置时的数值。当寄存器的内容为0时,无论通道是否开启,都不会发生任何数据传输。
  给出信号量,发送接收到新数据标志,供前台程序查询。
  开启DMA通道,等待下一次的数据接收,注意,对DMA的相关寄存器配置写入,如重置DMA接收数据长度,必须要在关闭DMA的条件进行,否则操作无效。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分