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条回答
junzimengyou
1楼-- · 2019-12-09 14:02
最近我把所有串口dma接收的方式都试过了,还是dma+fifo的方式最靠谱,最踏实,用stm32f4操作4g模块的at命令,没有任何毛病,当然我是在ucos 的情况下试的,裸奔估计都差不多,上系统地话对接缓冲最稳定可靠。
bias
2楼-- · 2019-12-09 15:11
能用来接收xmoderm协议数据吗
zsfddd
3楼-- · 2019-12-09 20:34
F1有空闲中断吗?
whatcanitbe
4楼-- · 2019-12-09 21:07
 精彩回答 2  元偷偷看……
fengyunyu
5楼-- · 2019-12-09 21:10
学习了,顶一下
596142041
6楼-- · 2019-12-09 22:41
多谢楼主分享.

一周热门 更多>