STM32库开发实战指南-M4:21-DMA—直接存储区访问

  • 格式:pdf
  • 大小:528.07 KB
  • 文档页数:20
FIFO 用于在源数据传输到目标地址之前临时存放这些数据。可以通过 DMA 数据流 xFIFO 控制寄存器 DMA_SxFCR 的 FTH[1:0]位来控制 FIFO 的阈值,分别为 1/4、1/2、3/4 和满。如果数据存储量达到阈值级别时,FIFO 内容将传输到目标中。
FIFO 对于要求源地址和目标地址数据宽度不同时非常有用,比如源数据是源源不断的 字节数据,而目标地址要求输出字宽度的数据,即在实现数据传输时同时把原来 4 个 8 位 字节的数据拼凑成一个 32 位字数据。此时使用 FIFO 功能先把数据缓存起来,分别根据需 要输出数据。
21.3 DMA 数据配置
DMA 工作模式多样,具有多种可能工作模式,具体可能配置见表 21- 3。 表 21- 3 DMA 配置可能情况
DMA 传输模式
外设 到存储器

AHB 外设端口
目标
流控制器
AHB
DMA
存储器端口
循环模式 允许
传输类型 单次
直接模式 双缓冲模式
允许
允许
第 194 页 共 996
零死角玩转 STM32—F429
外设
存储器 到外设
AHB
AHB
存储器端口 外设端口
DMA 外设
存储器 到存储器
AHB
AHB
存储器端口 存储器端口
仅 DMA
禁止 允许 禁止 禁止
突发 单次 突发 单次 突发 单次 突发 单次 突发
禁止 允许 禁止 允许 禁止 允许 禁止
禁止
禁止 允许 禁止 禁止
1. DMA 传输模式
SPI3_TX
通道 1 I2C1_RX 通道 2 TIM4_CH1
TIM7_UP
TIM7_UP I2C1_RX I2C1_TX I2C1_TX
I2S3_EXT_
I2S2_EXT_ I2S3_EXT_
TIM4_C
TIM4_CH2
TIM4_UP
RX
TX
TX
H3
第 191 页 共 996
零死角玩转 STM32—F429
DAC1
TIM2_CH 2
TIM2_CH 4
USART2_ TX
UART8_R X
TIM5_UP
DAC2
TIM2_U P
TIM2_C H4
UART5_ TX
TIM3_C H3
I2C2_TX
表 21- 2 DMA2 请求映射
外设 请求 通道 0
通道 1
数据流 0 ADC1
数据流 1 数据流 2
TIM8_CH1 TIM8_CH2 TIM8_CH3
DMA 数据流 x 数据项数 DMA_SxNDTR(x 为 0~7)寄存器用来记录当前仍需要传输数目, 它是一个 16 位数据有效寄存器,即最大值为 65535,这个值在程序设计是非常有用也是需
第 195 页 共 996
零死角玩转 STM32—F429
要注意的地方。我们在编程时一般都会明确指定一个传输数量,在完成一次数目传输后 DMA_SxNDTR 计数值就会自减,当达到零时就说明传输完成。
通过 DMA_SxCR 寄存器的 CIRC 位可以使能循环模式。
5. 传输类型
DMA 传输类型有单次(Single)传输和突发(Burst)传输。突发传输就是用非常短时间结 合非常高数据信号率传输数据,相对正常传输速度,突发传输就是在传输阶段把速度瞬间 提高,实现高速传输,在数据传输完成后恢复正常速度,有点类似达到数据块“秒传”效 果。为达到这个效果突发传输过程要占用 AHB 总线,保证要求每个数据项在传输过程不 被分割,这样一次性把数据全部传输完才释放 AHB 总线;而单次传输时必须通过 AHB 的 总线仲裁多次控制才传输完成。
TIM1_CH TIM1_CH2
1
TIM1_C TIM1_CO
H1
M
TIM1_UP TIM1_CH3
TIM1_TR
IG
TIM8_CH4
通道 7
TIM8_UP TIM8_CH1
TIM8_C TIM8_CH
H2
3
SPI5_RX
SPI5_TX
TIM8_TRI G
TIM8_CO
M
每个外设请求都占用一个数据流通道,相同外设请求可以占用不同数据流通道。比如
2. ②仲裁器
一个 DMA 控制器对应 8 个数据流,数据流包含要传输数据的源地址、目标地址、数 据等等信息。如果我们需要同时使用同一个 DMA 控制器(DMA1 或 DMA2)多个外设请求 时,那必然需要同时使用多个数据流,那究竟哪一个数据流具有优先传输的权利呢?这就 需要仲裁器来管理判断了。
仲裁器管理数据流方法分为两个阶段。第一阶段属于软件阶段,我们在配置数据流时 可以通过寄存器设定它的优先级别,具体配置 DMA_SxCR 寄存器 PL[1:0]位,可以设置为 非常高、高、中和低四个级别。第二阶段属于硬件阶段,如果两个或以上数据流软件设置 优先级一样,则他们优先级取决于数据流编号,编号越低越具有优先权,比如数据流 2 优 先级高于数据流 3。
DMA1 的存储区端口相比 DMA2 的要减少 AHB2 外设的访问权,同时 DMA1 外设端 口是没有连接至总线矩阵的,只有连接到 APB1 外设,所以 DMA1 不能实现存储器到存储 器传输。
图 21- 2 两个 DMA 控制器系统实现
5. ⑥编程端口
AHB 从器件编程端口是连接至 AHB2 外设的。AHB2 外设在使用 DMA 传输时需要相 关控制信号。
SPI1_RX SPI1_TX
SPI1_TX
通道 4 SPI4_RX
SPI4_TX
USART1_R X
SDIO
USART1_ RX
SDIO
USART1_ TX
通道 5
USART6_ USART6_R
RX
X
SPI14_R XSPILeabharlann _TXUSART6_ TX
USART6_ TX
TIM1_CH
4
通道 6 TIM1_TRIG
TIM5_CH1
I2C2_RX
I2S2_EXT_ RX
USART3_T X
UART7_R X
TIM5_CH4 TIM5_TRI
G
I2C2_RX
I2C3_TX
UART4_T X
TIM3_CH1 TIM3_TRI
G
TIM5_CH2
USART3_ TX
TIM2_CH1 USART2_
RX TIM3_CH2
当选择外设到存储器模式时,即设置 DMA_SxCR 寄存器的 DIR[1:0] 位为“00”, DMA_SxPAR 寄存器为外设地址,也是传输的源地址,DMA_SxM0AR 寄存器为存储器地 址,也是传输的目标地址。对于存储器到存储器传输模式,即设置 DIR[1:0] 位为“10”时, 采用与外设到存储器模式相同配置。而对于存储器到外设,即设置 DIR[1:0]位为“01”时, DMA_SxM0AR 寄存器作为为源地址,DMA_SxPAR 寄存器作为目标地址。
通道 3 通道 4 通道 5 通道 6 通道 7
I2S3_EXT_ RX
UART5_R X
UART8_T X
TIM5_CH3 TIM5_UP
TIM2_UP TIM2_CH
3
USART3_ RX
UART7_T X
TIM5_CH 4
TIM5_TRI G
TIM6_UP
I2C3_RX
UART4_R X
TIM3_CH4 TIM3_UP
2. 源地址和目标地址
DMA 数据流 x 外设地址 DMA_SxPAR(x 为 0~7)寄存器用来指定外设地址,它是一个 32 位数据有效寄存器。DMA 数据流 x 存储器 0 地址 DMA_SxM0AR(x 为 0~7) 寄存器和 DMA 数据流 x 存储器 1 地址 DMA_SxM1AR(x 为 0~7) 寄存器用来存放存储器地址,其中 DMA_SxM1AR 只用于双缓冲模式,DMA_SxM0AR 和 DMA_SxM1AR 都是 32 位数据有效 的。
外设通道选择要解决的主要问题是决定哪一个外设作为该数据流的源地址或者目标地 址。
DMA 请求映射情况参考表 21- 1 和表 21- 2。
表 21- 1 DMA1 请求映射
外设请
数据流
数据流 0 数据流 1 数据流 2 数据流 3 数据流 4 数据流 5 数据流 6

7
通道 0 SPI3_RX
SPI3_RX SPI2_RX SPI2_TX SPI3_TX
数据流 3
数据流 4 ADC1
数据流 5 数据流 6 数据流 7
TIM1_CH1 TIM1_CH2 TIM1_CH3
DCMI
ADC2
ADC2
SPI6_TX SPI6_RX
DCMI
通道 2
ADC3
ADC3
SPI5_TX
SPI5_TX
CRYP_OU T
CRYP_IN
HASH_IN
通道 3 SPI1_RX
3. ③FIFO
每个数据流都独立拥有四级 32 位 FIFO(先进先出存储器缓冲区)。DMA 传输具有 FIFO 模式和直接模式。
直接模式在每个外设请求都立即启动对存储器传输。在直接模式下,如果 DMA 配置 为存储器到外设传输那 DMA 会见一个数据存放在 FIFO 内,如果外设启动 DMA 传输请求 就可以马上将数据传输过去。
零死角玩转 STM32—F429
图 21- 1 DMA 框图
1. ①外设通道选择
STM32F4xx 系列资源丰富,具有两个 DMA 控制器,同时外设繁多,为实现正常传输, DMA 需要通道选择控制。每个 DMA 控制器具有 8 个数据流,每个数据流对应 8 个外设请 求。在实现 DMA 传输之前,DMA 控制器会通过 DMA 数据流 x 配置寄存器 DMA_SxCR(x 为 0~7,对应 8 个 DMA 数据流)的 CHSEL[2:0]位选择对应的通道作为该数据流的目标外设。