找回密码
 注册
关于网站域名变更的通知
查看: 867|回复: 2
打印 上一主题 下一主题

STM32学习笔记之--DMA

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-8-30 17:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
  一、DMA简介
- s1 l' E6 j% Q& q  1、DMA简介
8 J# p6 y7 }5 V: Y8 y$ h  DMA(Direct Memory Access:直接内存存取)是一种可以大大减轻CPU工作量的数据转移方式。$ |( r, t2 c3 t$ M5 V' z. X0 W
  CPU有转移数据、计算、控制程序转移等很多功能,但其实转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,再加上一些控制转移的部件就可以完成数据的拷贝。; S# g2 r' `' i$ ]/ o
  DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作--计算、控制等。
' v! ~. H' Y7 r0 E9 m  2、DMA的工作原理
( Q- o$ W' t/ ~* a; S8 b: d! M4 C3 ?7 m  DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
0 Z  R4 \0 e0 b4 ^! q6 Z) m  外设到内存4 y6 e" _' I9 c
  内存到外设
2 n. j5 p3 H  e; F; X6 \( W! O! G, a  内存到内存; Q7 \+ I. T3 D( A$ p) ?
  外设到外设
/ ^! X- N2 l8 x  g$ @3 U8 V: E* {7 M  当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,传输的终点就是剩余传输数据量为0(循环传输不是这样的)。换句话说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。- C. M" l9 X6 ?$ o. U7 l  \
  3、DMA是否影响CPU的运行
6 `6 H5 Q; c; o8 h  在X86架构系统中,当DMA运作时(假设我们从磁盘拷贝一个文件到U盘),DMA实际上会占用系统总线周期中的一部分时间。也就是说,在DMA未开启前,系统总线可能完全被CPU使用;当DMA开启后,系统总线要为DMA分配一定的时间,以保证DMA和CPU同时运作。那么显然,DMA会降低CPU的运行速度。7 N5 x" J6 r$ G& O1 q9 C4 z
  在STM32控制器中,芯片采用Cortex-M3架构,总线结构有了很大的优化,DMA占用另外的总线,并不会与CPU的系统总线发生冲突。也就是说,DMA的使用不会影响CPU的运行速度。
# q7 D  P% ^8 q* ?+ V' d, c/ C0 ^  二、STM32的DMA结构' {, L) J  O+ E4 \
  1、DMA的主要特性
3 j8 {6 n  _( z- L$ A1 v9 Z  ● 12个 独立的可配置的通道(请求)DMA1有7个通道,DMA2 有5个通道
* ~7 x& G) ?5 b0 d% e0 Y  ● 每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过
/ O; j+ @, z# q. g  软件来配置。. j' i- k" F1 `( h0 ^$ _* _/ M
  ● 在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如在相
  Q8 c8 I- p0 _( D7 l  等优先权时由硬件决定(请求0优先于请求1,依此类推) 。
3 f0 ^# s0 N. O- b4 @  ● 独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标3 _# y; g, z3 l( B
  地址必须按数据传输宽度对齐。
0 M& Y: Y9 q  x4 w: ~0 }; y  ● 支持循环的缓冲器管理1 J; ~* [6 K, ]5 `( V3 D0 n
  ● 每个通道都有3个事件标志(DMA 半传输,DMA传输完成和DMA传输出错),这3个事件标志( ^; j/ X/ }7 F1 N
  逻辑或成为一个单独的中断请求。
, j  B# N& q7 y5 x. i) m  ● 存储器和存储器间的传输  [* n) j% B4 g+ K8 H
  ● 外设和存储器,存储器和外设的传输/ L2 d2 c% v. b5 |
  ● 闪存、SRAM 、外设的SRAM 、APB1 APB2和AHB外设均可作为访问的源和目标。  r9 k& v; j8 ?  b7 M9 @
  ● 可编程的数据传输数目:最大为655365 y# y9 D1 C/ {
  下面为功能框图:
& u# C' d' K: Y  Z. f5 O   ) N5 e9 }) a( e; U4 Z

2 V$ n, _9 g5 \  F4 [  2、两个DMA控制器结构% ]; q& ~! g& p; N6 a0 w; C" Z
  ① DMA1 controller5 s6 V$ ^. S: f
  
$ l; h9 n, H: I* K, g
3 A( d1 X- f4 `/ |1 c3 |  ② DMA2 controller  s; T- `' T2 K$ d) e
  
: m  P6 y" _+ M! f
; }- ~3 F1 Y  Y& T7 g- e  3、DMA寄存器列表
9 E% C# @- T4 o! m  
1 ?8 H( w4 P% ^. c6 u3 ?' w& W- u$ f+ F. c. d8 R" h- O
  ① 中断类
! d, o7 l/ W, D1 Z* M  DMA_ISR:   DMA中断状态寄存器
# ~" O  k- @+ p. q$ n( X' w  DMA_IFCR:  DMA中断标志位清除寄存器7 D: B1 C; W5 {$ a
  说明:  DMA1、DMA2分别有一组寄存器。: E# d# m4 c5 C/ I9 ^
  ② 控制传输类" E7 S) O% x/ U" j
  DMA_CCRx:   DMA通道x配置寄存器
2 h$ p$ B  C! @$ _: ^  DMA_CNDTRx:  DMA通道x数据数量寄存器+ u; G9 t* W) B/ t; j
  DMA_CPARx:   DMA通道x外设地址寄存器' b5 E/ X* V( y) T5 z  \
  DMA_CMARx:  DMA通道x内存地址寄存器
0 ^% B5 a- Y3 l; n0 u  说明:
9 H$ I  ?& X8 D& L$ a  1> 每一个通道都有一组寄存器。
& ]) l/ T1 B0 D% j8 k  2> DMA_CPARx、DMA_CMARx是没有差别的,它们都可以存放外设的地址、内存的地址。DMA_CPARx、DMA_CMARx只不过起得名字有差别而已。
- a# L' R4 s  t; I7 x0 i  4、STM32的DMA工作特点, F2 h7 T/ ~% W% L
  ① DMA进行数据传输的必要条件/ Q& _* }: w5 f6 P( n$ N+ O; k
  剩余传输数据量大于0
4 O! s. S+ e/ p* O/ M1 X: I  DMA通道传输使能
: p2 f1 q# }- B6 O: V1 U  通道上DMA数据传输有事件请求+ B& P0 l# v# |0 I$ w
  前两者都好理解,对于第三点确实需要详细的解释,请看下边的三条。
* d# c0 \& |3 B* p: Q/ i* Z7 ]  ② 外设到XX方向的传输( n! W8 u& R4 F0 Q+ ~, \
  假设是ADC到存储器的数据传输,显然ADC的DMA传输的源地址是ADC的数据寄存器。并不是说只要DMA通道传输使能后,就立即进行数据传输。只有当一次ADC转化完成,ADC的DMA通道的传输事件有效,DMA才会从ADC的数据寄存器读出数据,写入目的地址。当DMA在读取ADC的数据寄存器时,同时使ADC的DMA通道传输事件无效。显然,要等到下一次ADC转换完成后,才能启动再一次的数据传输。) b" e6 ^1 m/ S4 y. z* t
  ③存储器对XX的DMA传输
, P. c  X4 y: z$ D  因为数据是准备好的,不像ADC还需要等待数据到位。所以,不需要对应通道的事件。只要使能DMA数据传输就一直传输,直到达到设定的传输量。
  d* \' w& h: f' H  P  example:: J% R/ a9 H& I$ \
  1.内存到内存
/ Z7 t: c( N# t8 g$ `4 [. O. `) B  DMA传输请求一直有效
" B1 s% h; A) k  m" V5 G$ E  2.内存到串口1 a$ G7 M1 K/ K' D0 T7 K
  DMA传输请求一直有效
1 ], _* ^$ @% k% k( b% \  一种解释:7 F9 T. g# K6 X+ B4 p" Z
  存储器对存储器的置位,就相当于相应通道的事件有效。 对应通道的事件有效和存储器对存储器的置位,就是传输的触发位。每次传输的事件置位一次,完成一次传输。如果是由外设引发的DMA传输,则传输完成后,相应传输事件会置为无效,而存储器对存储器的传输,则一次传输完成后,相应事件一直有效,直至完成设定的传输量。               4 R3 n0 W5 U' h- S, d
  ④外设以DMA方式工作时,能否再以软件方式进行操作?2 I+ Y$ v% B5 \# j: A
  有一点是肯定的,当外设以DMA方式正在数据传输时,不可能再相应CPU的软件控制命令,否则这不符合逻辑。% k+ S# O8 c' y4 Z4 x
  但是,倘若外设仅仅配置成DMA工作方式,但是DMA请求并未产生,数据传输并没有进行。此时,软件控制命令仍然能够对外设进行控制。这是笔者在串口以DMA方式发送数据情形下,所得到的测试结论。1 O: n, d* m4 m5 I  X! ~0 o0 B; A
  三、STM32的DMA软件编程1 X, v% Y' D1 C' G$ C1 y) k3 y& Q
  1、“内存到内存”模式传输8 P+ m3 A# W+ g/ w: m' ~6 X; F
   6 O( f$ E* Y! C
  2、利用DMA实现循环传输9 c* O. \% Z- c3 W
  方法1:单次传输模式. b  y. v: I( i# A  _! W1 @
  当传输结束时,触发DMA中断,在中断程序中首先失能DMA通道,然后修改该通道的传输数据量。最后重新使能DMA通道,注意只有失能的DMA通道才能成功修改传输数据量。
0 F) R' J+ l$ U1 d0 [  方法2:循环传输模式
7 O, `5 Q2 \3 j* s0 w9 \) i  当传输结束时,硬件自动会将传输数据量寄存器进行重装,进行下一轮的数据传输。
/ \5 i$ {# M. x4 r$ f9 l! I4 {$ y  四、再谈STM32的DMA传输是否影响CPU的运行速度
/ t) s  l3 {7 K" ~1 @8 B; X  声明:经过笔者测试,当DMA工作在内存到外设的传输和内存到内存的传输时,都不会影响CPU的运行速度。为了给这种现象一个合理的解释,笔者做以下猜测:
# D; k# D7 K  R* M- h( _  1、S3C2440的DMA传输
$ I' y3 @+ B# C  S3C2440的SDRAM是外置的,并且SDRAM的数据线、地址线、控制线总共只有一组。假设DMA传输的方向是内存到外设,当DMA运作时,需要占用SDRAM的三类线才才能实现传输;而与此同时CPU也需要通过这三类线来访问SDRAM来读取程序、读写数据。
: _! y+ U4 v% ?  显然,DMA的运行与CPU的运行有交叉点,DMA就会影响到CPU的运行。
6 U# z) w& \) u) K) F4 s  2、STM32的DMA传输+ R+ H7 b4 \. u! Z
  STM32与S3C2440的区别是很大的,S3C2440是微处理器,RAM外置且空间很大;STM32是微控制器,RAM片内集成且空间较小。此时,ST公司就有可能提升DMA的运作效率,使DMA的工作不影响到CPU的运行。
1 q  O6 k" }% @* l6 ^% `, A, T3 O  外设与外设之间的DMA传输,因为与CPU的运行没有交叉点(CPU的数据流注意是在Flash、内存、寄存器中传输),所以不会影响CPU的运行速度。唯一有可能影响的是外设与内存或者内存与内存之间的DMA传输。& m) }6 {* w* v
  倘若ST公司的SRAM是一个双口RAM,也就是同时可以由两组接口对RAM进行访问,就可以很好的解决速度影响问题。倘若CPU恒定占有一组接口,而另一组接口留给DMA控制器。那么当外设与内存或者内存与内存之间的DMA传输时,由于不与CPU的访问SRAM接口冲突,所以可以解决速度影响问题。
4 i* K, D& `# S% {# z  但其实偶尔还是会影响的,当CPU访问SRAM的空间和DMA访问SRAM的空间相同时,SRAM势必会对这种情况进行仲裁,这可能会影响到CPU的访问SRAM的速度。其实,这种情况的概率也是很小的,所以即使影响CPU的运行速度,也不会很大。) |% H. \1 }! h5 G+ @

! D# O. U* d; V* p$ v7 g# s' W1 f. p( `3 K4 |
/ y: k' o  y6 o9 Q  q+ E
  • TA的每日心情
    开心
    2023-5-15 15:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2019-9-2 09:29 | 只看该作者
    很详细,谢谢分享

    点评

    没事没事  详情 回复 发表于 2019-9-2 15:35

    该用户从未签到

    3#
     楼主| 发表于 2019-9-2 15:35 | 只看该作者
    Heaven_1 发表于 2019-9-2 09:29
    ! z* }! Z* j& c" n  S4 V很详细,谢谢分享
    ( k  x: V0 Q* M
    没事没事  
    ) ]% ^8 a3 j; m
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-6 09:25 , Processed in 0.187500 second(s), 30 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表