STM32之DMA(一)

简介:

DMA(直接存储器访问),在传输数据的时候,可以不用使用CPU,因此适用与传输大量数据。

功能框图:

(1)DMA请求:

外设要使用DMA传输数据之前,必须发送DMA请求给DMA控制器,DMA控制器接收到请求后发送应答信号,外设收到应答信号后,就可以利用DMA传输数据了。

stm32f103zet6有两个DMA(DMA1 DMA2),其中DMA1有7个传输通道,DMA2有5个传输通道。

(2)通道:

DMA1 7个通道所连外设请求:

DMA2 5个通道所连外设请求:

(3)仲裁器:

当一个通道同时有多个DMA请求,此时就必须有仲裁器决定应答哪一个请求。

仲裁器先根据软件级别的请求优先级来决定应答哪一个请求。可以通过DMA_CCRx来设置软件优先级。

当软件级别无法决定时(有多个高优先级请求),再根据硬件级别的优先级(通道编号小的优先级高于通道编号大,DMA1的优先级大于DMA2)。

数据传输方向:

1.外设到存储器 :如 ADC数据寄存器的数据传输到我们定义的缓冲区中。

2.存储器到外设:如  将我们自定义的数据传输到串口上。

3.存储器到存储器: 如 将内部FLASH的数据复制到SRAM中。

在数据传输的时候要保证发送端跟接收端的数据宽度一致  如:串口发送/接收8位为基本单位的数据,那我们的接收/发送缓冲区的基本单位为8位(uint8_t).

DMA初始化结构体:

传输数目:表示要传输多少数据, 如:uint8_t buff[]="hello world!";此时打算将buff的数据传输到串口中,那么这时传输数目为sizeof(buff)/sizeof(uint8_t).

外设地址/存储器地址增量模式:表示是否传输一个数据,地址是否要自增。一般外设的地址不用增加,数组的地址要增加。上面的例子中串口不用增加,数组要增加

模式选择:一次传输模式还是循环传输模式。上面例子,如果我们要一直发送"hello world",此时选择循环模式。

猜你喜欢

转载自www.cnblogs.com/nwjlq/p/12925916.html