微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32 DMA数据搬运 操作寄存器+库函数

stm32 DMA数据搬运 操作寄存器+库函数

时间:11-09 来源:互联网 点击:
DMA(Direct Memory Access)常译为“存储器直接存取”。早在Intel的8086平台上就有了DMA应用了。

一个完整的微控制器通常由CPU、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,而各个组件的协调和交互就由CPU完成。如此一来,CPU作为整个芯片的核心,其处理的工作量是很大的。如果CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据。。。这样的数据搬运工作将使CPU的负荷显得相当繁重。

严格的说,搬运数据只是CPU的比较不重要的一种工作。CPU最重要的工作室进行数据运算,从加减乘除到一些高级的运算,包括浮点、积分、微分、FFT等。CPU还需要负责复杂的中断申请和响应,以保证芯片的实时性能。

理论上常见的控制外设,比如Usart、I2C、SPI甚至是USB等通信接口,单纯的利用CPU进行协议模拟也是可以实现的,比如51单片机经常使用I/O口模拟I2C协议通信。但这样既浪费了CPU的资源,同时实现后的性能表现往往和使用专门的硬件模块实现的效果相差甚远。从这个角度来看,各个外设控制器的存在,无疑降低了CPU的负担,解放了CPU的资源。

数据搬运这一工作占用了大部分的CPU资源,成为了降低CPU的工作效率的主要原因之一。于是需要一种硬件结构分担CPU这一职能 —— DMA。

从数据搬运的角度看,如果要把存储地址A的数值赋给另外一个地址上B的变量,CPU实现过程为首先读出A地址上的数据存储在一个中间变量,然后再转送到B地址的变量上。使用DMA则不需要中间变量,直接将A地址的数值传送到B地址的变量里。无疑减轻了CPU的负担,也提高了数据搬运的效率。

stm32中 DMA1有7个通道,DMA2有5个通道。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。

stm32的DMA1通道一览表

本例实现使用CPU和DMA搬运同一组数据,通过计时,比较两者的搬运效率。

直接操作寄存器

DMA的中断状态寄存器(DMA_ISR):

TEIFx:通道x的传输错误标志(x = 1 … 7) (Channel x transfer error flag) 硬件设置这些位。在DMA_IFCR寄存器的相应位写入’1’可以清除这里对应的标志位。

0:在通道x没有传输错误(TE); 1:在通道x发生了传输错误(TE)。

HTIFx:通道x的半传输标志(x = 1 … 7) (Channel x half transfer flag) 硬件设置这些位。在DMA_IFCR寄存器的相应位写入’1’可以清除这里对应的标志位。

0:在通道x没有半传输事件(HT); 1:在通道x产生了半传输事件(HT)。

TCIFx:通道x的传输完成标志(x = 1 … 7) (Channel x transfer complete flag) 硬件设置这些位。在DMA_IFCR寄存器的相应位写入’1’可以清除这里对应的标志位。

0:在通道x没有传输完成事件(TC); 1:在通道x产生了传输完成事件(TC)。

DMA_IFCR中断标志清除寄存器:

结构类似DMA_ISR。

CTEIFx:清除通道x的传输错误标志(x = 1 … 7) (Channel x transfer error clear) 这些位由软件设置和清除。 0:不起作用 1:清除DMA_ISR寄存器中的对应TEIF标志。

CHTIFx:清除通道x的半传输标志(x = 1 … 7) (Channel x half transfer clear) 这些位由软件设置和清除。 0:不起作用 1:清除DMA_ISR寄存器中的对应HTIF标志。

CTCIFx:清除通道x的传输完成标志(x = 1 … 7) (Channel x transfer complete clear) 这些位由软件设置和清除。 0:不起作用 1:清除DMA_ISR寄存器中的对应TCIF标志。

CGIFx:清除通道x的全局中断标志(x = 1 … 7) (Channel x global interrupt clear) 这些位由软件设置和清除。 0:不起作用 1:清除DMA_ISR寄存器中的对应的GIF、TEIF、HTIF和TCIF标志。

DMA通道配置寄存器(DMA_CCRx):

MEM2MEM:存储器到存储器模式 (Memory to memory mode) 该位由软件设置和清除。 0:非存储器到存储器模式; 1:启动存储器到存储器模式。

PL:通道优先级 (Channel priority level) 这些位由软件设置和清除。00:低 01:中 10:高 11:最高

MSIZE:存储器数据宽度 (Memory size) 这些位由软件设置和清除。 00:8位 01:16位 10:32位 11:保留

PSIZE:外设数据宽度 (Peripheral size) 这些位由软件设置和清除。 00:8位 01:16位 10:32位 11:保留

MINC:存储器地址增量模式 (Memory increment mode) 该位由软件设置和清除。 0:不执行存储器地址增量操作 1:执行存储器地址增量操作

PINC:外设地址增量模式 (Peripheral increment mode) 该位由软件设置和清除。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top