有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。# q# K3 n& ^5 y E& N
5 o0 {9 u( D. N+ H
$ t( P( e# E! Y a' j0 z' o先对ADC1基于DMA标准请求模式做演示。
6 n3 A. h* W, t4 @6 N2 n5 x0 w: _" C* ^3 ]6 {
& e. \2 Q# y. R2 D9 e% |随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
! w1 X4 F$ X# V9 m
4 o! J& [: r9 V4 L1 R T
! q, X& G0 E: H' z
# m2 O7 b) ^# A) H( ]+ G
, g! j% U5 `0 q1 o9 y* h2 _, A" E
$ D3 z! C( |3 q( D
* b: a" v9 R" Y
+ w C9 s1 b+ H% F* G; X1 ]/ `
$ V+ v* t, k6 Z1 F6 L4 h5 c, Y$ d8 x9 O% {- F
相关代码:
3 s, P9 k$ w, P( ]8 L- #define ADC_BUFFRER_SIZE ((uint32_t) 8)
# V) L' A2 S& g! f( A( R9 \$ Z - uint32_t ADC1_Result[ADC_BUFFRER_SIZE];
" H. Z& \8 m8 P/ w u0 @( b
# u2 R1 A. T! T3 l5 f2 P( H- ADC_HandleTypeDef hadc1;
3 H- m; e7 y4 b( u$ x# v; `9 J - DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
5 ]" {( T! j4 C r - : _3 F/ Q; D8 ^7 n# i: u& f- p
- /* USER CODE BEGIN 2 */7 Z! f' w8 G! i7 X }
! Q$ j. ^2 F" r" R _% c% W6 T; A9 J
' m. a& Z2 i! a! `) @7 h+ m- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
, e1 a! J7 R8 X* o1 k0 @. b - . F# a5 v" I# B% f& I0 v* x
- __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);$ M' x) \$ @* n; |/ z: W
- * A- Q8 \9 o" ^ W
- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,2 U. u. M \( o" `# X4 j, B5 H
- (ADC_BUFFRER_SIZE). a6 H3 d* h H( Y; q2 R
- ) != HAL_OK). H5 ~' M" l5 A$ R0 r( B3 I
- {
1 y3 N( ]1 ~% \6 V - Error_Handler();3 K6 R6 r8 l+ `$ p
- } 0 |) K0 I# F! Z; T6 w+ J, @
- ; o! a9 E4 N* x9 B' Y1 h
- /* USER CODE END 2 */
复制代码 . u8 b7 `& r; ^$ u5 ?1 k% W
运行结果如下图所示:【目前4个通道我是悬空的】
7 @6 |8 p( o7 O8 S! o
' \5 A2 u/ y7 G# p6 s( C' v' @- ~- P1 }- y6 D5 b
" a# o) s, f! v( P; w) r! @- c3 t. l7 V" z3 Q
' e; b: {1 T8 C( g% m6 _现在对ADC4基于DMA链表模式做演示,其实就一个节点。- F- w z6 {/ _
! P3 w5 B( H# V8 K; H9 W
) O- T# u+ T# m7 `* P7 T; W6 Q* E6 ]选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!) m/ U0 o8 \1 P7 ?0 C' u5 u& f: B
9 z5 ?" m, r4 J; x5 g
, ]5 Y/ k+ l4 N/ J& m1 l6 @
, C( o: j# Y" M5 ^: x7 a! F* p2 d0 r2 P
! K @- c, y# h& i- o
关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
& y& u6 [% z3 F6 \+ c: C
; D0 w& a3 e4 m% l1 b; ~# y; M* h
# I' O- y6 X! Y# W2 ~/ m' m4 f: z, o" K
- S, k# v" i) h4 y3 K4 `7 p2 h8 i
6 v2 s$ F) _) z, V7 v0 n) f. ^
$ l2 C; B' s. m1 z8 y* _
( r$ T. p$ x7 @$ `相关用户代码:
1 T& Y2 N. s M( B/ U7 v% \$ j; e- /* Private variables ---------------------------------------------------------*/0 ]: N; g# _7 k' G/ ]+ |
- ADC_HandleTypeDef hadc4;
( x3 Y/ Y0 R% |. a - DMA_NodeTypeDef Node_GPDMA1_Channel1;
5 v' ]' d% H6 e, m/ ]3 N - DMA_QListTypeDef List_GPDMA1_Channel1;, u3 M% |* a2 F5 ]" {6 Q/ ?
- DMA_HandleTypeDef handle_GPDMA1_Channel0;
" ?; n# B, x, p3 ?" k' v - /* USER CODE BEGIN PV */
0 u2 {5 Z1 y" S2 H - 1 ~, y$ L, v; Q
- /* USER CODE BEGIN 2 */
' ?# P( y0 q& m$ ~0 I7 B
& r) r9 o8 t k7 w8 c- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
, Y4 A' [7 H# s2 k - ]8 I7 n$ k! M4 p6 ]$ K
- MX_ADC4Queue_Config();
2 j( P2 C- @ U `5 t" R
; d$ d6 u6 }+ a" d7 u+ y" D- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);4 e& n8 A4 }: J" z# |: n
- 0 h* X" C, ^# x; V R# V, ^
- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
9 ^! ~5 b) v/ D" D6 z4 T - 6 t& Q/ `: s% V6 I4 g) a
- if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)+ [3 @# H8 A% O; W$ M: r
- {
( Y) h; Y$ `$ F3 j# |& i - Error_Handler();+ P. ]( s, Z+ W! d
- }
# H' v# i/ s6 d. x) ?/ Q( h) B - / X. l1 [: d9 N6 M& f
- if (HAL_ADC_Start_DMA(&hadc4,
) ]" ?" u- I8 Y) F6 Y) E- s - (uint32_t *)ADC4_Result,
1 q$ ~. o i2 t4 \5 w2 A7 D/ g, P$ j - (ADC_BUFFRER_SIZE)
: S5 i' W. B5 j5 M% d: a) _4 C - ) != HAL_OK)
# v2 G0 N; `. M) Z. B4 H% j - {" q) n) {5 S2 h) `: c
- Error_Handler();
4 v J- p% n u8 }4 `/ G* [; Z! { - }' p6 H' e* Y' P7 h; \
- /* USER CODE BEGIN WHILE */
复制代码 . \: N! `$ Q9 z* v: s
结果验证【显示了2组数据】:5 L* ~8 ]" b9 E
8 U) b7 V/ X; ?# L7 N
" ^: @! ?$ v( e) F9 c0 @
5 t+ X0 t% v; |4 _) o/ O$ a9 D! q0 H! T' [; c4 K/ i7 M
7 U: k, G; G( Y4 k' P: Q最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。3 p4 c! m e) E- E
: k! J. R9 @- l: \7 W) Y s0 ]5 s
2 Q7 v! z: ?/ S' p9 l4 i+ ]# N
4 C/ ^- H: W/ R! y$ }8 m
如有侵权请联系删除) O. D- E0 `! c3 ]9 K
3 S/ R8 l1 K! Q e6 _ {
转载自: 茶话MCU0 S+ u# K# g A. z* p: c' {2 Q+ Y8 n
" S6 S' [5 d; U B2 W' F0 b: c
/ j" I* l! y7 @/ u5 M0 s
|
学习一下