有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。, T) N+ f% l" W) _$ U
! N7 Y# Z2 ^' S" V0 G! _6 g0 H3 T' M3 A% g- d T
先对ADC1基于DMA标准请求模式做演示。7 H; s. ]1 q4 P" W! h
* M! r5 F% m \: p, C- M# C9 D/ I/ {4 D# Z2 o1 m4 L# Z [
随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。; }8 o: W! E+ x- x& ?
; W9 _4 C- Q; r& g9 w" z; G
( Q0 b! w2 o" ~& Q: \6 F- _) ?. M
" q# C+ T& s2 ?2 y8 c9 W1 C
) H7 n$ r% b0 T. ~! w7 b/ @
6 l" x# c9 W( x; N' j! p1 P8 \% g; F
6 E3 b$ r: p8 @1 k; N
3 |$ q/ \4 |6 o6 ~. F
4 ^5 ?5 @" G3 Z3 \& L) f! w6 f9 H7 i. V ? q- P" c2 k+ h- l
相关代码:
+ E' r3 X, G3 w3 I$ _- #define ADC_BUFFRER_SIZE ((uint32_t) 8)
9 b8 T7 R( u+ i( ?0 `! B/ Y - uint32_t ADC1_Result[ADC_BUFFRER_SIZE];( x# L3 I7 F" u; z
; V" m# K* p$ s' k/ { K- ADC_HandleTypeDef hadc1;
! h, R# p. p( i1 q - DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC12 Y; f- i# ]- ^8 n7 g/ X M5 Y
' [* [+ }1 i# N( ]0 R* Y* s9 D- /* USER CODE BEGIN 2 */
" C1 |3 s; M: v) d - ( ]0 h' G% S6 Z3 @) \
& G, b; j1 Z/ o+ E) B6 \- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version' \/ }1 b& v# [8 W
-
0 v7 o0 M) u, U2 m - __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
. b3 U. M+ ^, F9 Y n0 @0 \
* I! h- ?' n O- T; s& c- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
( j7 F/ Z/ ]+ R3 s& C" { - (ADC_BUFFRER_SIZE)( c& ~5 J n0 C: v/ Y9 @9 ^4 Z
- ) != HAL_OK)
" i$ b& o7 u* @8 f% Y7 A4 t. E - {6 r$ l4 G/ h+ u6 e
- Error_Handler();+ \0 D5 v6 K: z7 L* {; a3 ~
- } ; C. z3 A4 m- o- a; b9 F
e6 U- i- y; g w/ o) g1 B- /* USER CODE END 2 */
复制代码
8 U Y3 U p% n) r# r3 m- r运行结果如下图所示:【目前4个通道我是悬空的】 X l2 o* k+ O3 J5 A5 x# s9 W
" l! M8 D7 r. l( b* w8 b1 l# b* u' t
( M+ y5 A `$ P6 Q0 e
# A& |. b9 ~, Z0 G4 w/ |/ p/ A! q
0 ?# F3 ^7 y" I1 t. Q
+ u: M5 n# D: d; c8 _现在对ADC4基于DMA链表模式做演示,其实就一个节点。
: I% l6 T& ]% w4 |/ {
( J8 v: I4 Y" x8 M! A+ i1 L0 Z& J( s2 L+ b7 y7 o, _
选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!* v* }5 C' _+ j
! z: X( x) E' `' `( t2 \
j" U, d. }, S' N
9 C n) k! s1 r$ ]( j# N# j; z( k/ m
1 Q, {) A& R Q/ |* K7 M ?4 _! q; Q关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。' `, w* O/ z N1 K& z: p( `7 h
, ?- J" e; B) @: A, j
/ E& K2 T+ u% U1 \7 E$ s2 Z" \& F* T
$ y+ k/ W# T. i; d( ~; c8 D
* I6 ]8 X! R) g. G; j2 ^! z
$ P) a) A- W( S. {" T" v4 U3 V) _& `( X% n# B* b1 A- {% g
$ S3 b$ s3 j+ _! g% z$ g/ ]8 f
0 X Y Y, W% Q0 Q: c. w0 ]
2 S6 ?) c8 f* E- h- {相关用户代码: _ v/ U% \3 [3 S {8 V9 e
- /* Private variables ---------------------------------------------------------*/( Q. c" M! }$ Q7 \& d
- ADC_HandleTypeDef hadc4;' j. n9 N# ?" r; U- a$ B% z& r# M. k
- DMA_NodeTypeDef Node_GPDMA1_Channel1;) ^5 Z% `- y- b1 V5 u8 c
- DMA_QListTypeDef List_GPDMA1_Channel1;
' F) o: @; ?# y; R4 N - DMA_HandleTypeDef handle_GPDMA1_Channel0;' l( h4 d1 Z& w8 N: ^2 \- i
- /* USER CODE BEGIN PV */
3 R) ?8 Y% q) z( ^4 b* d - " q8 R" T5 |1 ]: R3 Z
- /* USER CODE BEGIN 2 *// o$ ]; p l& W
t; V0 R/ G: u; A4 h7 p4 [3 F/ K- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
, B; Y6 L- w* y2 `
}$ G h' _) h; h7 _. I- MX_ADC4Queue_Config();* q( p B. C3 I9 b4 u3 b% {7 p3 k( u
- : |/ V0 ?0 B5 |4 l, ~/ X' m
- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
0 _6 W V1 Y/ M+ Q2 [' n4 U
0 N4 f/ `% {) o( [) Z9 V0 G- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
v: U4 t; {6 v- t6 e - . a5 }7 H1 e& D' x! Y, {. t
- if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
- r; n7 H3 t' f# ^0 V, v' o" p - {- z; L8 T' c1 z$ v" k+ t& `$ J7 N# q
- Error_Handler();
# @ {/ H; o1 Q V7 C - }' E. s( a% a$ L) [( X% X
8 n" v* x$ R, p; H; D' S+ h/ }. ^- if (HAL_ADC_Start_DMA(&hadc4,# l% X. n8 X, V- ]: k% L7 f% ?
- (uint32_t *)ADC4_Result,7 y; p a. \. D; r3 l
- (ADC_BUFFRER_SIZE)
( o# O7 X2 s7 i - ) != HAL_OK)
, ?, Z! T' u: e# Y - {* O* ~: L3 U* u
- Error_Handler();
4 ~. Q$ U5 k; w" Z1 Y2 ?' \' L& P - }
- Z. }; }9 h2 H4 r0 ?& r: n) f - /* USER CODE BEGIN WHILE */
复制代码
+ F7 C! k# A I- _7 x, n' ?结果验证【显示了2组数据】:
5 V! |+ R5 z/ l6 k# V6 E8 d/ }& ~8 r* ^1 h0 q) F
- j: U/ a4 N! v7 s* _
# y. r, I/ o, ?+ R {4 H0 n! N- T* A4 w, i! d0 ~/ |* [
3 J8 Y3 t0 L" B8 y* K, Z, `最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。
7 |9 P& r; i8 @. l: Q% R4 g, h! H7 J- X' ~
* E+ R- R( L: ?7 D0 b/ K: n
5 O" ^' d" F+ V" p/ R) W: ]如有侵权请联系删除
- u0 P1 u$ h2 J! _4 v8 ]* z3 T8 t: t2 C0 v8 `
转载自: 茶话MCU3 C1 F' o3 O, F$ ^0 e
8 D# d2 |1 Z5 Z8 e" r' z+ P
3 S6 b0 d% w) [; h- ^6 |
|
学习一下