产品选型

单片机 dma 单片机的DMA的要点难点概括

小编 2024-10-12 产品选型 23 0

单片机的DMA的要点难点概括

DMA控制器

1 stm32的dma控制器有两组 DMA1,DMA2;

2 dma的运行也就是传输数据不通过内核,直接进行传输也就是cpu不干涉

3 DMA的数据传输方向 外设到储存器 储存器到外设 储存器到储存器

4 dma1有7 个通道,dma2有5 个通道 一个通道连接多个外设

5 DMA的优先级通过dma仲裁器来协调

DMA主要特性

1 dma的优先级通过软件编程设置,具有四种优先级别 很高 高 中 低 当优先级相同时由硬件决定。

2 源和目标数据必须对齐 两边同时为 半字 字 字节

3 每个通道具有三个中断标志 DMA半传输、 DMA传输完成和DMA传输出错

4 传输数据最大长度 65535

DMA框图

请注意图片下面的三句话

1 DMA2仅存在与大容量产品和互联网型产品

2 SPI/I2S3、 UART4、 TIM5、 TIM6、 TIM7和DAC的DMA请求仅存在于大容量产品和互联型产品

3 ADC3、 SDIO和TIM8的DMA请求仅存在于大容量产品

当cpu与DMA同时获取存储器或外设的数据时dma会暂时暂停,等待cpu若干个时钟周期。

DMA处理

在发生一个事件后,外设向DMA控制器发送一个请求信号。 DMA控制器根据通道的优先权处理请求。当DMA控制器开始访问发出请求的外设时, DMA控制器立即发送给它一个应答信号。当从DMA控制器得到应答信号时,外设立即释放它的请求。一旦外设释放了这个请求, DMA控制器同时撤销应答信号。如果有更多的请求时,外设可以启动下一个周期。总之,每次DMA传送由3个操作组成。

从外设数据寄存器或者从当前外设/存储器地址寄存器指示的存储器地址取数据,第一次传

输时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。

存数据到外设数据寄存器或者当前外设/存储器地址寄存器指示的存储器地址,第一次传输

时的开始地址是DMA_CPARx或DMA_CMARx寄存器指定的外设基地址或存储器单元。

执行一次DMA_CNDTRx寄存器的递减操作,该寄存器包含未完成的操作数目。、

DMA中断

每个DMA通道都可以在DMA传输过半、传输完成和传输错误时产生中断。为应用的灵活性考

虑,通过设置寄存器的不同位来打开这些中断。

DMA1设备

dma1连接的外设

各个通道的表

DMA2

dma2连接的外设

dma连接的外设

通道配置过程(软件初始化通道)

下面是配置DMA通道x的过程(x代表通道号):

1. 在DMA_CPARx寄存器中设置外设寄存器的地址。发生外设数据传输请求时,这个地址将

是数据传输的源或目标。

2. 在DMA_CMARx寄存器中设置数据存储器的地址。发生外设数据传输请求时,传输的数

据将从这个地址读出或写入这个地址。

3. 在DMA_CNDTRx寄存器中设置要传输的数据量。在每个数据传输后,这个数值递减。

4. 在DMA_CCRx寄存器的PL[1:0]位中设置通道的优先级。

5. 在DMA_CCRx寄存器中设置数据传输的方向、循环模式、外设和存储器的增量模式、外

设和存储器的数据宽度、传输一半产生中断或传输完成产生中断。

6. 设置DMA_CCRx寄存器的ENABLE位,启动该通道。

一旦启动了DMA通道,它既可响应连到该通道上的外设的DMA请求。

为什么需要DMA?你知道吗?

DMA(Direct memory access直接存储器读写)是单片机初学者比较困惑的问题,好像没用到过,系统也照样跑的好好的~~。

今天这部分内容主要为后面基于DMA的数据传输做个技术铺垫。

1.DMA是干什么用的

在没有DMA的情况下,要实现读写如串口,SPI等外设时,CPU要被占用,而无法处理其它任务。比如前一篇基于中断的串口通信例程中(https://www.toutiao.com/i6723425636653728263/),CPU要响应串口和时钟中断,在整个中断程序内,CPU都是被中断占用的,此外,响应中断时还要实现现场数据的压栈(就是把中断时主程序的运行状态寄存器值存储到内存的栈中,关于栈--参看前面的文章),中断结束时还要恢复现场数据(就是把内存栈中的状态数据又恢复到状态寄存器中,以继续运行被中断的主程序),这些都大大降低了CPU运行主程序的效率。

那么,能不能不让CPU去响应外设中断而实现外设数据的收发呢?答案是可以滴,DMA就是帮你干这个事的。让CPU专心处理数据,这些慢速外设数据的读写,交给DMA来做,等DMA把数据收发完成了,通知CPU一声,完美~~。

DMA控制示意图

DMA控制流程

(1)CPU首先要初始化DMA。就是告诉DMA要做什么,比如要传送的数据是什么类型啊,从哪到哪啊,传送几次啊,数据传输时把DMA的哪些状态通知CPU啊,以什么方式通知啊,就这些东东,简单吧~~;

(2)然后使能DMA,DMA就按照CPU的初始化参数开始干活了。整个干活的过程是不需要CPU介入,默默无闻一直把活干完(中间也可能汇报一次,把初始化要求)。

(3)DMA完成传送的次数以后,通知CPU,我把活干完了,剩下就是你的事了。

从这个图可以看到,DMA和CPU是共用总线的,如果二个人同时需要使用总线怎么办呢,可能会让CPU等一下,但是这种对CPU的影响是非常小的。

2.DMA什么时候用

DMA这么好,是不是非要用呢?也不是。其实很多小程序都没有使用也没必要使用DMA,毕竟在程序中增加一个功能,也是需要时间成本的。笔者就写过好多小程序,大都使用中断就解决问题了,原因就是简单,上手快才是王道,老板才不管你是怎么干的,只要能实现目标就行。

那什么时候用DMA呢?笔者认为,当慢速外设通信比较多,数据量比较大的时候,如果使用中断会明显影响系统性能的时候,要用。当有大量高速AD转换的时候,要用。其实现在网络和USB接口,好多都自带DMA了。

3.DMA怎么用

这个事,还是让代码说话吧~~,一个例子胜过千言万语,明后天给大家讲基于DMA的串口通信。

码字很辛苦,大家的支持是我最大的动力,谢谢关注。

补充一点 ,响应中断时的压栈和结束中断时的出栈过程,在目前的单片机编程中,不需要程序员任何额外代码,编译器会自动完成的,咱们知道有这个过程就行了。而且为了缩短这个过程对CPU的影响,处理器厂家都做了很多工作。

DMA控制信号示意图

DMA总线示意图

相关问答

51 单片机 和stm 单片机 的区别?

两者的主要区别如下:1、内核:51单片机采用的是51Core,8Bit@2MHzMax(分频后),0.06DMIPS;STM32采用的是ARMCortex-M3,32Bit@72MHz,1....

单片机 有初步了解,如何快速掌握ARM32位开发呢?

当你对8位的单片机有一定的了解后,你对寄存器已经有了一个非常清晰的概念。8位机寄存器较少,平常使用到某些功能,直接自己写寄存器设置的相关代码,也能很快捷...

mcu和cpu和 单片机 的区别?

mcu又称单片微型计算机(SingleChipMicrocomputer)或者单片机,是把中央处理器(CentralProcessUnit;CPU)的频率与规格做适当缩减,并将内存(memo...

单片机 难还是linux难?

是linux难。MCU门槛低,入门容易,但是灵活,其实对工程师的软硬件功底要求更高,随着半导体的飞速发展,MCU能实现很多匪夷所思匪夷所思的功能,比如,使用GPIO模...

mcu芯片概念?

MCU是MicrocontrollerUnit的简称,中文叫微控制器,俗称单片机,是把CPU的频率与规格做适当缩减,并将内存、计数器、USB、A/D转换、UART、PLC、DMA等周边接口...

MCU是什么?

MCU是微控制单元(MicrocontrollerUnit;MCU),又称单片微型计算机(SingleChipMicrocomputer)或者单片机,是把中央处理器(CentralProc...

mcu规格是什么意思?

MCU是微控制单元,又称单片微型计算机或者单片机,是把中央处理器CPU的频率与规格做适当缩减,并将内存、计数器、USB、A/D转换、DMA等周边接口,甚至LCD驱动电...

STM32是什么啊,是32位的 单片机 吗 - 185****1270 的回答 - 懂得

stm32是一种32位的单片机。单片机是嵌入式系统中最常用的核心部件,stm32本质上也是一种单片机。从事嵌入式方面工作,如果有一定的基础,可以从STM32...

mcu与最小系统区别?

mcu又称单片微型计算机或者单片机,是把中央处理器的频率与规格做适当缩减,并将内存(memory)、计数器(Timer)、USB、A/D转换、UART、PLC、DMA等周边接口,甚至LC...

我想问一下,学过python,还用学c吗?求解答,谢谢?

IT行业发展到现在,编程语言已经不少了,根据目前整个IT行业的应用情况来看,热度比较靠前的依然是JAVA、C、Python。从学习编程语言来说,小编认为除了学好Pytho...

猜你喜欢