fccjxxw.com
非常超级学习网 学习超级帮手
当前位置:首页 >> 信息与通信 >>

STM32F2技术培训


直接存储器访问 DMA

1

培训内容
? DMA新增特性简介和功能框图
? 双AHB主端口和AHB总线矩阵

? DMA控制器的channel、stream和仲裁 ? FIFO(Vs. Direct模式) (STM32F2新增)
? 数据pack/unpack ? 突发传输模式

? ? ? ? ? ?

通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 流控(STM32F2新增) 事件、中断和错误管理 DMA stream配置流程 STM32F2和STM32F1的DMA比较
2

培训内容
? DMA新增特性简介和功能框图
? 双AHB主端口和AHB总线矩阵

? DMA控制器的channel、stream和仲裁 ? FIFO(Vs. Direct模式)
? 数据pack/unpack ? 突发传输模式

? ? ? ? ? ?

通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 流控(STM32F2新增) 事件、中断和错误管理 DMA stream配置流程 STM32F2和STM32F1的DMA比较
3

为何设计新DMA控制器
? STM32F1的DMA是“Lite” DMA, 只支持直接模 式,并且未对带宽使用作任何优化

? STM32F2在DMA上的主要提高
? 实现双AHB主接口,更好利用总线矩阵和并行传输 ? 为DMA stream增加各自的FIFO,弥补外设没有FIFO
? 新增Pack/Unpack特性,优化APB/AHB带宽 ? 支持突发模式,进一步优化AHB带宽

4

STM32F2的DMA特性简介
? 集成2个DMA控制器
? 每个控制器拥有双AHB主端口 ? 每个控制器集成8个stream ? DMA2上支持存储器之间的传输(DMA1控制器上不行)

? 通道选择可防止不同外设请求(channel)在通道(stream)上 的冲突 ? 每个stream拥有各自的4*32位FIFO
? 支持双端口不同的数据宽度:pack/unpack ? 支持突发传输模式

? 支持循环模式 ? 支持双缓冲模式 ? 5种事件管理
? 传输完成、完成一半、传输出错、FIFO错误、模式错误
5

DMA功能框图

6

DMA和总线矩阵

DMA访问存储器: Flash, SRAMs, FSMC

DMA访问外设: AHB-APB bridges; AHB1和AHB2上的外设 DMA旁路总线矩 阵来快速访问外设

7

DMA传输(1)
DMA2:APB2?Mem DMA2: APB2?AHB1/2和APB1/2

DMA1:APB1?Mem DMA1: APB1?AHB1/2或APB1/2 Not Possible

来自APB2外设 的DMA请求

一旦DMA控制器就绪,就 响应 APB2的DMA请求

8

DMA传输(2)

DMA2: APB1?AHB1/2或APB1/2

9

DMA传输小结
? DMA1控制器能实现的传输
? DMA1的AHB外设端口没有连到总线矩阵上
? DMA1不能访问AHB1/AHB2外设 ? DMA1只能做APB1和Memory之间的传输

? DMA2控制器能实现的传输
? DMA2的AHB外设端口和AHB存储器端口都连到总线矩阵上
? DMA2能实现所有可能的传输 ? 读、写路径都需要经过总线矩阵时,系统带宽减半

? 尽可能地使用DMA,以减少CPU负载

10

培训内容
? DMA新增特性简介和功能框图
? 双AHB主端口和AHB总线矩阵

? DMA控制器的channel、stream和仲裁 ? FIFO(Vs. Direct模式)
? 数据pack/unpack ? 突发传输模式

? ? ? ? ? ?

通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 流控(STM32F2新增) 事件、中断和错误管理 DMA stream配置流程 STM32F2和STM32F1的DMA比较
11

DMA的stream和channel
? 每个DMA控制器有8路stream
? REQ_STREAMx
? x=0~7

? 仲裁根据每个stream的优先级决定对哪个stream的DMA 请求进行服务
? 软件优先级:4个级别@DMA_SxCR ? 硬件优先级:stream序号越低硬件优先级越高

? 每个stream连到8个可能的外设请求(channel)
? 通道选择控制到底哪个外设请求连到某个stream ? CHSEL[2:0]@DMA_SxCR

12

Stream和Channel示意图
Channel Stream

13

DMA1上的通道映射
Stream 0
Ch0

Stream 1 ---TIM2_UP TIM2_CH3 USART3_R X -TIM5_CH4 TIM5_TRIG

Stream 2 SPI3_RX TIM7_UP -I2C3_RX UART4_RX TIM3_CH4 TIM3_UP TIM5_CH1

Stream 3 SPI2_RX -TIM4_CH2 -USART3_T X -TIM5_CH4 TIM5_TRIG

Stream 4 SPI2_TX TIM7_UP -I2C3_TX UART4_TX TIM3_CH1 TIM3_TRIG TIM5_CH2

Stream 5 SPI3_TX I2C1_RX -TIM2_CH1 USART2_R X TIM3_CH2 --

Stream 6 -I2C1_TX TIM4_UP TIM2_CH2 TIM2_CH4 USART2_T X -TIM5_UP

Stream 7 SPI3_TX I2C1_TX TIM4_CH3 TIM2_UP TIM2_CH4 UART5_TX TIM3_CH3 --

SPI3_RX I2C1_RX TIM4_CH1 -UART5_RX -TIM5_CH3 TIM5_UP

Ch1

Ch2

Ch3

Ch4

Ch5

Ch6

Ch7

--

TIM6_UP

I2C2_RX

I2C2_RX

USART3_T X

DAC1

DAC2

I2C2_TX

OR

OR

OR

OR

OR

OR

OR

OR

High Priority Request

DMA1控制器上的请求都来 自APB1上的外设
DMA1

Low Priority Request

14 14

DMA2上的通道映射
Stream 0
Ch0

Stream 1 --

Stream 2 TIM8_CH1/2 /3

Stream 3 --

Stream 4 ADC1

Stream 5 --

Stream 6 TIM1_CH1/2 /3

Stream 7 --

ADC1

Ch1

-ADC3 SPI1_RX --TIM1_TRIG -SW_Trigger

DCMI
ADC3 --USART6_R X TIM1_CH1 TIM8_UP
OR
SW_Trigger

ADC2
-SPI1_RX USART1_R X USART6_R X TIM1_CH2 TIM8_CH1
OR
SW_Trigger

ADC2
-SPI1_TX SDIO -TIM1_CH1 TIM8_CH2
OR
SW_Trigger

-----TIM1_CH4/_ TRIG/_COM TIM8_CH3
OR
SW_Trigger

-CRYP_OUT SPI1_TX USART1_R X -TIM1_UP -OR
SW_Trigger

-CRYP_IN -SDIO USART6_T X TIM1_CH3 -OR
SW_Trigger

DCMI
HASH_IN -USART1_T X USART6_T X -TIM8_CH4/_ TRIG/_COM
OR
SW_Trigger

Ch2

Ch3

Ch4

Ch5

Ch6

Ch7

OR

High Priority Request

DMA2控制器上的请求都来自 APB2和AHB2 DMA2 上的外设

Low Priority Request

15 15

培训内容
? DMA新增特性简介和功能框图
? 双AHB主端口和AHB总线矩阵

? DMA控制器的channel、stream和仲裁 ? FIFO(Vs. Direct模式)
? 数据pack/unpack ? 突发传输模式

? ? ? ? ? ?

通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 流控(STM32F2新增) 事件、中断和错误管理 DMA stream配置流程 STM32F2和STM32F1的DMA比较
16

每个DMA的每个stream都有一个FIFO
? FIFO大小:4*4字节 ? 所有传输都要经过FIFO
? 源地址?AHB主端口x?FIFO?AHB主端口y?目的地址 ? 是否使用FIFO门限,区别开FIFO模式和Direct模式
? FIFO常用于DMA控制器和Memories之间的缓冲 ? Memory-to-Memory必须使用FIFO模式

DMDIS

FTH 00

FIFO门限值 1/4 (4字节) 2/4 (8字节) 3/4 (12字节) 全满 (16字节)

FIFO的使用 从源地址来的数据先放在FIFO中, 达到门限后,再根据目地址的数 据宽度送出 数据放在FIFO,有DMA请求就送 走,和门限值无关

FIFO模式

1

01 10 11

Direct模式

0

17

不使用FIFO门限的Direct模式
? 默认DMA工作在Direct模式下 ? 常用于需要在每次DMA请求后都有立即和Memory 之间单次传输的应用场合
? 立即:不经过FIFO门限的累积 ? 单次:不是突发传输

? Direct模式的传输限制
? 源地址和目的地址的数据宽度必须一致
? 由PSIZE@DMA_SxCR控制,无论MSIZE的值

? 不能支持突发传输 ? 不支持Memory to Memory的传输

18

FIFO模式用途之一:数据pack/unpack
? 传输源头和目的地的数据宽度可以不同:
? 分别由PSIZE和MSIZE@DMA_SxCR指定 ? 数据的传输次数NDT是相对于PSIZE来说的

? 宽度不同时在FIFO中进行数据的pack/unpack
Data Packing Example (8-bit ? 32-bit)
T1 A1 T2 B1 T3 C1 A2 B2 C2 D2 T2 A1 B1 C1 D1 T1 T1 T1 A1 B1

Data Unpacking Example (32-bit ? 16-bit)
A1 B1 C1 D1

A1 B1 C1 D1 A2 B2 C2 D2

A1 B1 C1 D1
T2 C1 D1
T2

A2 B2 C2 D2

A2 B2 C2 D2
T3 A2 B2

T4
D1 T5 A2 T6 B2 T7 C2 T8 D2 T4 C2 D2

DMA FIFO ? Source data width = 8-bit ? Destination data width = 32-bit ? 8 transfers are performed from source to DMA FIFO. ? 2 transfers are performed from DMA FIFO to destination.

DMA FIFO ? Source data width = 32-bit ? Destination data width = 16-bit ? 2 transfers are performed from source to DMA FIFO. ? 4 transfers are performed from DMA FIFO to destination.

19

FIFO模式用途之二:突发Burst传输
? 突发传输中的每个数据项的传输是不可分割的
? AHB上的总线仲裁被锁定

? 突发传输可配置传输数据项的个数
? 数据项本身的字节数取决于目标地址的数据宽度 ? 两个AHB主端口上的突发配置是彼此独立的
? 外设端口上的burst size:PBURST@DMA_SxCR ? Mem端口上的burst size :MBURST@DMA_SxCR

? 突发传输要求对应AHB主端口连接的地址必须支持自加
? 外设端口上支持突发:必须满足PINC=1 ? Mem端口上支持突发:必须满足MINC=1

? 突发传输时的地址指针
? 必须和传输中字节数对齐 ? 不能跨越1KB进行突发传输,否则AHB报错,非DMA错误标志

? 与Burst对应的就是Single传输
? MBURST=0,或者PBURST=0
20

Burst传输 Vs. Single传输
Memory Memory

PINC=1 PBURST = 01: 4 beats 10: 8 beats 11: 16 beats

AHB外设主端口

AHBMem主端口

MINC=1

Burst FIFO

Burst

MBURST = 01: 4 beats 10: 8 beats 11: 16 beats

Single 寄存器
AHB外设 主端口 描述 寄存器 AHB存储 主端口 描述

Burst PBURST不为0,PINC必须置1
每次DMA请求产生4/8/16个(根据 PBURST)字节/半字/字(根据PSIZE) 数据的传输 MBURST不为0,MINC必须置1

PBURST=0,PINC无要求
每次DMA请求产生一次字节/半字 /字(根据PSIZE)数据的传输 MBURST=0,MINC无要求

每次DMA请求产生一次字节/半字 /字(根据MSIZE)数据的传输

每次DMA请求产生4/8/16个(根据 MBURST)字节/半字/字(根据MSIZE) 数据的传输
21

FIFO门限和Memory Burst Size的配置
? FIFO门限值一定要是MBurst传输数据量的整数倍
? 否则一旦使能该stream就产生FIFO错误
? 置位FEIFx@DMA_HISR或DMA_LISR

? 该stream被自动关闭 ? 错误举例:FIFO门限 = 3/4(12个字节) MSIZE = 半字(2个字节) MBURST = INC4(4个beat) ? 错误举例:FIFO大小= 16个字节 MSIZE = 字(4个字节) MBURST = INC8(8个beat)

非整数倍

一次突发传输传送8个字节

? 一次Memory Burst传输的数据量不能超过FIFO大小
数据量超过FIFO 一次突发传输 传送32个字节

? FIFO中剩余“尾巴”数据

? 什么情况下FIFO中会有“尾巴数据”??NDTR还未自减到0的情 况下,不再有数据进入FIFO;并且现有数据还未达到FIFO门限 ? “尾巴数据”如何处理?? FIFO Flush

22

FIFO的刷新
? 当Stream被配置成P?M或M?M,如果有“尾巴” 数据残存在FIFO中
? 可以通过复位EN@DMA_SxCR来刷新该FIFO,把剩余 数据送往目的Memory ? 传送完成后硬件置位TCIFx(传输完成标志) ? DMA_SxNDTR中保持刷新FIFO之前的值
CASE A ?

CASE B?

? 如果剩余数据少于MSIZE,DMA会以MSIZE的量来传送数据 ? Memory会被多写入不需要的数据,因此需要参考 DMA_SxNDTR来决定哪些是真正的数据 ? 如果剩余数据不足一次Memory Burst传输的数据量 ? 使用single传输来完成”尾巴数据”到目标地址的传输
字 字 字 节 节 节 2 3

NDTR初值 = 8 NDTR现在 = 5 TCIFx = 0

FIFO

FIFO门限8字节 MSIZE = 半字 MBURST=4

Memory

字 字 字 节 节 节 2 3

NDTR = 5,由此知道 只有前3个数据有效

1

1

CASE B
FIFO刷新

FIFO刷新完成:TCIFx = 1

CASE A
多余的数据

23

培训内容
? DMA新增特性简介和功能框图
? 双AHB主端口和AHB总线矩阵

? DMA控制器的channel、stream和仲裁 ? FIFO(Vs. Direct模式)
? 数据pack/unpack ? 突发传输模式

? ? ? ? ? ?

通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 流控(STM32F2新增) 事件、中断和错误管理 DMA stream配置流程 STM32F2和STM32F1的DMA比较
24

DMA传输的普通过程
? 外设事件产生后,外设给DMA控制器发送DMA请求。 DMA控制器根据通道优先级来决定响应哪个请求。 DMA控制器访问外设的同时,发送应答给外设;外 设收到应答后释放请求信号,然后DMA也释放应答 信号。 ? 三个步骤
? 从DMA_SxPAR指定的外设数据寄存器或DMA_SxM0AR 指定的存储器地址取得数据 ? 传输完成后DMA_SxNDTR自减 ? 存储到DMA_SxPAR指定的外设数据寄存器或 DMA_SxM0AR指定的存储器地址

25

外设到Memory的传输
外设 AHB外设主端口 Memory AHBMem主端口

FIFO

DIR@DMA_SxCR 00 (P?M) FIFO模式

传输源地址(外设) DMA_SxPAR

传输目的地址(Memory) DMA_SxM0AR

置位EN来使能Stream;一旦有外设的DMA请求,就以PSIZE的宽度从外设取数据 放到FIFO; 一旦达到FIFO门限,从FIFO按照MSIZE为单位往Memory发送数据

两端数据宽度必须一致: Direct模式 置位EN来使能Stream;一旦有外设的DMA请求,就以PSIZE的宽度从外设取数据 放到FIFO; 并立即从FIFO按照PSIZE为单位往Memory发送数据。

26

Memory到外设的传输
外设 AHB外设主端口 Memory AHBMem主端口

FIFO

DIR@DMA_SxCR 01 (M?P) FIFO模式

传输源地址(外设) DMA_SxM0AR

传输目的地址(Memory) DMA_SxPAR

置位EN来使能Stream;立马不断从Memory以MSIZE为单位取数据放到FIFO,直 到达到门限;一旦有外设DMA请求,FIFO中数据以PSIZE向外设发送数据

Direct模式

置位EN来使能Stream;立马从Memory以PSIZE为单位取一次数据放到FIFO;外 设有DMA请求了,数据从FIFO送到外设;FIFO空了则又立马从Memory取数据

27

Memory到Memory的传输
Memory AHB外设主端口 Memory AHBMem主端口

FIFO

DIR@DMA_SxCR 11

传输源地址(外设) DMA_SxPAR

传输目的地址(Memory) DMA_SxM0AR

FIFO模式 Direct模式

置位EN来使能Stream;立马不断从源Memory以MSIZE为单位取数据放到FIFO, 直到达到门限;达到门限后,FIFO中数据以PSIZE向目的Memory发送数据

28

三种传输模式的比较
? FIFO模式下(使能Stream后) ? P和FIFO之间的传输(P?FIFO & FIFO?P)
? 只要有外设DMA请求就传进/传走,没有“直到”

? M到FIFO的传输
? 立马就一次次按MSIZE传进,直到FIFO门限

? FIFO到M的传输
? 只要达到门限就把FIFO中全部数据按MSIZE传走 ? single模式下:MSIZE规定的数据量 ? Burst模式下:MSIZE*MBURST规定的数据量
传输条件 源地址到FIFO P?FIFO?M M?FIFO?M M?FIFO?P 一旦有外设DMA请求 立马,直到达到FIFO门限 立马,直到达到FIFO门限 FIFO到目的地址 一旦达到FIFO门限 一旦达到FIFO门限 一旦有外设DMA请求
29

刷新FIFO

若FIFO中数据不到门 限,需刷新FIFO内容 ? FIFO Flush

传输实例:ADC ? Memory location
? PSIZE = 字节宽度 ? MSIZE = 半字宽度 ? 双方数据宽度不同,必须使用FIFO
? FH门限 = 半满(8字节)
RAM
ADC_DR
A1 T1 A1 B1 T2 A1 B1 T3 C1 A2 B2 C2 D2 B1 C1 D1

Memory location 1

C1 D1

? full

A2 B2

C2 D2

Size: Byte
DMA FIFO

Size: Half word

30

Case1:PBurst=MBurst=0
? 外设端口和内存端口都没有使用突发传输 ? NDTR=12
? 总的数据传输量是12字节(以PSIZE为单位)

? 传输过程
? 每次ADC的一个字节传输到FIFO,NDTR自减一次 ? 8次ADC传输后
? NDTR已经自减到4 ? FIFO中8字节数据达到门限,所有这8个字节以MSIZE,即半字 为单位进行传输

? 再经过4次ADC传输
? NDTR自减到0,触发硬件自动把这未达到FIFO门限的4个字节 以MSIZE为单位传输到目标内存地址 ? 传输完毕后硬件置位TCIF
31

Case2:PBurst=0,MBurst=INCR4
? 内存端口使用突发传输
? 一次批量传输4*2=8个字节

? NDTR=12
? 总的数据传输量是12字节(以PSIZE为单位)

? 传输过程
? 每次ADC的一个字节传输到FIFO,NDTR自减一次 ? 8次ADC传输后
? NDTR已经自减到4 ? FIFO中8字节数据达到门限,所有这8个数据被一次性传输到目 标内存地址,8个数据之间的传输不会被打断

? 再经过4次ADC传输
? NDTR自减到0,触发硬件自动把这未达到FIFO门限的4个字节 以半字为单位传输到目标内存地址 ? 传输完毕后硬件置位TCIF
32

Case3:PBurst=MBurst=0
? 外设端口和内存端口都没有使用突发传输
? 一次批量传输4*2=8个字节

? NDTR=16
? 预计总的数据传输量是16字节(以PSIZE为单位)

? 传输过程
? 每次ADC的一个字节传输到FIFO,NDTR自减一次 ? 8次ADC传输后
? NDTR已经自减到8 ? FIFO中8字节数据达到门限,所有这8个字节以MSIZE,即半字 为单位进行传输

? 再经过4次ADC传输,ADC停止
? NDTR自减到4 ? 用户通过复位EN来刷新FIFO ? 传输完毕后硬件置位TCIF,NDTR仍保持=4
33

培训内容
? DMA新增特性简介和功能框图
? 双AHB主端口和AHB总线矩阵

? DMA控制器的channel、stream和仲裁 ? FIFO(Vs. Direct模式)
? 数据pack/unpack ? 突发传输模式

? ? ? ? ? ?

通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 流控(STM32F2新增) 事件、中断和错误管理 DMA stream配置流程 STM32F2和STM32F1的DMA比较
34

循环模式
? 使能:CIRC@DMA_SxCR ? 用途:处理连续数据流,比如ADC扫描数据
? 循环模式下,NDTR个数据项传输完成后,自动重装载 初始NDTR,继续响应DMA请求 ? 非循环模式下,NDTR个数据项传输完成后,不再响应 DMA请求;要重新往NDTR装载新的数据项个数,需要 先关闭该stream

? 循环模式下不允许memory-to-memory ? 如果循环模式下也使能了突发传输,对NDTR有如 下要求:
? 是(MBURST*MSIZE)的整数倍 ? 是(PBURST*PSIZE)的整数倍 ? 是(MBURST*MSIZE)/(PSIZE)的整数倍
35

双缓冲模式
? 使能:DBM@DMA_SxCR
? 双缓冲模式下,循环模式自动使能,无视CIRC ? 不允许memory-to-memory传输

? 工作原理
? 具有两个memory地址指针指向两个存储块
? DMA_SxM0AR:指向存储块0 ? DMA_SxM1AR:指向存储块1

? DMA访问完一个存储块,TCIF置位;并自动切换到访问另一个存 储块;自动来回切换
? “访问”:DMA往存储块发送数据或者从存储块取出数据 ? 两个方向都支持

? DMA正在访问的存储块由CR@DMA_SxCR表示
? CT = 0:DMA正在访问存储块0,CPU可以访问存储块1 Stream使能的情 况下CT位只读 ? CT = 1: DMA正在访问存储块1, CPU可以访问存储块0 ? Stream关闭的情况下可以写CT位来表示DMA先访问的数据块
36

动态调整存储块地址
? 支持动态调整存储块的地址指针
? CPU可以动态修改DMA不在访问的存储块地址指针 ? 修改DMA正在访问的存储块地址会导致错误标志TEIF置位,并自 动关闭该stream ? 建议在TCIF置位时根据CT修改

? 非双缓冲模式下的存储块地址指针在使能stream后就被写 保护,不能被动态修改
DMA_SxM0AR DMA_SxM1AR DMA_SxPAR
CT = 1

Memory location 1

Memory location 0

CT

TC

HT
CT = 0

Peripheral Data Register

37

培训内容
? DMA新增特性简介和功能框图
? 双AHB主端口和AHB总线矩阵

? DMA控制器的channel、stream和仲裁 ? FIFO(Vs. Direct模式)
? 数据pack/unpack ? 突发传输模式

? ? ? ? ? ?

通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 硬件流控(STM32F2新增) 事件、中断和错误管理 DMA stream配置流程 STM32F2和STM32F1的DMA比较
38

DMA传输的流控
? 每个stream的流控方式可彼此独立配置
? PFCTRL@DMA_SxCR

? PFCTRL =0:DMA控制器进行流控
? 在使能stream之前,在DMA_SxNDTR中指定需要传输 的数据项个数 ? Memory-to-Memory的传输,一定是DMA作流控

? PTCTRL =1:外设进行流控
? 由外设(SDIO)在传输最后一个数据时给DMA控制器发 出硬件信号 ? 用户写入DMA_SxNDTR的值没有意义
? 外设流控模式下不支持循环传输 ? 每次传输后,NDTR仍会自减

? 使能stream后DMA_SxNDTR的值被硬件置成0xFFFF
39

硬件流控下的DMA传输
? 硬件流控下一旦使能stream,NDTR初始化成0xffff ? 在还未收到外设信号之前,软件复位EN
? 该stream被关闭并置位TCIF ? 在P?M传输模式下,启动FIFO刷新 ? 传输完成的数据项 = 0xFFFF – DMA_SxNDTR

? 在NDTR还未自减到0之前,收到外设发来的信号
? 在当前传输结束之后,中断该stream并置位TCIF ? 传输完成的数据项 = 0xFFFF – DMA_SxNDTR

? NDTR自减到0了,还未收到外设的信号
? 该stream被关闭并置位TCIF ? 传输完成的数据项 =0xFFFF =65535
40

培训内容
? DMA新增特性简介和功能框图
? 双AHB主端口和AHB总线矩阵

? DMA控制器的channel、stream和仲裁 ? FIFO(Vs. Direct模式)
? 数据pack/unpack ? 突发传输模式

? ? ? ? ? ?

通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 流控(STM32F2新增) 事件、中断和错误管理 DMA stream配置流程 STM32F2和STM32F1的DMA比较
41

DMA的中断源
? 2个事件和3个错误都可触发DMA中断
? 使能相应中断控制位前,对应标志需要清零;否则一旦 使能就立刻产生中断 ? 2个事件:HalfTransfer 和 TransferComplete ? 3个错误:TransferErr、FifoErr和DirectModeErr
中断源 事件 事件标志 中断使能控制位

传输完成一半
传输完成 传输错误 FIFO错误

HTIF
TCIF TEIF FEIF

HTIE
TCIE TEIE FEIE

错误

Direct模式错误

DMEIF

DMEIE
42

传输完成事件
? 以下多种情况都会产生传输完成事件(TC):
? DMA控制器作为流控
? M?P传输模式下,DMA_SxNDTR自减到0 ? DMA_SxNDTR自减到0之前,用户复位EN来关闭该stream ? 对于P?M或M?M的传输模式,还要求FIFO中的“尾巴数 据”通过刷新FIFO权都被传输到目标地址之后才置位TCIF

? 外设SDIO作为流控
? 外设发出最后一个传输请求结束 ? 对于P?M的传输模式,还要求FIFO中的“尾巴数据” 通 过刷新FIFO也被传送到目标存储块之后,置位TCIF ? 传输结束之前,用户复位EN来关闭该stream ? 对于P?M的传输模式下,还要求FIFO中的“尾巴数据” 通过刷新FIFO也被传送到目标存储块之后,才置位TCIF

43

培训内容
? DMA新增特性简介和功能框图
? 双AHB主端口和AHB总线矩阵

? DMA控制器的channel、stream和仲裁 ? FIFO(Vs. Direct模式)
? 数据pack/unpack ? 突发传输模式

? ? ? ? ? ?

通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 流控(STM32F2新增) 事件、中断和错误管理 DMA stream配置流程 STM32F2和STM32F1的DMA比较
44

DMA Stream配置流程
? 复位EN@DMA_SxCR来先关闭该stream
? 必须通过读取EN为0来确认该stream被真正关闭以接受重新配置

? 设置外设地址DMA_SxPAR ? 设置存储块地址DMA_SxMA0R ? 双缓冲模式下,还需设置DMA_SxMA1R ? 设置DMA传输的数据项个数DMA_SxNDTR
? 每个单次或突发传输后自减

? ? ? ? ?

选择该stream上的外设请求CHSEL@DMA_SxCR 如果外设是SDIO且作为流控,设置PFCTRL 配置该stream的软件优先级PL@DMA_SxCR 配置FIFO的使用情况 配置数据传输方向、外设/Mem端口地址调整方案、数据宽 度、单次/突发传输、循环或双缓冲模式;使能事件和错误 中断 ? 置位EN@DMA_SxCR来激活该stream
45

培训内容
? DMA新增特性简介和功能框图
? 双AHB主端口和AHB总线矩阵

? DMA控制器的channel、stream和仲裁 ? FIFO(Vs. Direct模式)
? 数据pack/unpack ? 突发传输模式

? ? ? ? ? ?

通用DMA传输过程 循环模式和双缓冲模式(STM32F2新增) 流控(STM32F2新增) 事件、中断和错误管理 DMA stream配置流程 STM32F2和STM32F1的DMA比较
46

DMA控制器框图比较

>> 双AHB主端口架构 >> 采用通道选择器而非以前的“或”门, 从而避免同一个通道上不同请求的冲突 >> 每个通道有各自独立的FIFO

47

DMA特性比较
STM32F2 通道数目 通道上不同外设请求 FIFO(可关闭) 突发传输模式 8+8=16个 有通道选择器控制 每个通道有4*32位FIFO 有 STM32F1 7+5=12个 或门,有干扰

双缓冲模式(可关闭)
存储器之间(软件触发)传输 通道优先级控制 外设流控 中断/事件标志

存储器之间的传输
仅在DMA2支持 软件+硬件 仅SDIO有 两个DMA均支持

5个(新增FIFO错误/直接 传输错误标志)

3个

48

寄存器比较
STM32 F2 中断状态寄存器 中断状态寄存器 LISR(r) STM32 F1 每通道4状态位, 8通道可一个寄存 器表示 [异]GIFx ISR(r) IFCR(w)

HISR(r)
LIFCR(r/w) HIFCR(r/w)

每通道5个状态位,两个寄存 器各表示4通道 [异]FEIF/DMEIF [同]TEIF/HTIF/TCIF CHSEL/通道选择器 M(P)BURST/突发模式 CT/DBM/双Buf模式 PINCOS/外设地址调整 PFCTRL/外设流控 DMEIE/直接模式错误使能

配置寄存器

SxCR

CCRx

PL/M(P)SIZE/M(P)INC/CIRC/DIR/EN/3共有事件

数目寄存器
外设地址

SxNDTR
SxPAR

CNDTRx
CPARx

内存地址
FIFO控制 SxFCR

SxM0(M1)AR/配合双Buf模式
FIFO门限/FIFO错误使能/直接模式使能

CMARx

49


更多相关文章:

非常超级学习网 fccjxxw.com

copyright ©right 2010-2021。
非常超级学习网内容来自网络,如有侵犯请联系客服。zhit325@126.com|网站地图