STM32 串口空闲中断接收+DMA的实现方法

2019-12-08 14:38发布

本帖最后由 circle_head 于 2017-4-28 16:31 编辑

转载+自己的理解   附件内容是 DMA的配置 + 串口的配置   不是工程文件
        
        STM32中,一般使用串口中断接收串口数据,但是用这种方法的话,就要频繁进入串口中断,然后处理,效率就比较低。于是就想到用DMA来接收串口数据,这个STM32也是支持

的。但是关键的一点,怎么知道数据接收完毕了呢?如果接收的数据长度固定,那就好办,直接设置DMA的接收数据个数就行了。但是如果长度不固定了,那应该怎么办了?

       这个时候,就要用到STM32在串口中提供的另一个好用的东西了,就是串口空闲中断。在STM32的串口控制器中,设置了有串口空闲中断,即如果串口空闲,又开启了串口空闲中断

的话,就触发串口空闲中断,然后程序就会跳到串口中断去执行。有了这个,是不是可以判断什么时候串口数据接收完毕了呢?因为串口数据接收完毕后,串口总线肯定是会空闲的嘛,

那这个中断肯定是会触发的了。    需要注意的是:要RXNE位被置位后,串口总线空闲才会触发的


使用过程中只需在主函数中
1、定义接收数组
u8 RxBuff[Data_Leng];

2、配置DMA          
MYDMA_Config(DMA1_Channel5,(u32)&USART1->DR,(u32)RxBuff, DMA_DIR_PeripheralSRC, 30); //DMA1 通道5 ,外设串口1,存储器为RxBuff,DMA传输方向,DMA长度

3、配置串口
uart_init(9600);         

接收完成数据后 就可以在中断中解析数据  执行相应的操作了。

关于中断函数中 清除空闲标志位  解释如图1 状态寄存器 所示

关于中断函数中 先Disable DMA通道  然后设置DMA传输数目 最后Enable DMA通道的做法  解释如图2 DMA通道 所示
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
whatcanitbe
1楼-- · 2019-12-09 01:16
这种方式适合modbus这类按桢处理的情况
yzhu
2楼-- · 2019-12-09 06:20
感谢楼主分享自己的心得!
XA144F
3楼-- · 2019-12-09 08:30
我这么接收gps信息的,处理很轻松。
circle_head
4楼-- · 2019-12-09 12:16
xiaomu 发表于 2017-4-28 12:33
楼主有没有测试过,对方发送的数据不是很连续的,就是说,对方发送数据是一个一个发送的,字节之间有间隔的 ...

程序是没问题的我测过的      接收的数据有间隔就会进中断的, 这个间隔多少时间会产生中断我也没测过。
circle_head
5楼-- · 2019-12-09 12:31
 精彩回答 2  元偷偷看……
Excellence
6楼-- · 2019-12-09 13:20
顶,。。。。。。。。

一周热门 更多>