历史上的今天
返回首页

历史上的今天

今天是:2024年08月30日(星期五)

正在发生

2019年08月30日 | STM32开发 -- DMA详解

2019-08-30 来源:eefocus

在GPS部分有用到DMA,接下来看一下它的使用。


一、DMA简介

直接存储器存取(DMA) 用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。

两个DMA控制器有12个通道(DMA1有7个通道, DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器来协调各个DMA请求的优先权。


二、DMA主要特性

● 12个独立的可配置的通道(请求): DMA1有7个通道, DMA2有5个通道

● 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。

● 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推) 。

● 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。

● 支持循环的缓冲器管理

● 每个通道都有3个事件标志(DMA半传输、 DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。

● 存储器和存储器间的传输

● 外设和存储器、存储器和外设之间的传输

● 闪存、 SRAM、外设的SRAM、 APB1、 APB2和AHB外设均可作为访问的源和目标。

● 可编程的数据传输数目:最大为65535


三、功能框图

在这里插入图片描述

四、DMA请求映像

DMA1控制器

从外设(TIMx[x=1、 2、 3、 4]、 ADC1、 SPI1、 SPI/I2S2、 I2Cx[x=1、 2]和USARTx[x=1、 2、 3])产生的7个请求,通过逻辑或输入到DMA1控制器,这意味着同时只能有一个请求有效。外设的DMA请求,可以通过设置相应外设寄存器中的控制位,被独立地开启或关闭。


在这里插入图片描述
在这里插入图片描述

DMA2控制器

从外设(TIMx[5、 6、 7、 8]、 ADC3、 SPI/I2S3、 UART4、 DAC通道1、 2和SDIO)产生的5个请求,经逻辑或输入到DMA2控制器,这意味着同时只能有一个请求有效。参见下图的DMA2请求映像。外设的DMA请求,可以通过设置相应外设寄存器中的DMA控制位,被独立地开启或关闭。

注意: DMA2控制器及相关请求仅存在于大容量产品和互联型产品中。


在这里插入图片描述
在这里插入图片描述

五、相关寄存器

DMA中断状态寄存器(DMA_ISR)


在这里插入图片描述
在这里插入图片描述

如果开启了 DMA_ISR 中这些中断,在达到条件后就会跳到中断服务函数里面去,即使没开启,我们也可以通过查询这些位来获得当前 DMA 传输的状态。这里我们常用的是 TCIFx,即通道 DMA 传输完成与否的标志。注意此寄存器为只读寄存器,所以在这些位被置位之后,只能通过其他的操作来清除。


DMA中断标志清除寄存器(DMA_IFCR)

在这里插入图片描述

DMA_IFCR 的各位就是用来清除 DMA_ISR 的对应位的,通过写 1 清除。在 DMA_ISR 被置位后,我们必须通过向该位寄存器对应的位写入 1 来清除。


其他寄存器

自行查看《STM32中文参考手册_V10.pdf》 150页


六、DMA配置

举个栗子:

需要配置USART2 的DMA接收,DMA该怎么配置。

查看上面介绍的得出:

USART2_RX 在DMA1的通道 6,USART2是挂载在 APB1 下面的外设。


然后就可以配置了:


DMA_InitTypeDef DMA_InitStructure;


RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);  //开启DMA1时钟

  USART_DMACmd(USART2, USART_DMAReq_Rx, ENABLE);   //打开串口2 DMA接收使能  开启串口DMA接收

 

DMA_DeInit(DMA1_Channel6);  //恢复缺省值

  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USART2->DR); //设置USART2发送数据寄存器

  DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)buf; //设置发送缓冲区首地址

  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //设置外设位目标,内存缓冲区->外设寄存器

  DMA_InitStructure.DMA_BufferSize = BufferSize; //需要发送的字节数

  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设地址不做增加调整,调整不调整都是DMA自动实现的

  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存缓冲区地址增加调整

  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //外设数据宽度8位,1个字节

  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //内存数据宽度8位,1个字节

  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //单次传输模式

  DMA_InitStructure.DMA_Priority = DMA_Priority_High; //优先级设置

  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //关闭内存到内存的DMA模式

  DMA_Init(DMA1_Channel6, &DMA_InitStructure); //写入配置

  DMA_Cmd(DMA1_Channel6, ENABLE); //开启DMA通信,等待接收数据


七、使用

一个比较重要的函数,获取当前剩余数据量大小:


    uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx)


则:

先配置DMA


    GpsRxDMACfg( GpsTransferBuffer,DEF_GPS_RBUFSIZE );   

    //GpsTransferBuffer为接收buffer,DEF_GPS_RBUFSIZE 为设置的接收buffer大小(512)


根据设置的接收buff大小减去当前剩余数据量,得到当前接收数据大小。


curcount = DEF_GPS_RBUFSIZE - DMA_GetCurrDataCounter( GPS_RxDMA_Ch );

推荐阅读

史海拾趣

CEVA, Inc公司的发展小趣事

CEVA公司一直以来都是无线连接和智能传感技术的领先许可方。公司提供了包括数字信号处理器、人工智能处理器、无线平台以及一系列用于传感器融合、图像增强、计算机视觉、语音输入和人工智能的补充软件。这些技术和产品使得CEVA在多个终端市场,如移动、消费、汽车、机器人、工业和物联网等领域,都能够提供节能、智能和互联的设备解决方案。通过与全球半导体公司和原始设备制造商的紧密合作,CEVA成功地将这些技术应用于实际产品中,推动了相关市场的快速发展。

创都(CAX)公司的发展小趣事

除了技术创新外,创都公司还以其精准的市场策略著称。在电子产品更新换代日益加快的背景下,公司市场部门深入分析了消费者的需求和市场趋势,成功预测了未来一段时间内的产品走向。基于这些分析,创都公司提前布局,推出了多款符合市场趋势的新产品。这些产品不仅满足了消费者的需求,还引领了市场潮流,为公司带来了丰厚的利润。此外,创都公司还积极开展品牌推广活动,通过线上线下多种渠道提升品牌知名度,进一步巩固了市场地位。

AIRPAX公司的发展小趣事

随着全球环保意识的提高,AIRPAX开始关注产品的环保性能。公司积极研发符合RoHS标准的产品,并致力于减少生产过程中的环境污染。同时,AIRPAX还推动了绿色供应链的建设,与供应商共同实现可持续发展。这些努力使得AIRPAX在电子行业中树立了绿色环保的良好形象。

BESTECH公司的发展小趣事

随着全球环保意识的提高,AIRPAX开始关注产品的环保性能。公司积极研发符合RoHS标准的产品,并致力于减少生产过程中的环境污染。同时,AIRPAX还推动了绿色供应链的建设,与供应商共同实现可持续发展。这些努力使得AIRPAX在电子行业中树立了绿色环保的良好形象。

Deutsch公司的发展小趣事

在竞争激烈的电子行业中,品质控制和品牌建设至关重要。Deutsch公司深知这一点,因此始终将品质控制和品牌建设作为公司的重要任务。公司建立了严格的质量管理体系,确保产品的每一个细节都符合高标准。同时,通过精心策划的品牌推广活动,Deutsch公司的品牌形象逐渐深入人心。这些努力不仅提升了公司的市场地位,也增强了客户对公司的忠诚度。

AIC [Analog Intergrations Corporation]公司的发展小趣事

随着全球环保意识的不断提高,电子行业的环保要求也日益严格。Deutsch公司积极响应环保号召,将环保和可持续发展作为公司的重要战略之一。公司投入大量资源研发环保型产品和技术,减少生产过程中的能源消耗和污染排放。同时,公司还积极参与环保公益活动,推动整个行业的绿色发展。这些努力不仅提升了公司的社会形象,也为公司的可持续发展奠定了坚实基础。

问答坊 | AI 解惑

叶老师AVR单片机视频种子.rar

大家支持下,以后继续好资料 …

查看全部问答>

一些单片机资料

写描述真困难啊!本来把c语音控制与应用的前言抓图抓下来了,结果不会发!…

查看全部问答>

FPGA设计真的需要synplify来做综合吗

最近做的一个设计 如果用quartusII直接综合、布线,资源占用率在70%左右, 速度最快可以到130MHz左右; 但是如果用synplify综合,QII布线,资源占用大约上升10%, 速度降了20多M! 感觉在synplify里该设的优化条件都设置了,扇出10-50都试过, ...…

查看全部问答>

急问wince下的汉字编码问题

有一个htm文件,我把它保存成ab.txt,编码方式是gb2312(htm中有charset=gb2312),然后用程序去读,读出来后用MessageBox显示,却显示乱码,源程序如下:          FILE* fp;         WCHAR ...…

查看全部问答>

STM32的ISP下载问题

在使用ST Cortex-m3 STM32 ISP Demo(1.0b)的时候,按照说明将BOOT0、BOOT1设置好后,连接时却提示“run-time error‘6’:overflow。并且显示器件信息不可识别,但是右下角却显示绿点,已连接。 高手帮忙指点一下这是什么原因呢?…

查看全部问答>

fir滤波器

本帖最后由 paulhyde 于 2014-9-15 09:00 编辑 在FPGA中fir滤波器的问题。我设置的滤波器是低通滤波器,采样频率为10M,截止频率是50KHZ,NCO产生的波形频率是从几HZ到100KHZ,但我从示波器上看出我的滤波器根本就没有实现滤波的效果。仍然是跟我 ...…

查看全部问答>

有人在TI estore上买过东西么?要不要交关税???

想买那个55美金的板子,运费是不要钱的。但是要不要关税呢?…

查看全部问答>

MSP430中const的用法

最近在用IAR调试程序,发现如下问题: const char mm[6]={0xff,0xff,0xff,0xff,0xff,0xff}; --------- char *ptr; ptr=mm; 错误提示为: Error[Pe513]: a value of type \"char const *\" cannot be assigned to an entity of type \"char * ...…

查看全部问答>