你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32的DMA操作

[复制链接]
STMCU小助手 发布时间:2022-12-25 13:11
DMA概述
% N  `& U9 R8 X; d; K2 HDirect Memory Access
# a7 d. [/ _7 O5 l# s  f( u& x, e% X: |/ ]# |! @7 Q- _6 a
直接存储器访问
# i7 d* s* A3 h& O; z* _0 {: C+ f; E# Y/ D8 N
DMA传输将数据从一个地址空间复制到另一个地址空间
/ X: @' V0 E) H( l
6 k" n+ J) l+ y$ e4 q0 h
由CPU初始化这个DMA传输动作,动作本身由DMA控制器完成
5 Z8 ~7 s6 ~* C, R- O2 \0 {7 T) i

9 l. A8 v8 Y. o4 ?6 m7 Z) w- c' @DMA传输通过硬件为RAM和IO设备之间开辟一条直接传输数据的通道,提高了CPU的运行效率
/ T/ `: f6 ?! Q* r5 I# I# [3 i3 ^- ]' Q; U. M7 e, J
& Y+ |1 |# |$ M6 S2 u7 @5 Y% o8 T
STM32中的DMA$ W& f# D- r7 T4 p2 S2 j# }
STM32最多有2个DMA控制器,其中大容量产品有2个DMA控制器,小容量产品只有1个: s; Q" j% h/ O6 x6 K
' \; m) P& o' ?6 Q
DMA1有7个通道,DMA2有5个通道
) b% D) Y! T$ l; q
. Y, M6 v: o( S' O4 F" h每个通道专门用来管理来自于一个或多个外设对存储器访问的请求
8 d/ q1 e8 V3 j
) @! s; k( M3 M; {6 `1 w; ~5 W0 r3 t
还有一个仲裁协调各个DMA请求的优先权
3 x$ G- w' E# g& }. C( X$ F
& c3 N  C- g4 l8 F& v
06b7ef769b024b23bbf36dfb5131e090.png
  @+ ?2 j  C( r! @$ Q8 X% y" o  m
- m: B; o& {7 R" ?2 Q! \6 _3 B
# b- i( L6 x: H1 u- ^" U. N
STM32的DMA具有以下特征:  C  \" m3 y5 k( r7 \
每个通道都直接连接专用的硬件DMA请求,支持软件触发,可以通过软件进行配置* v# v; U% l3 B+ x
优先级可以通过软件编程设置,共4级3 n+ t& l5 _6 [
独立的源和目标数据区的传输宽度,模拟打包和拆包过程,源和目标地址必须按数据传输宽度对齐
$ E, o, c5 a7 s6 _支持循环的缓冲器管理
$ W* N! [6 r' }/ D6 S7 N每个通道都有3个事件标志(DMA半传输,DMA传输完成,DMA传输出错),这3个事件都可以成为单独的中断
) ]8 ?4 a4 Y  e% e% ]' [6 m' U外设和存储器,存储器和外设,存储器和存储器之间! F" d! N' P  x3 B; O' W
存储包括:FLASH,SRAM,外设的SRAM0 e6 a/ J9 O1 ^, e  h
外设包括:APB1,APB2和AHB
6 }# f$ w. Z) c. L# Q& L可编程的数据传输数目:最大为65536& d9 s1 O4 @2 h
7 ?* n2 {7 @2 i, Q* M! R, N

4 L$ \! N3 L1 [6 y/ d& Z7 d
DMA的通道  J2 E6 l+ Q# \9 D' j9 O& `
DMA1有7个通道
/ ]' w+ H2 K; Q, |- F; q( L
, y" q3 ~& t9 |" V5 F
282b190e65354b47a7bbee81d00c5d2f.png
  s: K  \- b$ F2 z$ j" H* s6 q) S
8452a9c970024dbf8d2940b2fda730a7.png * q) U, [2 O1 a

' V/ ~7 K# V, ?2 x! n
3 y) E# ~6 g6 i6 N# }' y' [4 b
DMA处理
0 a3 O$ {3 e8 u" Q' O2 i在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求2 c1 R, w! f# z

; b2 D  k- r$ X3 _当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给他一个应答信号  W0 J; U6 I& q0 Z$ M: B. H
& L6 _. C: [+ |: f/ z0 }
当从DMA控制器得到应答信号时,外设立即释放它的请求,一旦释放了这个请求,DMA控制器同时撤销应答信号
: Y9 J1 O! G1 F9 w( x* Z% [3 }, w
) G3 `; o. v& ^
每次DMA传送由3个操作完成:
9 B8 j1 ?! a9 q+ c7 j
+ A+ o# ^- [) a3 l* C9 t6 J- }DMA_CPARx存储的是外设的基地址,DMA_CMARx存储额是存储器的基地址,这两个要先赋值好
* c& o7 O1 P- H% a  _DMA_CNDTRx包含未完成操作的数目,在DMA_CNDTRx寄存器中,每完成一次发送,这个DMA_CNDTRx寄存器的值会减
* Y* N9 x4 \, e, _$ [
* z& W: @' u" ^& C
: T0 l2 O& x4 c& o+ X/ S
( i/ l. n9 G3 H- k. m- F3 P1 e, j
数据传输方向9 W2 ~+ T/ x, @8 o6 M% P
DMA_CCRx寄存器
& y# P. x9 |. R( ~7 k, ^, `DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)1 k3 E- C6 F: r1 b8 `
5 }7 ]" f, M- W& M! M, @6 `& |
2c42b9f9b10e4bd2825df2dcb8abcd5f.png
# f  ^2 q# b" t) P3 j5 \. |' }; M0 p
1 H8 b4 r( ~9 V4 I9 ?
仲裁器

8 {$ _8 `, c5 s# ^, |0 A2 J0 [# i$ _DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)2 i) M: x5 |' z" D7 K  Q0 n
同样是在这个寄存器,可以配置通道的优先级
% V: J( W; W$ b- L
& V4 W% M# T- @, y8 i$ ]/ o
2ba7972aff5541d99a285e9d5c1a14cf.png 6 w, \$ [1 s- a4 P2 u) ^

$ ^5 {# U0 U4 y3 a: d' O$ F; n" s
; m: a9 d6 X. u3 F8 N9 f可编程的数据量* R" W& S. c& ]% @" o8 ~+ T
DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)
% q+ ^) _, {8 j( J2 D/ ^' G7 Z源和目标的数据宽度一致时是最方便的9 X! _- J! ?/ }# f

7 C" @# P7 l7 X8 z
c524b8c0879f4b8d820b5575739818b0.png . Y4 X! B- Q: |

. l" K0 \. R( U指针增量9 x+ z, m  u& R" n

# \  U& Z( r# d- z) B6 V( a
7516413f461f4373b522e7f201ef0e0e.png ' j0 N+ [) m1 F  }
; Q: G& I) Y& `
# Z) f# L6 B3 S* `( _. V7 u5 Z
存储器到存储器  g9 W% n; s$ Q& d
还需要设置DMA_CCRx的MEM2MEM位* p( h3 i# X$ C* I* i: x; d
+ |8 c/ T5 t; S- b. K
' |6 k3 f' c+ R
通道传输数据量
' L: H) {2 {$ S6 r
在DMA_CNDTRx寄存器中配置,虽然这是一个32的寄存器,但是只用到了低16位,所以最大数据量为2的16次方-1. v. f( A- k" B- M3 o

& n1 B, i) Y$ q2 a
9d299b558dd64091a92717530123ffd6.png
5 K5 ?  G6 \' Z2 O% ^; Z! C) |) a+ K
, |3 f" R' Y7 [# Z6 F9 V$ k$ `
# a4 |5 U% m4 f+ D* N7 `: F
中断

; z+ t: B9 a9 D
3 W. i8 p0 N6 W1 c- {
ae792b7b6a324a278daf92d59976a8d7.png
5 g5 i. E$ k7 y( f' u4 _; b) A" X' @2 |) k8 S# j2 P+ w* m1 G& X* P

- `+ @: ?  g% \4 B" J# U通道的配置过程
5 `0 V& L4 B1 y6 P" h; l
1. 设置DMA_CPARx(外设地址)和DMA_CMARx(存储器地址)的值5 j& I( i  E; k: y7 R/ B

* f0 E2 A0 k: A3 F& H% H# `" v6 O2. 设置传输方向,通过DMA_CCRx寄存器0 O" \9 p) }; I2 S

" |( B8 T2 U5 w2 {( f0 W; }3. 设置传输数据量,在DMA_CNDTRx寄存器" p7 K! a# q  X* l5 j: C; {

* x/ M8 E0 h+ e0 }3 M4. 设置传输优先级,在DMA_CCRx寄存器中
$ u) E8 ?1 `6 g) A- P9 Z, U1 N% q# |, d) O2 Q% u" b
5. 设置是否循环模式,外设和存储器的增量模式
, p' J$ X% P% E9 G: |# e0 h, G. b2 ?' [6 M$ p4 |
6. 数据宽度,中断配置,5和6都是在DMA_CCRx寄存器中进行配置
, o( D* P% u4 U1 R& I

0 z. P4 g: a* p7 g5 ]0 U7. 在DMA_CCRx寄存器中进行ENABLE位的配置: G: I- H. F! y8 ~# B

3 X7 G& B* C7 Y/ _* c: W% d当传输一半的数据后,半传输标志HTIF为1,当设置了允许半传输中断位HTIE时,将产生中断请求。在传输数据结束后,传输完成标志TCIF为1,当设置了允许传输完成中断位TCIE后,将产生一个中断请求/ M3 R! K! L+ w
' f. E" n; E2 n4 C

) A: o2 J5 c" n4 H4 \6 h& F/ [DMA相关函数配置
1 g( F$ `* o2 MDMA_Init% x9 M3 T/ D; s* V; n8 D( V

" U% X6 ?0 O9 E8 R6 S
103f928ef3d940f3be5756248b8f10c6.png ) B9 I! U% i4 j4 A
1 ?6 I0 E) `5 i7 D
DMA_Cmd
" g- R/ g% I% e, F: g7 `7 h. _9 X
a2091ee74aa148c8ab5e744fed414ca8.png 4 S/ d- z! w1 C6 z. A& e8 E

% f& l1 B3 S% F" p DMA_ITConfig * `& i; T* o9 v5 U- a6 i" y% l

" s; E0 |1 O) i! E4 v
6f2e6b47d9244fbaa2d62dd9806269ab.png
$ w4 k! {/ N  g9 s, s- f0 R/ ?. g
! d+ S. [4 c# v2 X/ i3 Q
: e! i" {: n' a& P: b3 Q" R
DMA_SetCurrDataCounter0 X# k. c: f8 P+ q  \! Q* N

' v' ?; f+ r# x1 r1 E
f9de8c17e3404dd5be3a4f15af69fdca.png : o2 w) i+ I( U) R& x
& E( L$ v9 p5 k( A% _
DMA_GetCurrDataCounter( w, o+ j- E: n1 g/ K

: h8 K/ r2 O1 y2 w/ O5 v7 N/ { 680285a996534c3782b07e1801fb29fd.png
! U9 e1 }, k- `% |& h

- u- u8 w. ?1 A. ~  j3 gDMA_GetFlagStatus5 o7 P+ T& Y, ?0 B& W: I
- @! F# z0 v& X( o! ~  ~
cc57fdebe00f41118f6737f714f860f0.png ( Z1 ]' E$ y, X

% Z# A& z/ q( M3 v1 {7 k DMA_ClearFlag
' D) j3 r# ]! q) I7 a1 C) g# {
; T6 B* X& n5 i
fe76c4da59824f2286ccd3e802f775af.png " _9 U( J& }3 h4 V
- K" {* P7 K( |
DMA_GetITStatus
  C% B; u; O( T4 n* e2 B+ K- L( V% B& G# U' V
3bc3a2d4cd29430fbc2121a735b9af11.png
0 u" I  p. @1 p5 b  {6 N' N
0 ]% v7 P% t8 d; Z5 EDMA_ClearITPendingBit" o. G6 T" |9 p* T

% r6 \' _% s% \! T- }0 E
88583e4b904249909b6c6c7b5c9ea492.png ; Y' `/ n7 I/ p3 U! m0 L3 d
8 m2 s+ [7 z; U, f
常用的外设DMA使能库函数" `' I4 u8 X/ q
ADC
9 a* `0 w1 F% G5 T8 R2 n/ }1 s7 c7 G* o1 H
933a0d26c9924d20bfa97d55ffebd8d7.png 2 P0 c1 l8 g0 T& a6 f% r7 t
6 A( m6 H! N8 L3 \3 f* b8 ~: U
DAC
$ |7 N" p( }, V9 P8 k6 N( g0 g* D# ~" q  h6 @3 S

9 D. Y# W! u& ?5 Z- h 5663e3b714bb43ce9e1efc39f0f68830.png
  y3 a# N4 s4 w7 q9 U; {$ y" N( ~4 R$ C; U6 t
USART# j% e: A8 w6 {4 D# h9 e
  w9 [8 f$ z* L7 M- C( Y) O
$ b; a: W/ z5 ^% k
2ceb814c0afb4d38aec1757ab46efbc8.png
& w; m( |& B0 W. [5 j8 x, a3 F- R" @. F- d; Y, J( D  B* H
I2C8 {# F' N5 w) B' s, c

- E% ]3 l3 `, e6 i) y7 {4 |" G

+ O6 ^  e0 g7 z% f4 e& C) G7 j 90ec031a722e461b86448be675be88c8.png * `' {& }$ `( N4 ~- A3 Q! C0 E
$ z5 j- t9 F6 I9 A- [; k. n' k& v. Z
TIM $ e: P$ V: H! r5 c  A- E6 E

6 p% E/ M# G' z1 q+ h  C1 ^8 f
715294f5e57c4e398286179843b58dba.png
5 x" R) Q( G( g/ o2 c( P  [
) i2 I/ V2 e2 |
4aa31ef16d06414498579c52420c441a.png
8 l; m) Q2 m7 d  C2 T( V9 u. \! b* W% F  `- W2 ~
8 G) C% M+ G6 y6 }2 f& C4 Q
DMA的初始化配置
# q/ V( n/ o! m6 O; ]$ G: i
: X, Z' S( W! u- J  J" n1 [
101b75b7fdd74830a8e621d0342862b9.png 2 P/ g, I' z8 ]- D
; J! O, I- r* U+ q. p
3cefdb2416d746e6884d888f0701fe69.png
9 N1 M! ?& I8 M& @, p
  ?4 `* S* u- _7 r1. 使能DMA时钟
5 E1 k: L( r  {8 m3 g2 d2. 初始化DMA通道参数
' ]/ }2 n; ?% v; j0 K$ `3. 使能DMA发送,使能外设DMA使能函数4 s; a/ e' b5 g, c  p! a3 U
4. 使能DMA通道,启动传输
: Y* B& a; x/ h5. 查询DMA传输状态: Y$ u( }4 P# k5 a/ }/ A! b
6. 获取或设置通道当前剩余数据量+ M! n2 p+ q1 w8 |# P9 q# l
————————————————
3 }8 m$ X  G" x  y0 U3 }- ~版权声明:CodeForCoffee
: ~3 ]/ t" E2 J; S- a$ F6 L" `
1 G: Y6 X0 _, T
- ~. G/ {# X- e$ ]5 C2 X) D+ M" M1 D
赞 收藏 评论0 发布时间:2022-12-25 13:11

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版