蓝盟IT外包,STM32使用DMA接收串行数据

发布者:上海IT外包来源:http://www.lanmon.net点击数:1176

蓝盟IT小贴士,来喽!
01概要
在以前的文章中,《STM32串口详解》和《STM32 DMA详解》的文章详细介绍了STM32的串行端口和DMA外围设备,但本文不对串行端口和DMA的知识进行详细说明。
在串行说明的文章中,示例代码以中断的方式收发数据。 中断的优点是可以立即响应并迅速接收数据,但缺点也很明显。 那就是经常中断。 接收1000字节需要中断1000次,频繁中断意味着中断其他代码的执行,在某些应用程序场景中是不允许的。 此时,使用DMA串行端口的组合可以很好地解决这个问题。
每个数据流的DMA有八个通道,每个通道映射到不同的外围设备,有助于为每个产品配置不同的DMA外围设备请求。
每个数据流可以配置为只映射到一个通道,而不能配置为映射到多个通道。 也就是说,与数据流不同,每个DMA控制器可以同时配置多个数据流,但由于有仲裁器,所以每个数据流不能同时配置多个通道。
使用的是USART1串行外围设备。 从数据手册中可以看出,USART1的收发支持DMA,使用的是DMA2。
02DMA接收
首先配置DMA,使DMA外围设备和串行端口联动。 首先需要配置DMA。
我不太清楚DMA配置这一块。 不太清楚的人请参阅文章《STM32DMA详解》。 直接在这里贴代码。
03中断
虽然通过DMA串行端口解决了经常中断的问题,但是现在有问题。 为了实现数据的即时性,需要将接收到的数据信息及时通知CPU。 使用了DMA和串行端口两个外围设备。 他们有自己的插队。
DMA接收完成后,发生中断通知,CPU获取数据。
但是,这有明显的缺点。 串行端口接收一个数据包的数据,如果长度小于DMA的缓冲长度,则长时间无法触发中断。 在DMA充分接收数据之前不会发生中断。 如果下一个数据包的数据延迟了,这个数据包就不能立即响应。
采用串行中断是个好方案。 串行端口提供了空闲停止。 “好像”是DMA专用的。
串行端口接收一个数据包的数据,接收最后一个字节,没有数据接收时,发生中断,此时,CPU可以获取数据。
04代码
DMA串行收到的工程代码是开源的,有Keil和IAR工程
33-usart-DMA  -接收DMA串行接收(不中断使用) ) ) ) ) ) ) ) ) ) ) )。
34-usart  -接收- dmainterruptdma串行端口接收(DMA中断) ) ) ) ) ) ) )。35-usart-DMA  -接收中断DMA串行端口接收(串行端口空闲中断) )。
PCB和工程代码的开源地址:

359 Github.com/Stronger  CJD/STM  32 f  207 VCT  6

文/上海蓝盟  IT外包专家

IT外包
>
400-635-8089
立即
咨询
电话咨询
服务热线
400-635-8089
微信咨询
微信咨询
微信咨询
公众号
公众号
公众号
返回顶部