本章参考资料:《STM32F76xxx参考手册》DMA控制器章节。
学习本章时,配合《STM32F76xxx参考手册》DMA控制器章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。本章内容专业名称较多,内容丰富也较难理解,但非常有必要细读研究。
特别说明,本章内容是以STM32F76xxx系列资源讲解。
21.1 DMA简介
DMA(Direct Memory Access,直接存储区访问)为实现数据高速在外设寄存器与存储器之间或者存储器与存储器之间传输提供了高效的方法。之所以称之为高效,是因为DMA传输实现高速数据移动过程无需任何CPU操作控制。从硬件层次上来说,DMA控制器是独立于Cortex-M7内核的,有点类似GPIO、USART外设一般,只是DMA的功能是可以快速移动内存数据。
STM32F7xx系列的DMA功能齐全,工作模式众多,适合不同编程环境要求。STM32F7xx系列的DMA支持外设到存储器传输、存储器到外设传输和存储器到存储器传输三种传输模式。这里的外设一般指外设的数据寄存器,比如ADC、SPI、I2C、DCMI等等外设的数据寄存器,存储器一般是指片内SRAM、外部存储器、片内Flash等等。
外设到存储器传输就是把外设数据寄存器内容转移到指定的内存空间。比如进行ADC采集时我们可以利用DMA传输把AD转换数据转移到我们定义的存储区中,这样对于多通道采集、采样频率高、连续输出数据的AD采集是非常高效的处理方法。
存储区到外设传输就是把特定存储区内容转移至外设的数据寄存器中,这种多用于外设的发送通信。
存储器到存储器传输就是把一个指定的存储区内容拷贝到另一个存储区空间。功能类似于C语言内存拷贝函数memcpy,利用DMA传输可以达到更高的传输效率,特别是DMA传输是不占用CPU的,可以节省很多CPU资源。
21.2 DMA功能框图
STM32F7xx系列的DMA可以实现外设寄存器与存储器之间或者存储器与存储器之间传输三种模式,这要得益于DMA控制器是采样AHB主总线的,可以控制AHB总线矩阵来启动AHB事务。图 21-1为DMA控制器的框图。
1.①外设通道选择
STM32F7xx系列资源丰富,具有两个DMA控制器,同时外设繁多,为实现正常传输,DMA需要通道选择控制。DMA控制器具有8个数据流,每个数据流可以提供多达16个外设请求。实际上STM32F767xx中DMA1只用了10个,DMA2只用了12个。在实现DMA传输之前,DMA控制器会通过DMA数据流x配置寄存器DMA_SxCR(x为0~7,对应8个DMA数据流)的CHSEL[3:0]位选择对应的通道作为该数据流的目标外设。
外设通道选择要解决的主要问题是决定哪一个外设作为该数据流的源地址或者目标地址。
DMA请求映射情况参考表 21-1和表 21-2。
外设请求 |
数据流0 |
数据流1 |
数据流2 |
数据流3 |
数据流4 |
数据流5 |
数据流6 |
数据流7 |
通道0 |
SPI3_RX |
SPDIFRX_DT |
SPI3_RX |
SPI2_RX |
SPI2_TX |
SPI3_TX |
SPDIFRX_CS |
SPI3_TX |
通道1 |
I2C1_RX |
I2C3_RX |
TIM7_UP |
|
TIM7_UP |
I2C1_RX |
I2C1_TX |
I2C1_TX |
通道2 |
TIM4_CH1 |
|
I2S3_EXT_RX |
TIM4_CH2 |
|
|
TIM4_UP |
TIM4_CH3 |
通道3 |
- |
TIM2_UP |
I2C3_RX |
|
I2C3_TX |
TIM2_CH1 |
TIM2_CH2 |
TIM2_UP |
通道4 |
UART5_RX |
USART3_RX |
UART4_RX |
USART3_TX |
UART4_TX |
USART2_RX |
USART2_TX |
UART5_TX |
通道5 |
UART8_TX |
UART7_TX |
TIM3_CH4 |
UART7_RX |
TIM3_CH1 |
TIM3_CH2 |
UART8_RX |
TIM3_CH3 |
通道6 |
TIM5_CH3 |
TIM5_CH4 |
TIM5_CH1 |
TIM5_CH4 |
TIM5_CH2 |
|
TIM5_UP |
|
通道7 |
|
TIM6_UP |
I2C2_RX |
I2C2_RX |
USART3_TX |
DAC1 |
DAC2 |
I2C2_TX |
通道8 |
I2C3_TX |
I2C4_RX |
|
|
I2C2_TX |
|
I2C4_TX |
|
通道9 |
|
SPI2_RX |
|
|
|
|
SPI2_TX |
|
外设请求 |
数据流0 |
数据流1 |
数据流2 |
数据流3 |
数据流4 |
数据流5 |
数据流6 |
数据流7 |
通道0 |
ADC1 |
SAI1_A |
TIM8_CH1 |
SAI1_A |
ADC1 |
SAI1_B |
TIM1_CH1 |
SAI2_B |
通道1 |
|
DCMI |
ADC2 |
ADC2 |
SAI1_B |
SPI6_TX |
SPI6_RX |
DCMI |
通道2 |
ADC3 |
ADC3 |
|
SPI5_TX |
SPI5_TX |
CRYP_OUT |
CRYP_IN |
HASH_IN |
通道3 |
SPI1_RX |
|
SPI1_RX |
SPI1_TX |
SAI2_A |
SPI1_TX |
SAI2_B |
QUADSPI |
通道4 |
SPI4_RX |
SPI4_TX |
USART1_RX |
SDMMC1 |
|