|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、DMA简介
) G, @7 F8 O9 }' v# m 1、DMA简介& o& t( }! D( u0 l7 Q
DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式。
$ E- I4 R$ c" r y CPU有转移数据、计算、控制程序转移等很多功能,但其实转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,再加上一些控制转移的部件就可以完成数据的拷贝。
P9 N3 X- ?9 h% v& K6 W1 C' G DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作--计算、控制等。2 a1 B$ N4 f/ h- ~( X5 F
2、DMA的工作原理4 p& k9 ^/ y+ L& y4 s8 E
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:- Y2 ~# |/ R- f! k8 }
外设到内存
1 K' u( `6 [% {) B- J 内存到外设
9 ~. b Y% ?9 ^+ v( j6 }+ u- r 内存到内存, g. t0 ?0 L+ k
外设到外设
: m: b2 S* _, u2 i 当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,传输的终点就是剩余传输数据量为0(循环传输不是这样的)。换句话说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。
7 N0 x X- E9 e2 K( l. G 3、DMA是否影响CPU的运行- ?; ^1 {, m. B3 N1 d1 D0 {! _9 M
在X86架构系统中,当DMA运作时(假设我们从磁盘拷贝一个文件到U盘),DMA实际上会占用系统总线周期中的一部分时间。也就是说,在DMA未开启前,系统总线可能完全被CPU使用;当DMA开启后,系统总线要为DMA分配一定的时间,以保证DMA和CPU同时运作。那么显然,DMA会降低CPU的运行速度。
. d5 u/ X$ }5 H; }) | 在STM32控制器中,芯片采用Cortex-M3架构,总线结构有了很大的优化,DMA占用另外的总线,并不会与CPU的系统总线发生冲突。也就是说,DMA的使用不会影响CPU的运行速度。2 r+ ?' U z% c2 I; b
二、STM32的DMA结构5 o9 J: M" J/ i
1、DMA的主要特性* @; ^/ t. q3 Y# H1 H
● 12个 独立的可配置的通道(请求)DMA1有7个通道,DMA2 有5个通道
, I `7 L' s" o9 K) p" } ● 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过
; D/ p0 X0 x* q- J; L 软件来配置。( g5 L; L& v$ _) U- g4 P# t# Y
● 在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如在相
0 p2 [* L/ X+ b$ ~ 等优先权时由硬件决定(请求0优先于请求1,依此类推) 。
$ I' C5 ]) D3 ^7 c3 `' H' h- S ● 独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标
9 T/ v" V6 x5 ?' p 地址必须按数据传输宽度对齐。
1 \; l7 f) J& {2 P, }' C/ _ ● 支持循环的缓冲器管理
% B" ~4 y1 N" r. Z# D ● 每个通道都有3个事件标志(DMA 半传输,DMA传输完成和DMA传输出错),这3个事件标志5 l2 H9 x6 [$ z& { ~
逻辑或成为一个单独的中断请求。
- W; N5 B6 X' h' a' a; \! `, N ● 存储器和存储器间的传输( x6 X7 x7 H. y- o6 V
● 外设和存储器,存储器和外设的传输; Z: {2 q. t" V6 H
● 闪存、SRAM 、外设的SRAM 、APB1 APB2和AHB外设均可作为访问的源和目标。
9 C) s8 a1 _( ^" q: B ● 可编程的数据传输数目:最大为65536
" x) [, _: d9 @9 A. x T- L 下面为功能框图:
' V# s; x$ x# C3 Y& j1 L3 A
+ f; z+ _ M m* |0 ^! g
1 }+ d- P7 ^' K& @! O) N
2、两个DMA控制器结构
! X2 Q. O7 k X" L/ k& I ① DMA1 controller
0 I% R6 }8 J9 O2 n% i
+ d1 `% ~7 ?2 R1 H+ C
![]()
+ `- I- O0 u6 V+ t ② DMA2 controller( G% a% \4 i4 C9 Q1 D4 o1 Y5 q8 x. V
6 W3 O. ~" W3 @' y 2 u5 \' z! f5 ^9 ]
3、DMA寄存器列表+ m# ]- O: o" B$ w4 m% v3 R6 N
; f$ o9 s" N8 u; l
! U q# a. J- g5 M( H
① 中断类
9 e$ }. S: F: |9 [* Y DMA_ISR: DMA中断状态寄存器
! F) O) X) I+ u! v2 q2 j& ?& u DMA_IFCR: DMA中断标志位清除寄存器
/ [# @" O1 h. s# R* g U; C 说明: DMA1、DMA2分别有一组寄存器。# l6 Z; @1 W& X1 x2 k6 a0 t
② 控制传输类4 e# _$ k: [" k( {* c5 M- S4 Z" e% I
DMA_CCRx: DMA通道x配置寄存器, ?2 Y2 M+ T1 T e4 f S7 ^. G2 U
DMA_CNDTRx: DMA通道x数据数量寄存器4 b: `+ M$ o! n- O1 k: N
DMA_CPARx: DMA通道x外设地址寄存器
3 }1 A2 j- H/ g DMA_CMARx: DMA通道x内存地址寄存器+ j4 N- x! j7 o" x& B2 Z f
说明:
- P% n+ v. Q# i" I. n; `2 m 1> 每一个通道都有一组寄存器。
% B$ @# s8 x1 }$ z 2> DMA_CPARx、DMA_CMARx是没有差别的,它们都可以存放外设的地址、内存的地址。DMA_CPARx、DMA_CMARx只不过起得名字有差别而已。
' p. X7 R$ `2 `" Y 4、STM32的DMA工作特点
: {: r, m2 ?1 M4 E$ l# d1 j ① DMA进行数据传输的必要条件
3 Z9 S# m; J5 u 剩余传输数据量大于0
Z2 f" k9 ]2 G I# V- p DMA通道传输使能
/ B5 d* m- M3 W, J 通道上DMA数据传输有事件请求 [2 x- C/ G$ B
前两者都好理解,对于第三点确实需要详细的解释,请看下边的三条。3 j! x0 K. W0 u8 t$ i
② 外设到XX方向的传输
/ f( q- Q1 y D, _5 Q# g+ E 假设是ADC到存储器的数据传输,显然ADC的DMA传输的源地址是ADC的数据寄存器。并不是说只要DMA通道传输使能后,就立即进行数据传输。只有当一次ADC转化完成,ADC的DMA通道的传输事件有效,DMA才会从ADC的数据寄存器读出数据,写入目的地址。当DMA在读取ADC的数据寄存器时,同时使ADC的DMA通道传输事件无效。显然,要等到下一次ADC转换完成后,才能启动再一次的数据传输。& O+ i( Y) o; p/ o) A
③存储器对XX的DMA传输
5 {: V9 ?* |' T 因为数据是准备好的,不像ADC还需要等待数据到位。所以,不需要对应通道的事件。只要使能DMA数据传输就一直传输,直到达到设定的传输量。. h, \ ?( h8 S4 n
example:4 }1 O) z" y0 ^2 g( X
1.内存到内存( X) e* i) z; a# T
DMA传输请求一直有效# W( |: W! Q# s6 Q) z% P( N+ a
2.内存到串口- k/ F" M3 M* D) p
DMA传输请求一直有效( ?. V9 V. q# V
一种解释:
# o1 ~$ u+ C; Z 存储器对存储器的置位,就相当于相应通道的事件有效。 对应通道的事件有效和存储器对存储器的置位,就是传输的触发位。每次传输的事件置位一次,完成一次传输。如果是由外设引发的DMA传输,则传输完成后,相应传输事件会置为无效,而存储器对存储器的传输,则一次传输完成后,相应事件一直有效,直至完成设定的传输量。
# O( ?* P5 F, u" ~ ④外设以DMA方式工作时,能否再以软件方式进行操作?
2 s1 o( ?$ V! m4 R, T 有一点是肯定的,当外设以DMA方式正在数据传输时,不可能再相应CPU的软件控制命令,否则这不符合逻辑。
+ N- j l7 k; y/ j) G! ^ 但是,倘若外设仅仅配置成DMA工作方式,但是DMA请求并未产生,数据传输并没有进行。此时,软件控制命令仍然能够对外设进行控制。这是笔者在串口以DMA方式发送数据情形下,所得到的测试结论。' {3 N" j% f( t! t. J/ Z
三、STM32的DMA软件编程+ r' s- X; B3 z6 p2 T9 P
1、“内存到内存”模式传输
8 q2 g# Y2 q+ @4 }/ E
' ]9 X7 A, \% }
2、利用DMA实现循环传输" v2 C2 H* e3 @6 G
方法1:单次传输模式
/ a* R5 S* J7 q4 {' V4 E0 m* } 当传输结束时,触发DMA中断,在中断程序中首先失能DMA通道,然后修改该通道的传输数据量。最后重新使能DMA通道,注意只有失能的DMA通道才能成功修改传输数据量。( l! i* z6 e+ [! a' t% e3 q3 {" A% H
方法2:循环传输模式9 D% B* ]4 \9 F/ j2 L( k7 W9 T
当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。
% B$ b' u& Q3 p2 s0 O 四、再谈STM32的DMA传输是否影响CPU的运行速度
' ~3 ~: R, H2 P6 @4 S0 H2 U& b 声明:经过笔者测试,当DMA工作在内存到外设的传输和内存到内存的传输时,都不会影响CPU的运行速度。为了给这种现象一个合理的解释,笔者做以下猜测:3 ?3 T }% x- |3 W
1、S3C2440的DMA传输5 A" v5 B" x2 q, R' n1 _% ?+ u2 B9 w
S3C2440的SDRAM是外置的,并且SDRAM的数据线、地址线、控制线总共只有一组。假设DMA传输的方向是内存到外设,当DMA运作时,需要占用SDRAM的三类线才才能实现传输;而与此同时CPU也需要通过这三类线来访问SDRAM来读取程序、读写数据。
1 w8 ~& W% W( L" N# u3 g ?0 r 显然,DMA的运行与CPU的运行有交叉点,DMA就会影响到CPU的运行。& r' h& @2 d9 Q% G' y8 z4 X5 l
2、STM32的DMA传输* k: D, E. K6 u c. N
STM32与S3C2440的区别是很大的,S3C2440是微处理器,RAM外置且空间很大;STM32是微控制器,RAM片内集成且空间较小。此时,ST公司就有可能提升DMA的运作效率,使DMA的工作不影响到CPU的运行。
- g) K1 f! O$ ~. l/ n$ _4 V9 _2 V 外设与外设之间的DMA传输,因为与CPU的运行没有交叉点(CPU的数据流注意是在Flash、内存、寄存器中传输),所以不会影响CPU的运行速度。唯一有可能影响的是外设与内存或者内存与内存之间的DMA传输。" r5 s/ V" P4 U
倘若ST公司的SRAM是一个双口RAM,也就是同时可以由两组接口对RAM进行访问,就可以很好的解决速度影响问题。倘若CPU恒定占有一组接口,而另一组接口留给DMA控制器。那么当外设与内存或者内存与内存之间的DMA传输时,由于不与CPU的访问SRAM接口冲突,所以可以解决速度影响问题。
9 Q( J: b1 |3 ~& V$ Z 但其实偶尔还是会影响的,当CPU访问SRAM的空间和DMA访问SRAM的空间相同时,SRAM势必会对这种情况进行仲裁,这可能会影响到CPU的访问SRAM的速度。其实,这种情况的概率也是很小的,所以即使影响CPU的运行速度,也不会很大。3 ^' |# }+ T- [& G
; t: K5 m' Q. A. t, z3 K+ {
0 }2 n6 Z; O6 G F* O% h, X2 f0 B" K7 t! _/ M
|
|