
01. DMA简介 直接存储器访问 (DMA) 用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。+ }, S: \, r2 [. ] * V) R- |! p1 q+ k4 o DMA 控制器基于复杂的总线矩阵架构,将功能强大的双 AHB 主总线架构与独立的 FIFO 结合在一起,优化了系统带宽。. K( E, J, a. [3 a) k& ^ 两个 DMA 控制器总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8 个通道(或称请求)。每个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。 02. DMA主要特性3 o6 T/ c% D" u3 F" W# | DMA 主要特性是:, T* J6 H# T+ o9 B5 f ● 双 AHB 主总线架构,一个用于存储器访问,另一个用于外设访问# F7 t {$ M- X ● 仅支持 32 位访问的 AHB 从编程接口 ● 每个 DMA 控制器有 8 个数据流,每个数据流有多达 8 个通道(或称请求) ● 每个数据流有单独的四级 32 位先进先出存储器缓冲区 (FIFO),可用于 FIFO 模式或直接模式:$ O4 V& g3 j8 z2 @1 d) g3 F — FIFO 模式:可通过软件将阈值级别选取为 FIFO 大小的 1/4、1/2 或 3/41 G- p- n( s5 @) G6 e) e& ` — 直接模式 每个 DMA 请求会立即启动对存储器的传输。当在直接模式(禁止 FIFO)下将 DMA请求配置为以存储器到外设模式传输数据时,DMA 仅会将一个数据从存储器预加载到内部 FIFO,从而确保一旦外设触发 DMA 请求时则立即传输数据。0 i* q5 J% @* C {; T2 c . E$ v$ _4 d; o+ Q! W6 O5 M ● 通过硬件可以将每个数据流配置为:( |& k+ N$ {7 w+ m W8 z/ x! O — 支持外设到存储器、存储器到外设和存储器到存储器传输的常规通道 — 也支持在存储器方双缓冲的双缓冲区通道) J; T/ Q6 e- E; C: `+ h* X( l ● 8 个数据流中的每一个都连接到专用硬件 DMA 通道(请求) ● DMA 数据流请求之间的优先级可用软件编程(4 个级别:非常高、高、中、低),在软件优先级相同的情况下可以通过硬件决定优先级(例如,请求 0 的优先级高于请求 1) ● 每个数据流也支持通过软件触发存储器到存储器的传输(仅限 DMA2 控制器)) z2 O1 k5 \' R: h/ ~ ● 可供每个数据流选择的通道请求多达 8 个。此选择可由软件配置,允许几个外设启动 DMA请求 ● 要传输的数据项的数目可以由 DMA 控制器或外设管理: — DMA 流控制器:要传输的数据项的数目是 1 到 65535,可用软件编程 — 外设流控制器:要传输的数据项的数目未知并由源或目标外设控制,这些外设通过硬件发出传输结束的信号0 g$ x# W A9 P# ?- t7 H ● 独立的源和目标传输宽度(字节、半字、字):源和目标的数据宽度不相等时,DMA 自动封装/解封必要的传输数据来优化带宽。这个特性仅在 FIFO 模式下可用。 2 o7 P+ I! E. ?$ v4 x ● 对源和目标的增量或非增量寻址. C+ M, l% M+ m1 z+ @7 o ● 支持 4 个、8 个和 16 个节拍的增量突发传输。突发增量的大小可由软件配置,通常等于外设 FIFO 大小的一半8 d1 ~3 y2 ^: T4 g ● 每个数据流都支持循环缓冲区管理9 `0 ~- ~* P: O! Z ● 5 个事件标志(DMA 半传输、DMA 传输完成、DMA 传输错误、DMA FIFO 错误、直接模式错误),进行逻辑或运算,从而产生每个数据流的单个中断请求 ( G6 t2 x. _% w' f 03. DMA框图 ![]() 5 c3 q/ t1 H# D) C+ Z. s! i; ? DMA 控制器执行直接存储器传输:因为采用 AHB 主总线,它可以控制 AHB 总线矩阵来启动 AHB 事务。' q1 z; Q9 z, G: R 它可以执行下列事务:2 ^7 J$ l2 I+ ^0 t5 z1 D8 D! _ ● 外设到存储器的传输0 \6 Z/ J5 x& r6 V6 m ● 存储器到外设的传输 ● 存储器到存储器的传输 9 |# k. d0 R' y, h' f w. ? DMA 控制器提供两个 AHB 主端口:AHB 存储器端口 (用于连接存储器)和 AHB 外设端口(用于连接外设)。但是,要执行存储器到存储器的传输,AHB 外设端口 必须也能访问存储器。* v+ w: [2 S* H; S5 n7 n AHB 从端口用于对 DMA 控制器进行编程(它仅支持 32 位访问)。 : E4 F+ z3 z4 u. p 有关两个 DMA 控制器的系统实现 : L# _0 h2 j" `$ B# R' F4 ^8 ] ![]() 04. DMA事务$ |0 F+ w) x. _" w8 ~6 q+ |! ] DMA 事务由给定数目的数据传输序列组成。要传输的数据项的数目及其宽度(8 位、16 位或 32 位)可用软件编程。 每个 DMA 传输包含三项操作: ● 通过 DMA_SxPAR 或 DMA_SxM0AR 寄存器寻址,从外设数据寄存器或存储器单元中加载数据。 ● 通过 DMA_SxPAR 或 DMA_SxM0AR 寄存器寻址,将加载的数据存储到外设数据寄存器或存储器单元。 ● DMA_SxNDTR 计数器在数据存储结束后递减,该计数器中包含仍需执行的事务数。$ K) |4 @' h H1 s 在产生事件后,外设会向 DMA 控制器发送请求信号。DMA 控制器根据通道优先级处理该请求。只要 DMA 控制器访问外设,DMA 控制器就会向外设发送确认信号。外设获得 DMA 控制器的确认信号后,便会立即释放其请求。一旦外设使请求失效,DMA 控制器就会释放确认信号。如果有更多请求,外设可以启动下一个事务。# [! Y$ @/ @& K; A 05. 通道选择7 }& E0 L5 G6 g- M* U 每个数据流都与一个 DMA 请求相关联,此 DMA 请求可以从 8 个可能的通道请求中选出。此选择由 DMA_SxCR 寄存器中的 CHSEL[2:0] 位控制。 ![]() ![]() 2 j9 \5 Q; A( P4 i ![]() 06. 仲裁器 仲裁器为两个 AHB 主端口(存储器和外设端口)提供基于请求优先级的 8 个 DMA 数据流请求管理,并启动外设/存储器访问序列。 优先级管理分为两个阶段: ● 软件:每个数据流优先级都可以在 DMA_SxCR 寄存器中配置。分为四个级别:- p& A0 f" @' O% N — 非常高优先级 — 高优先级 — 中优先级/ p2 L# j( X) w. ?1 N( |, v" M — 低优先级) p& e, Q7 i) @ ● 硬件:如果两个请求具有相同的软件优先级,则编号低的数据流优先于编号高的数据流。例如,数据流 2 的优先级高于数据流 4。1 y* W0 T. U/ t" E" h6 N 07. DMA数据流" _- W, d9 y3 B. H& q 8 个 DMA 控制器数据流都能够提供源和目标之间的单向传输链路。 M& \5 @& }/ C" Q% Z, {% O/ G" f 每个数据流配置后都可以执行:& }- ?; ^! X& h" T7 H( }" H9 w ● 常规类型事务:存储器到外设、外设到存储器或存储器到存储器的传输。! k6 p) m$ ] i) D ● 双缓冲区类型事务:使用存储器的两个存储器指针的双缓冲区传输(当 DMA 正在进行自/至缓冲区的读/写操作时,应用程序可以进行至/自其它缓冲区的写/读操作)。 要传输的数据量(多达 65535)可以编程,并与连接到外设 AHB 端口的外设(请求 DMA 传输)的源宽度相关。每个事务完成后,包含要传输的数据项总量的寄存器都会递减。# H9 ?/ _% L) m4 I: c) t . d" C/ g8 ^% ?' t/ ? 08. DMA中断 对于每个 DMA 数据流,可在发生以下事件时产生中断: ● 达到半传输& [- q' @# `8 ^( ^6 E5 B ● 传输完成7 k1 n! g% C1 K1 _ d* { ● 传输错误 ● FIFO 错误(上溢、下溢或 FIFO 级别错误) ● 直接模式错误 ![]() 2 e% N) e8 i" g$ h) A `$ Q 09. DMA寄存器 9.1 DMA 低中断状态寄存器 (DMA_LISR) DMA low interrupt status register) f# C! G$ h$ m) j) I# A/ G 偏移地址:0x004 ]& A* P- o. D& k 复位值:0x0000 0000 ![]() 9.2 DMA 高中断状态寄存器 (DMA_HISR)( y- K5 p9 m1 E1 L- E$ U# K DMA high interrupt status register$ F3 A$ Y6 A$ a 偏移地址:0x04 复位值:0x0000 00000 r! w: D' |$ l. f : C, a6 V3 _8 m ![]() 1 I8 _: z5 [( ~ T# G: g# v, ~ 9.3 DMA 低中断标志清零寄存器 (DMA_LIFCR)" P' B; `" O' v9 a( e DMA low interrupt flag clear register4 Y1 z$ b! A0 O 偏移地址:0x08& E/ Z. j t4 P- `6 y 复位值:0x0000 0000/ l7 ~/ p' J, F6 Y! H+ `& j! q : y T+ }9 @8 Z% C" K$ J' D2 E ![]() & Q5 \' e4 X" Y+ m, N' I$ P$ _ 9.4 DMA 高中断标志清零寄存器 (DMA_HIFCR)/ b/ Z) }" h: F+ l DMA high interrupt flag clear register 偏移地址:0x0C 复位值:0x0000 00009 S) b0 T" v9 s" v- t7 G7 i 5 M2 G5 Y. b0 L( ? 9.5 DMA 数据流 x 配置寄存器 (DMA_SxCR) (x = 0…7)/ [% k( s2 c9 o" ~; Y, K0 b; k; W1 t DMA stream x configuration register 此寄存器用于配置相关数据流。% E( n2 e# K2 V) Q4 \5 T! n 偏移地址:0x10 + 0x18 × 数据流编号. W% r" a; s5 k( _* y3 l7 w: g 复位值:0x0000 0000& \) u* I3 z2 r& I' c9 Y3 w! }4 j8 @ & G: s% q( P m# @ ![]() 0 g. }6 n4 `- J0 _3 x' S 9.6 DMA 数据流 x 数据项数寄存器 (DMA_SxNDTR) (x = 0…7) DMA stream x number of data register 偏移地址:0x14 + 0x18 × 数据流编号 复位值:0x0000 0000% F0 K4 R0 B: B$ p7 H% Y4 F ![]() 9.7 DMA 数据流 x 外设地址寄存器 (DMA_SxPAR) (x = 0…7)/ i1 b& c3 c7 c DMA stream x peripheral address register! u8 @3 `& x) d: W6 R2 m( S ^ 偏移地址:0x18 + 0x18 × 数据流编号8 a* {3 M& ?: c& r, U5 @ 复位值:0x0000 0000 ![]() / C; T4 r7 W4 F3 ~% @ 9.8 DMA 数据流 x 存储器 0 地址寄存器 (DMA_SxM0AR) (x = 0…7)% y* S% q+ J* r0 Y7 m5 c DMA stream x memory 0 address register 偏移地址:0x1C + 0x18 × 数据流编号 复位值:0x0000 00006 X4 X0 r& W+ e0 A & j6 i) d' ~4 J ![]() 9.9 DMA 数据流 x 存储器 1 地址寄存器 (DMA_SxM1AR) (x = 0…7) DMA stream x memory 1 address register+ _( ~, j3 ~2 }& @" O 偏移地址:0x20 + 0x18 × 数据流编号4 J7 C, E1 P' C9 O 复位值:0x0000 0000 ; r o3 n! s9 K- Z5 @+ ~) b ![]() " @3 G# j3 q- k3 w* F P% i9 r 9.10 DMA 数据流 x FIFO 控制寄存器 (DMA_SxFCR) (x = 0…7) DMA stream x FIFO control register 偏移地址:0x24 + 0x24 × 数据流编号/ ^1 B- U/ o8 O# x6 I7 k 复位值:0x0000 0021+ X: U! H, {/ {+ T2 ? ) D' }7 J9 M) [8 _8 a ![]() |
【STM32U3评测】SPIDMA发送
实战经验 | TrustZone应用中串口通信的DMA传输失败问题
狂欢三】STM32C031使用TIM定时器DMA方式实现WS2812彩灯输出(三)
stm32使用定时器触发dma传输,启动dma没反应的几种情况的解决方法
STM32的DMA双缓冲模式详解
基于STM32的心率计以DMA方式获取传感器数据经验分享
基于STM32利用ADC+DMA采样显示经验分享
【经验分享】STM32使用DMA接收串口数据
基于STM32的DMA经验分享
基于STM32的ADC+DMA采样与板载运放跟随经验分享