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条回答
huanghb
1楼-- · 2019-12-09 23:14
谢谢楼主,学习了
kgdso210
2楼-- · 2019-12-10 03:15
打开了,不是整个工程,不过我已经弄好了。串口DMA确实挺好用的
justdomyself
3楼-- · 2019-12-10 03:24
 精彩回答 2  元偷偷看……
dingrong
4楼-- · 2019-12-10 04:39
接收中断。和空闲中断。要分清,没有接收中断,光空闲中断是可以利用dma来接收数据,有非阻塞发送的。类似gprs通信程序类
micyoco
5楼-- · 2019-12-10 05:57
DMA + 双缓冲   断帧的问题 就由协议来处理了

一周热门 更多>