一、DMA介绍
1、什么是DMA?
令人头秃的描述:
DMA(Direct Memory Access
,直接存储器访问
)
提供在
外设与内存
、
存储器和存储器
、
外设
与外设
之间的高速数据传输使用。它允许不同速度的硬件装置来沟通,而不需要依赖于
CPU
,在这个时间中,
CPU
对于内存的工作来说就无法使用。
简单描述:
就是一个
数据搬运工
!!
2、DMA的意义
代替
CPU
搬运数据,为
CPU
减负。
1.
数据搬运的工作比较耗时间;
2.
数据搬运工作时效要求高(有数据来就要搬走);
3.
没啥技术含量(
CPU
节约出来的时间可以处理更重要的事)。
3、搬运什么数据?
存储器、外设
这里的外设指的是
spi
、
usart
、
iic
、
adc
等基于
APB1
、
APB2
或
AHB
时钟的外设,而这里的存
储器包括自身的闪存
(flash)
或者内存
(SRAM)
以及外设的存储设备都可以作为访问地源或者目
的。
三种搬运方式:
存储器
→
存储器(例如:复制某特别大的数据
buf
)
存储器
→
外设 (例如:将某数据
buf
写入串口
TDR
寄存器)
外设
→
存储器 (例如:将串口
RDR
寄存器写入某数据
buf
)
4、DMA 控制器
STM32F103
有
2
个
DMA
控制器,
DMA1
有
7
个通道,
DMA2
有
5
个通道。
一个通道每次只能搬运一个外设的数据!!
如果同时有多个外设的
DMA
请求,则按照优先级进
行响应。
DMA1
有
7
个通道:
DMA2有5个通道
5、DMA及通道的优先级
优先级管理采用软件
+
硬件:
软件:
每个通道的优先级可以在
DMA_CCRx
寄存器中设置,有
4
个等级
最高级
>
高级
>
中级
>
低级
硬件:
如果
2
个请求,它们的软件优先级相同,则较低编号的通道比较高编号的通道有较高
的优先权。
比如:如果软件优先级相同,通道
2
优先于通道
4
DMA
传输方式
DMA_Mode_Normal
(正常模式)
一次
DMA
数据传输完后,停止
DMA
传送 ,也就是只传输一次
DMA_Mode_Circular
(循环传输模式)
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。 也就是
多次传输模式
指针递增模式
外设和存储器指针在每次传输后可以自动向后递增或保持常量。当设置为增量模式时,下一个要
传输的地址将是前一个地址加上增量值
实验一、内存到内存搬运
实验要求
使用
DMA
的方式将数组
A
的内容复制到数组
B
中,搬运完之后将数组
B
的内容打印到屏幕。
CubeMX配置
DMA
配置:
使用printf就要重写fputc函数
用到的库函数
1. HAL_DMA_Start
HAL_StatusTypeDef
HAL_DMA_Start
(
DMA_HandleTypeDef
*