历史上的今天
返回首页

历史上的今天

今天是:2025年12月19日(星期五)

正在发生

2022年12月19日 | STM32 DMA简述

2022-12-19 来源:zhihu

STM32 DMA简述

**DMA (Direct Memory Access) ** 直接内存存储器,在做数据传输时能够大大减轻CPU的负担。

DMA的作用

DMA提供了一个关于数据的高数传输通道,这个通道不占用CPU的资源。换句话说,通过DMA通道,你在传输大规模数据的时候CPU同时也能够去干其他事。

你可以控制DMA通道的接入口,灵活配置传输的数据源和目的地。以下几个是常用的DMA传输路径:

从外设到内存

从内存A区域传到内存B区域

从一个外设传输到另一个外设

从内存传输数据到外设

....

DMA流程分析

在stm32中,DMA是以类似外设的形式添加到内核之外的,下面我们来看具体的框图:

从上图我们可以看到,DMA通过系统总线连接到了APB1和APB2总线,也连接到了SRAM,Flash和Cortex内核。

我们发现,DMA是独立在内核之外的,其系统总线连接了所有模块,而且这个连接过程并没有经过内核。这也印证了前文所说的,在使用DMA通道传输数据时,并不占用CPU资源。

再仔细观察上图,图中除了总线之外,还有标有DMA请求字样的黑色箭头。外设需要向DMA发送请求,并应答通过后才能够启动传输。具体过程如下:

①在发生一个事件后,外设发送一个请求信号到DMA控制器。DMA控制器根据通道的优先权处理请求。

②当DMA控制器开始访问外设的时候,DMA控制器立即发送给外设一个应答信号。

③当外设从DMA控制器得到应答信号时,外设立即释放它的请求。

④在释放请求后,DMA控制器撤销应答信号。

DMA配置

在我们想要使用DMA的时候,我们该怎么启用他呢?我们通过一个配置函数来实现,在函数内部设置DMA传输的各种参数,最后使能它。代码如下:

void USARTx_DMA_Config(void)

{

DMA_InitTypeDef DMA_InitStructure;

// 开启DMA时钟

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

// 设置DMA源地址:串口数据寄存器地址*/

DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_ADDRESS;

// 内存地址(要传输的变量的指针)

DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SendBuff;

// 方向:从内存到外设

DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;

// 传输大小

DMA_InitStructure.DMA_BufferSize = SENDBUFF_SIZE;

// 外设地址不增

DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;

// 内存地址自增

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;

// 外设数据单位

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;

// 内存数据单位

DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;

// DMA模式,一次或者循环模式

DMA_InitStructure.DMA_Mode = DMA_Mode_Normal ;

//DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;

// 优先级:中

DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;

// 禁止内存到内存的传输

DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;

// 配置DMA通道

DMA_Init(USART_TX_DMA_CHANNEL, &DMA_InitStructure);

// 使能DMA

DMA_Cmd (USART_TX_DMA_CHANNEL,ENABLE);

}

这是一个将串口和DMA连接起来的配置代码,传输方向为从内存到外设。当然想要实现完整的功能,还需要其他代码,你可以参考机械工业出版社出的那本STM32库开发实战指南


推荐阅读

史海拾趣

Dielectric Laboratories公司的发展小趣事

作为一家在电子行业中具有重要地位的企业,DLI始终将创新作为公司的核心竞争力。公司不断投入研发资金,探索新的技术领域,推出具有领先性的产品。例如,在电容器领域,DLI研发了StackiCapTM技术,使得高CV电容器得到进一步发展。这一技术的推出不仅提升了DLI的产品竞争力,也为整个电子行业的发展注入了新的活力。同时,DLI还积极参与国际交流和合作,与全球知名的电子企业建立合作关系,共同推动电子行业的发展。

以上五个故事简要概述了Dielectric Laboratories(DLI)公司在电子行业中的发展历程和成就。通过这些故事,我们可以看到DLI在不断创新、追求卓越的过程中,逐渐成为了电子行业中具有重要影响力的企业。

EEMB Co Ltd公司的发展小趣事

EEMB集团成立于1995年,初期以外销为主,总部位于武汉东西湖金银湖畔。公司创始人们凭借对电子行业的敏锐洞察力和对锂电池技术的深入研究,决定专注于锂电池的研发与生产。他们组建了一支技术实力强大的研发团队,并开始着手设计和生产高性能的锂电池产品。在初期的几年里,公司逐渐在市场上建立起了一定的声誉,并开始与一些知名的工业企业和设备制造商建立合作关系。

Datasensor公司的发展小趣事

随着公司的不断发展壮大,DATALOGIC公司逐渐整合为三大业务模块:自动化产品、手持设备和自动扫描系统。为了更好地适应市场变化和满足客户需求,公司于1998年将自动化产品业务模块独立出来,成立新的公司,并启用DATALOGIC Sensor &More新标识。2000年,公司进一步启用全新的DATASENSOR品牌标识,标志着公司在工业自动化光电检测领域的新篇章。同时,公司投入大量资金用于生产改善、项目管理和高新技术领域的发展,为公司的持续创新和市场拓展提供了有力保障。

德立电子(DDY)公司的发展小趣事

作为一家有远见的企业,德立电子深知绿色发展的重要性。公司积极响应国家环保政策,推行绿色生产和绿色供应链管理。同时,德立电子还积极参与社会公益事业,回馈社会,履行企业社会责任。

请注意,以上故事框架仅供参考,具体内容和细节需根据实际情况进行填充和完善。

Carroll & Meynell Transformers Ltd公司的发展小趣事

在电子行业快速发展的背景下,Carroll & Meynell Transformers Ltd公司始终坚持质量第一的原则。公司建立了严格的质量管理体系,从原材料采购到生产加工,再到产品出厂,每一个环节都经过严格的把控。这种对质量的执着追求使得公司的产品在市场上享有很高的声誉。许多客户因为信赖公司的产品质量,而与公司建立了长期稳定的合作关系。

FIDELIX公司的发展小趣事

随着技术的不断进步和市场竞争的加剧,FIDELIX意识到单靠自身的力量难以在全球市场上立足。因此,公司开始寻求国际合作,与全球多家知名半导体企业建立合作关系,共同研发新技术、新产品。这些国际合作不仅提升了FIDELIX的技术水平,也为其产品打开了国际市场的大门。

问答坊 | AI 解惑

分享: C语言书写的规范的好文

分享: C语言书写的规范的好文…

查看全部问答>

PWM问题

要通过单片机输出PWM,根据占空比不同来控制电机转动快慢,请问怎么具体怎么做呢?频率怎么定,占空比在程序中又怎样实现?谢谢…

查看全部问答>

rc桥式振荡,没有波形输出 为什么?

rc桥式振荡,没有波形输出 为什么? 用的是OP07  反馈选的电阻式473和103 振荡回路选的电容式104p 电阻是393 输出无波形…

查看全部问答>

DS1302时钟芯片在LCD上显示问号的问题。

我的DS1302在LCD上不能正常显示,很多地方出现问号。 温度值正常显示,但是年月日,时间都显示问号。 5,6,7引脚都加了10K的上拉电阻还是不能解决。程序用ISIS仿真没有问题。 换过一块1302还是这样,不知道是芯片问题?还是晶振没有起振? 另 ...…

查看全部问答>

求SectorEditor源代码或者原理

求SectorEditor源代码或者原理      各位大虾,本人已经忙活了一周.至今没有找到在VISTA下写扇区的方法.     偶然发现SectorEditor可以做到,谁有代码的给我来一份 !     邮箱:   [email=liu ...…

查看全部问答>

关于PC与8255通信的问题

做了一个8255扩展的非标准的键盘 与PC通信 现在不明白的是8255怎么与PC通信 PC 上那么多端口怎么具体分配到8255上呢 谢谢了…

查看全部问答>

我是Aman我自豪,又玩了次ST7的汇编。

有史以来最花时间的芯片:ST7芯片ICP编程支持固件开发完成上个星期有ST代理商提出需要手持机支持ST7一款FLASH芯片。粗看资料后,时序并不难对付,即应允开发。感谢该代理商很快的寄来了样片。本以为2天即可搞定,不料竟花了4天时间,总计达30 ...…

查看全部问答>

一个关于flash的问题

mx29lv128的16M的flash,板子上电可以从flash引导系统,但是在系统中用reset指令之后系统就没反应了,系统起来之后flash起始部分内容为FF,但是奇怪的是断电重启,系统依然能够从flash启动,有人知道这是为什么吗?…

查看全部问答>

写数据到RAM中遇到的疑惑

我今天在做一个RAM块的读写时遇到一个很奇怪的问题,我用的芯片是xilinx的spartan-3E   对RAM写操作的代码 always@(posedge write_clk or negedge rst_n) if(!rst_n) write_addr <= 0;   else if(write_allow) write ...…

查看全部问答>

模拟信号采集

本帖最后由 dontium 于 2015-1-23 13:10 编辑 新手,需要做一个8路模拟信号采集系统,能采集0-5V或者4-20mA的模拟信号。电压和电流信号能智能切换或者手动切换。16位AD转换。求一个具体方案,可以话麻烦给个电路参考下。谢谢! …

查看全部问答>