|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、DMA简介1 |. @( Y" Q5 A6 a8 I
1、DMA简介
K% ?6 B ?3 U- `$ E DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式。0 j& I" D4 Z2 Y
CPU有转移数据、计算、控制程序转移等很多功能,但其实转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,再加上一些控制转移的部件就可以完成数据的拷贝。. \% o9 N' x! L1 y- u4 w( ?* H% S
DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作--计算、控制等。9 ?2 m! Y2 U1 @# z R. m* R
2、DMA的工作原理
' j" F( ^% ^/ y0 S& X0 S" a DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
- C4 H- h1 @# E- E* X9 Y4 X 外设到内存
b: W* e! a4 f+ r 内存到外设
5 ^+ Z5 Z6 o/ K: b. \5 X( D% I( Z$ i 内存到内存( ?# _( e& K9 N. n4 P5 A; f
外设到外设
?5 e; I% C$ I4 \& ]0 @ 当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,传输的终点就是剩余传输数据量为0(循环传输不是这样的)。换句话说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。: I' n2 C) W0 o2 ]3 d' h% M
3、DMA是否影响CPU的运行, _" x" _( N% q0 k
在X86架构系统中,当DMA运作时(假设我们从磁盘拷贝一个文件到U盘),DMA实际上会占用系统总线周期中的一部分时间。也就是说,在DMA未开启前,系统总线可能完全被CPU使用;当DMA开启后,系统总线要为DMA分配一定的时间,以保证DMA和CPU同时运作。那么显然,DMA会降低CPU的运行速度。& @- l. a L3 E+ c/ `
在STM32控制器中,芯片采用Cortex-M3架构,总线结构有了很大的优化,DMA占用另外的总线,并不会与CPU的系统总线发生冲突。也就是说,DMA的使用不会影响CPU的运行速度。( u2 [4 [4 r6 V3 E7 K" T3 E, y' f
二、STM32的DMA结构8 A! [- H: L/ @' s6 _
1、DMA的主要特性
1 F. X2 Z; D- Z1 f# n% Z0 O/ C* V ● 12个 独立的可配置的通道(请求)DMA1有7个通道,DMA2 有5个通道& L1 o( e3 w7 s! T5 g
● 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过" _; G; A- w( O2 u- o# q; ], z0 K
软件来配置。; ~4 x+ L9 Y+ I+ B. h1 N* k
● 在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如在相
{! _2 n- s M0 d- d9 e2 B8 K7 X5 \ 等优先权时由硬件决定(请求0优先于请求1,依此类推) 。( \( V5 \/ p) {6 ]8 B
● 独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标4 }- M3 X* ?6 O5 \6 @
地址必须按数据传输宽度对齐。. D K2 Z' Y5 l
● 支持循环的缓冲器管理
/ j: ~' x6 J' ~ ● 每个通道都有3个事件标志(DMA 半传输,DMA传输完成和DMA传输出错),这3个事件标志
/ g' Z) `0 K4 M5 \7 }' d; d 逻辑或成为一个单独的中断请求。& o: y- m4 i J0 H, |( t# A0 r# w- ] j
● 存储器和存储器间的传输) l% e. r5 ]5 G0 b7 D
● 外设和存储器,存储器和外设的传输
3 U" S" f! j' F. i ● 闪存、SRAM 、外设的SRAM 、APB1 APB2和AHB外设均可作为访问的源和目标。$ r7 G4 h2 p# e9 B. A
● 可编程的数据传输数目:最大为65536
. o2 m; D, J; h& i* B 下面为功能框图:
4 x) V4 z9 E- g$ o" X
$ _/ h ~* V. i- e: @7 e
![]()
. m6 s) C- |2 T; Q 2、两个DMA控制器结构3 I- L6 D. G4 N) k3 P
① DMA1 controller
- `) p2 `5 U8 Y' e" l3 ^, g
J: c3 K; y' O0 A
![]()
8 M" x" @: e0 W3 v ② DMA2 controller
2 ]" h M! U2 N* o, N3 T1 Z
+ H: t; p/ {$ g4 n! M
) ^: ?7 a: \3 x; n
3、DMA寄存器列表9 c7 \. i' ?. k! F, E; D0 }
, D, X; l* K3 Z: H# u, [9 @' w/ X' R( Z) @
![]()
! o+ i# k/ P9 ^$ y/ Q* | ① 中断类8 P! ]0 l5 l- n' `* v
DMA_ISR: DMA中断状态寄存器: A9 O: a4 e3 m! Y7 ?4 S
DMA_IFCR: DMA中断标志位清除寄存器6 R; W7 {! v5 U8 r( q
说明: DMA1、DMA2分别有一组寄存器。
1 o( H* k0 v* w" x& |1 D' `) `5 s ② 控制传输类3 x2 a7 C* p3 n1 [' I) m' @" s
DMA_CCRx: DMA通道x配置寄存器" x3 B, w. U; b' x% b" Z, e# c
DMA_CNDTRx: DMA通道x数据数量寄存器4 U5 f8 D6 D |1 {
DMA_CPARx: DMA通道x外设地址寄存器$ c# b& h0 s+ D2 t: n
DMA_CMARx: DMA通道x内存地址寄存器
8 A: C% `' \: A8 O9 s( D; N 说明:0 o4 E4 q& l( S. K; }3 d- L
1> 每一个通道都有一组寄存器。
( l% w2 v( S; R9 V 2> DMA_CPARx、DMA_CMARx是没有差别的,它们都可以存放外设的地址、内存的地址。DMA_CPARx、DMA_CMARx只不过起得名字有差别而已。6 h O- _" L, S7 Q/ m- H9 @
4、STM32的DMA工作特点
- d' c% a9 g" U" s9 M3 q ① DMA进行数据传输的必要条件* ^3 p! h8 e, r
剩余传输数据量大于0% N6 \, B, V7 A3 B& Q0 Y6 C$ L
DMA通道传输使能
! M5 u- }4 H$ o- \ 通道上DMA数据传输有事件请求5 ]* @- U% b) Q' W! i( j# c, G
前两者都好理解,对于第三点确实需要详细的解释,请看下边的三条。- Y* H1 H" h; E9 s+ c3 ?
② 外设到XX方向的传输
& I& F- ~8 i4 o% ] 假设是ADC到存储器的数据传输,显然ADC的DMA传输的源地址是ADC的数据寄存器。并不是说只要DMA通道传输使能后,就立即进行数据传输。只有当一次ADC转化完成,ADC的DMA通道的传输事件有效,DMA才会从ADC的数据寄存器读出数据,写入目的地址。当DMA在读取ADC的数据寄存器时,同时使ADC的DMA通道传输事件无效。显然,要等到下一次ADC转换完成后,才能启动再一次的数据传输。
3 u+ d7 Q9 {+ L, U a ③存储器对XX的DMA传输: W$ q/ k% _# V/ n8 P
因为数据是准备好的,不像ADC还需要等待数据到位。所以,不需要对应通道的事件。只要使能DMA数据传输就一直传输,直到达到设定的传输量。. Q Z/ e* s2 Z7 @2 a& b
example:5 ~! G/ h- |( C% @3 V& a
1.内存到内存
5 y! s/ _8 ]' p5 `. H0 S! M DMA传输请求一直有效4 T4 `# {, R8 p! b! a; ]
2.内存到串口" @9 p& C% }$ K2 U; b$ T4 N) a, b
DMA传输请求一直有效% d' F" H- ]% ]% Q4 t {% i
一种解释:
0 Q/ o3 c- Y& P: w1 k' F 存储器对存储器的置位,就相当于相应通道的事件有效。 对应通道的事件有效和存储器对存储器的置位,就是传输的触发位。每次传输的事件置位一次,完成一次传输。如果是由外设引发的DMA传输,则传输完成后,相应传输事件会置为无效,而存储器对存储器的传输,则一次传输完成后,相应事件一直有效,直至完成设定的传输量。 0 M/ U3 w2 {' R
④外设以DMA方式工作时,能否再以软件方式进行操作?
( N) F u7 I/ H 有一点是肯定的,当外设以DMA方式正在数据传输时,不可能再相应CPU的软件控制命令,否则这不符合逻辑。
1 \# K2 }$ \. S/ l* k& z$ M9 O; T8 s 但是,倘若外设仅仅配置成DMA工作方式,但是DMA请求并未产生,数据传输并没有进行。此时,软件控制命令仍然能够对外设进行控制。这是笔者在串口以DMA方式发送数据情形下,所得到的测试结论。+ L! z: q, [6 T- g( p7 ?) Q) J
三、STM32的DMA软件编程
% \) k2 v- m! e- m/ P; f 1、“内存到内存”模式传输2 x) I+ `; p6 T5 Y
9 `7 L& q( {+ z* a* | 2、利用DMA实现循环传输
; ?0 e% U& g* Q3 E* ]6 i) ^ 方法1:单次传输模式
- B; E; U/ U) Q* u" }) |' } 当传输结束时,触发DMA中断,在中断程序中首先失能DMA通道,然后修改该通道的传输数据量。最后重新使能DMA通道,注意只有失能的DMA通道才能成功修改传输数据量。
! B9 w+ `' M c1 Q$ ~ 方法2:循环传输模式0 f+ @& a5 d0 t2 q* M0 }
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。5 g" a3 K( z/ |+ d
四、再谈STM32的DMA传输是否影响CPU的运行速度
. V+ D# H! D" Q: L! \; K3 }( T9 u 声明:经过笔者测试,当DMA工作在内存到外设的传输和内存到内存的传输时,都不会影响CPU的运行速度。为了给这种现象一个合理的解释,笔者做以下猜测:: n; P! u% E- ]" i+ O1 Y
1、S3C2440的DMA传输
9 |/ Q8 X* T: Q( l S3C2440的SDRAM是外置的,并且SDRAM的数据线、地址线、控制线总共只有一组。假设DMA传输的方向是内存到外设,当DMA运作时,需要占用SDRAM的三类线才才能实现传输;而与此同时CPU也需要通过这三类线来访问SDRAM来读取程序、读写数据。
1 d& v! u& S/ i7 ^3 i4 h% L 显然,DMA的运行与CPU的运行有交叉点,DMA就会影响到CPU的运行。* Q& a6 Y" s' P
2、STM32的DMA传输
9 X& V6 t; i; v N STM32与S3C2440的区别是很大的,S3C2440是微处理器,RAM外置且空间很大;STM32是微控制器,RAM片内集成且空间较小。此时,ST公司就有可能提升DMA的运作效率,使DMA的工作不影响到CPU的运行。
* T- G. [! D3 v0 K 外设与外设之间的DMA传输,因为与CPU的运行没有交叉点(CPU的数据流注意是在Flash、内存、寄存器中传输),所以不会影响CPU的运行速度。唯一有可能影响的是外设与内存或者内存与内存之间的DMA传输。
! w9 t; K8 e( |- ~/ V, W" g P+ ^1 i 倘若ST公司的SRAM是一个双口RAM,也就是同时可以由两组接口对RAM进行访问,就可以很好的解决速度影响问题。倘若CPU恒定占有一组接口,而另一组接口留给DMA控制器。那么当外设与内存或者内存与内存之间的DMA传输时,由于不与CPU的访问SRAM接口冲突,所以可以解决速度影响问题。, J5 j: ~. o8 M5 R! T5 T
但其实偶尔还是会影响的,当CPU访问SRAM的空间和DMA访问SRAM的空间相同时,SRAM势必会对这种情况进行仲裁,这可能会影响到CPU的访问SRAM的速度。其实,这种情况的概率也是很小的,所以即使影响CPU的运行速度,也不会很大。
- }) `' o0 S; \: R" V8 z, [, |5 q* n L7 N) t2 W
$ Z: t2 k& x3 H5 o! f
9 y+ W. T/ g9 w5 Z |
|