STM32+DMA+串口空闲中断(开放源码下载)

本文介绍了如何利用STM32的DMA和串口空闲中断实现高速数据传输,避免CPU频繁中断处理,提高效率。通过配置串口和DMA,当进入串口空闲中断时,表明数据传输完成,DMA已将数据搬运至缓存,CPU可在处理数据的同时,准备接收新数据。文中提供F1和F4系列的源码供下载参考。
摘要由CSDN通过智能技术生成

1)空闲中断+DMA实现高速数据传输

为什么要用DMA+空闲中断?

①在使用串口接受数据时,在使用串口通信外设,如GPS、WiFi、2/3/4G模块等,我们常用的是接收中断,每接收一个字节进入中断,导致这段时间CPU不能做其他事情,降低了效率。STM32的DMA不需要CPU控制,让CPU能够在接收数据的同时去做其他事情。
②接收不定长数据。如果数据定长,我们使用串口接收中断,只需要判断数据的个数就能知道数据是否接收完成。但是当数据不定长,就无法判断了。比如GPS的数据,数据量相对比较大,如果使用串口接收中断,会降低效率,难以判断数据是否接收完成。这时候,使用DMA+空闲传输,让DMA这个工具人去做搬运数据的活,CPU就继续做其他的事情,当进入空闲中断,就知道数据传输完成了,CPU去处理DMA缓存数据就行了。
我会把F1/F4系列的源码贴在最后面,大家需要自行下载。

DMA相关

DMA(Direct Memory Access,直接存储区访问)为实现数据高速在外设寄存器与存储器之间或者存储器与存储器之间传输提供了高效的方法。之所以称之为高效,是因为 DMA 传输实现高速数据移动过程无需任何 CPU 操作控制。从硬件层次上来说,DMA 控制器是独立于 Cortex-M3/M4 内核的,有点类似 GPIO、USART 外设一般,只是 DMA 的功能是可以快速移动内存数据。
所以,DMA就是数据的搬运工,不需要CUP控制,自己就能够高速搬运数据,高效工具人。可以减轻CPU的压力,在DMA搬运数据的同时,CPU可以去做其他的事情,当搬运完毕,我们去处理数据就可以了。
更多关于DMA的知识就不多做阐述,论坛有很多资料参考。

串口空闲中断

串口空闲中断的事件标志是IDLE,进入这个中断事件,表示串口本次的接收任务已经完成了。

图片替换文本

理论就讲这么多,上代码开搞(注:F1系列DMA和F4系列不一样,我使用的是F4系列,标准库)
首先是串口配置部分:
只需要把接收中断RXNE修改成IDLE,使能DMA接收就行了。

	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);	//使能串口中断接收
	USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);   //使能串口1 DMA接收

然后是DMA配置部分(F1和F4有些区别)
我们先来看看DMA请求映射,USART1_RX是数据流2,通道4。
图片替换文本

代码如下

DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);  //使能DMA传输
	
DMA_DeInit(DMA2_Stream2); //数据流2
DMA_InitStructure.DMA_Channel = DMA_Channel_4;  //通道4
DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&USART1->DR;  //DMA外设ADC基地址
DMA_InitStructure.DMA_Memory0BaseAddr =(u32)DMA_Rec_Buf;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory
  • 15
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值