目录

DMA概述

STM32中的DMA

DMA的通道

DMA处理

数据传输方向

DMA_CCRx寄存器

DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)

仲裁器

DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)

​可编程的数据量

DMA通道x配置寄存器(DMA_CCRx)(x = 1...7) 

指针增量

存储器到存储器

通道传输数据量

 中断

通道的配置过程

DMA相关函数配置

DMA_Init

DMA_Cmd

 DMA_ITConfig 

DMA_SetCurrDataCounter

DMA_GetCurrDataCounter

DMA_GetFlagStatus

 DMA_ClearFlag

DMA_GetITStatus

DMA_ClearITPendingBit

常用的外设DMA使能库函数

ADC

DAC

​USART

​I2C

​TIM 

 DMA的初始化配置

1. 使能DMA时钟

2. 初始化DMA通道参数

3. 使能DMA发送,使能外设DMA使能函数

4. 使能DMA通道,启动传输

5. 查询DMA传输状态

6. 获取或设置通道当前剩余数据量


DMA概述

Direct Memory Access

直接存储器访问

DMA传输将数据从一个地址空间复制到另一个地址空间

由CPU初始化这个DMA传输动作,动作本身由DMA控制器完成

DMA传输通过硬件为RAM和IO设备之间开辟一条直接传输数据的通道,提高了CPU的运行效率

STM32中的DMA

STM32最多有2个DMA控制器,其中大容量产品有2个DMA控制器,小容量产品只有1个

DMA1有7个通道,DMA2有5个通道

每个通道专门用来管理来自于一个或多个外设对存储器访问的请求

还有一个仲裁协调各个DMA请求的优先权

STM32的DMA操作_初始化

STM32的DMA具有以下特征:

  • 每个通道都直接连接专用的硬件DMA请求,支持软件触发,可以通过软件进行配置
  • 优先级可以通过软件编程设置,共4级
  • 独立的源和目标数据区的传输宽度,模拟打包和拆包过程,源和目标地址必须按数据传输宽度对齐
  • 支持循环的缓冲器管理
  • 每个通道都有3个事件标志(DMA半传输,DMA传输完成,DMA传输出错),这3个事件都可以成为单独的中断 
  • 外设和存储器,存储器和外设,存储器和存储器之间
  • 存储包括:FLASH,SRAM,外设的SRAM
  • 外设包括:APB1,APB2和AHB
  • 可编程的数据传输数目:最大为65536
DMA的通道

DMA1有7个通道

STM32的DMA操作_单片机_02

STM32的DMA操作_单片机_03

DMA处理

在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求

当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给他一个应答信号

当从DMA控制器得到应答信号时,外设立即释放它的请求,一旦释放了这个请求,DMA控制器同时撤销应答信号

每次DMA传送由3个操作完成:

  • DMA_CPARx存储的是外设的基地址,DMA_CMARx存储额是存储器的基地址,这两个要先赋值好
  • DMA_CNDTRx包含未完成操作的数目,在DMA_CNDTRx寄存器中,每完成一次发送,这个DMA_CNDTRx寄存器的值会减1
数据传输方向

DMA_CCRx寄存器

DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)

STM32的DMA操作_stm32_04

仲裁器

DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)

同样是在这个寄存器,可以配置通道的优先级

STM32的DMA操作_arm_05可编程的数据量

DMA通道x配置寄存器(DMA_CCRx)(x = 1...7) 

源和目标的数据宽度一致时是最方便的

STM32的DMA操作_stm32_06

指针增量

STM32的DMA操作_stm32_07

存储器到存储器

还需要设置DMA_CCRx的MEM2MEM位

通道传输数据量

在DMA_CNDTRx寄存器中配置,虽然这是一个32的寄存器,但是只用到了低16位,所以最大数据量为2的16次方-1

STM32的DMA操作_stm32_08

 中断

STM32的DMA操作_初始化_09

通道的配置过程

1. 设置DMA_CPARx(外设地址)和DMA_CMARx(存储器地址)的值

2. 设置传输方向,通过DMA_CCRx寄存器

3. 设置传输数据量,在DMA_CNDTRx寄存器

4. 设置传输优先级,在DMA_CCRx寄存器中

5. 设置是否循环模式,外设和存储器的增量模式

6. 数据宽度,中断配置,5和6都是在DMA_CCRx寄存器中进行配置

7. 在DMA_CCRx寄存器中进行ENABLE位的配置

当传输一半的数据后,半传输标志HTIF为1,当设置了允许半传输中断位HTIE时,将产生中断请求。在传输数据结束后,传输完成标志TCIF为1,当设置了允许传输完成中断位TCIE后,将产生一个中断请求


DMA相关函数配置

DMA_Init

STM32的DMA操作_arm_10

DMA_Cmd

STM32的DMA操作_单片机_11

 DMA_ITConfig 

STM32的DMA操作_初始化_12

DMA_SetCurrDataCounter

STM32的DMA操作_stm32_13

DMA_GetCurrDataCounter

STM32的DMA操作_初始化_14

DMA_GetFlagStatus

STM32的DMA操作_寄存器_15

 DMA_ClearFlag

STM32的DMA操作_stm32_16

DMA_GetITStatus

STM32的DMA操作_初始化_17

DMA_ClearITPendingBit

STM32的DMA操作_寄存器_18


常用的外设DMA使能库函数

ADC

STM32的DMA操作_arm_19

DAC

STM32的DMA操作_stm32_20USART

STM32的DMA操作_寄存器_21I2C

STM32的DMA操作_arm_22TIM 

STM32的DMA操作_stm32_23

STM32的DMA操作_寄存器_24


 DMA的初始化配置

STM32的DMA操作_stm32_25

STM32的DMA操作_寄存器_26

1. 使能DMA时钟

2. 初始化DMA通道参数

3. 使能DMA发送,使能外设DMA使能函数

4. 使能DMA通道,启动传输

5. 查询DMA传输状态

6. 获取或设置通道当前剩余数据量