嵌入式编程——DMA 传输
龚建峰 研 1404 1415053004
本章我们将向大家介绍 STM32 的 DMA 功能。在本章中,我们将利用 STM32 的 DMA 的
功能通过串口 2 实现串口传输打印,按复位键,开始 LED1~LED4 灯全亮,然后传输完成是,
LED1,LED2 灯熄灭,电脑串口出现传输的数据。
1. STM32 DMA 简介
DMA 全称为:Direct Memory Access,即直接存储访问。DMA 是 STM32 中一
个独立与 Cortex-M3 内核的模块,有点类似与 ADC、PWM、TIMER 等模块;主要功
能是通信“桥梁”的作用,可以将所有外设映射的寄存器“连接”起来,这样就可以
高速问各寄存器,其传输不受 CPU 的支配,传输还是双向全工的。
DMA 传输将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化这个
传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个
外部内存的区块到芯片内部更快的内存区,DMA 传输对于高效能嵌入式系统算法和
网络是很重要的。DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样
保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的
通路,能使 CPU 的效率大为提高,这里需要注意的是在传输的过程中,CPU 是不参
与的,只有当启用结束 DMA 时,CPU 才会参与作用。
2. 本章原理
串口 2 以 DMA 方式发送数据。我们先定义 5200 个字节的数组 SendBuff[ ],
即开辟了一个空间,空间用于存放要发送的数据。将这个空间和串口用 DMA 方式绑
定。 DMA 传输是将数据从一个地址空间复制到另外一个地址空间。当 CPU 初始化
这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。如本实验中,我们先
将要发送的数据送入开辟的 SendBuff[ ]地址空间,初始化从这个地址空间向串口 2 发
送数据这个动作。初始化完成后,传输动作本身是由 DMA 控制器来实行和完成, 不
用 CPU 直接控制传输,我们只需要开启 DMA 传输即可。
接下来我们就介绍本实验的基本实现步骤:
1)对串口进行初始化。例如:调用函数 SZ_STM32_COMInit()设置使用的是串口 2,将
波特率配置成 115200。
2)调用函数 MYDMA_Config()配置 DMA。MYDMA_Config()函数初始化 串口 2
以 DMA 方式发送数据这个动作动作。具体配置的内容有:使能 DMA 传输、传入串口
2 使用的通道 7 等。
3)将待发送的数据传入我们开辟的空间 SendBuff[ ],即定义的数组。
4)调用 USART_DMACmd()函数,使能串口 2 的 DMA 发送 。
下面是 DMA 的 6 个寄存器:
寄存器 描述
DMA_ISR
DMA 中断状态寄存器
DMA_IFCR
DMA 中断标志位清除寄存器
DMA_CCRx
DMA 通道 x 设置寄存器
DMA_CNDTRx
DMA 通道 x 待传输数据数目寄存器
DMA_CPARx
DMA 外设地址寄存器
DMA_CMARx
DMA 内存地址寄存器