标签:之间 sar 中断 lazy 简单 芯片 标准 art 过程
本篇文章主要介绍STM32串口高波特率下接收不定长数据,因为在实际项目中会遇到串口溢出中断的产生,导致数据接收不正确,提升串口接收中断优先级当时也无法解决,所以采用DMA+空闲中断的方法,希望能给人以收获。
使用MDK5.25版本,芯片包为STM32F4系列。
开发板:STM32F407VGT6开发板,是一款大容量芯片,最高能跑168MHz。
烧录器:STlink或者Jlink。
复制上一篇代码第4篇串口接收不定长数据的代码,去掉串口接收中断相关代码,保持串口接收空闲中断并增加串口DMA接收相关代码。
先把串口接收中断相关代码去掉,然后修改一下串口空闲中断代码。
DMA是可直接进行存储器访问的控制器,能够完成外设与存储器之间或者存储器与存储器之间的高速数据传输。传输过程也是DMA控制器自己实现的,CPU只要对传输动作的初始化即可,而不需要参与其中,极高的提升了CPU的效率。举个简单的例子:早上我需要煮一壶热水用来泡一杯麦片,我只需要初始化煮热水的动作即可,煮水的过程由电热水壶(DMA控制器)自己完成,再由电热水壶自动关闭提示完成(串口空闲中断),我们就能取出热水(串口数据)了,在煮热水这段时间,我们(CPU)可以去干别的事情,像看书之类的。
1.我们先看看数据手册,USART1接收的DMA请求位于哪个DMA(F407有两个DMA控制器)和哪个通道。
可以从上图得知,USART1_RX位于DMA请求映射的通道4,而且与STMF103相比,多出了数据流,分别是数据流2和数据流5,根据映射图可知选择数据流2和5都是可以的而且肯定比F103要多配置数据流的操作。
2.参考之前写过的F103DMA串口接收和正点原子的F407的DMA串口发送代码,我们开始编写自己的F407串口DMA接收代码。
添加DMA库文件到工程中。
添加MDA初始配置代码
配置DMA的参数有很多,外设为非增量模式是因为串口1的数据寄存器的地址是不变的,而存储器为增量模式是因为我们每接收一个字节,数字地址偏移一个字节。
然后在串口空闲中断中的接收函数中获取我们想要的数据并通过串口1发送出来,进行回环测试。
把串口1波特率初始化设置为1500000(即1.5M)。
进行5ms一包数据的高速通信一会,看接收与发送的字节数是否相等。
STM32串口高波特率收发的时候,引脚的引脚速度可以配置高一点,这里我用了100M,串口接收中断的优先级也应该设置高一点,用空闲中断可以减少进入串口中断的次数,还能规避串口溢出中断,是一个实时性比较好的方式。后面我又测试了下2M的波特率,发现容易丢失一个字节,看了手册波特率最大支持4.5Mbits/s,所以我觉得应该和晶振的误差有关,就像arduino手册里只支持列出来的特定波特率无误差,所以有待以后测试。
标签:之间 sar 中断 lazy 简单 芯片 标准 art 过程
原文地址:https://www.cnblogs.com/zhanxiaohong0303/p/2020_08_30.html