有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
, |, ~4 V' r* x" R, k5 L9 c, Q* N4 ` a% e* J O
) {! }3 s& Z+ C0 f9 _# N
先对ADC1基于DMA标准请求模式做演示。' s9 q' `" [; a" L: I1 K6 U, N" {
( |! i# j! |7 B
0 ~3 {8 v2 e) n& g& ?随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
& o7 @# _, B6 Q8 P; j, x* ?
' ?" K8 y3 L8 o7 v2 O4 |* E) A, {8 X: l, ]8 h4 }8 `9 {! q+ `1 _
8 |& E; V9 d$ W, p. R
, y+ Y8 r( y; ~. `8 ^
+ K. a; z3 b1 Y' T
4 C3 l9 @( A9 D. i7 }
) | H3 [) R8 z8 w( E
% k" {! P9 |' X# V1 w
( d. ?8 x6 n! S$ T: y7 r相关代码:
( B0 e2 X& O4 Y v( k' t3 L- #define ADC_BUFFRER_SIZE ((uint32_t) 8) 8 {: k; I' F/ {: ]7 `
- uint32_t ADC1_Result[ADC_BUFFRER_SIZE];* v" b% ^# K* j, w- v8 f4 @
- 2 Y# w6 e! M6 K$ C6 n1 Q
- ADC_HandleTypeDef hadc1;5 z2 Q6 C* y( l9 {' G) m
- DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
$ _& c+ [& F" j! ]- {0 p - {' H: q5 f9 V* Z% P: t5 t' f
- /* USER CODE BEGIN 2 */
% b- @- R9 K1 n+ A5 n4 j0 {
5 N0 t+ ]5 s) n/ j" @$ w
- a5 I2 V# d3 ^9 L0 z `& B- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version1 Q+ F8 K3 b2 Y
- ' B2 n- }! B+ Z" }7 E( `
- __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
" V- C) C- a( t9 B9 r( o5 e3 i
3 |7 K8 M# s( @- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,3 N# p2 Y, m# f A2 o7 V1 G
- (ADC_BUFFRER_SIZE)
$ [+ J4 ^, p, y - ) != HAL_OK)
3 z* X: G7 b2 o - {
* ]9 S1 }/ d4 t% }( g L, K* d0 f - Error_Handler();
* ~+ b6 h5 T7 p, O( z; a0 v3 `5 j - } ' r& j& d& Y. T: Z4 U
* o6 {. p2 [4 E; ?8 m- /* USER CODE END 2 */
复制代码 : Y: M9 ?+ I' m+ i
运行结果如下图所示:【目前4个通道我是悬空的】3 _# G7 b6 ]1 Q( {3 g0 R. q
, t* l. a4 |& J7 F; w8 J1 A# [7 Z
3 K: H( x6 N4 P* }: `% Z
/ K2 ~8 q. {, b) B- g' }9 ?0 U5 M& t3 _/ u* t
: y; j! q, K" T现在对ADC4基于DMA链表模式做演示,其实就一个节点。
0 U- z1 }9 N- }5 f
& e9 Y. L4 J9 T
7 z8 [0 f) V4 k$ Q) r7 ~7 Y选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!
, B- t1 S) k& J: B" ]2 d
: K( ]6 ^; v: \% B
7 I9 R6 E# q8 `+ f
) @: r+ h$ ?2 `4 ^* e4 K
3 F9 j& R9 V* Y- b, g) V
$ j+ F7 t( i2 F0 _' o关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。/ |. \# _; d: d* Y2 l( X6 r2 O
, r0 J# F. Q: |# e' z: _
7 H1 M" {, A( x8 f/ t# W+ P6 J
5 r0 g1 p2 @; Z4 i2 x8 M
* H9 C7 M2 B b9 X( ] f8 a
9 G$ q7 s9 j- V3 r2 f. R8 B
3 m$ D* C ^, Q7 H6 i% @
3 m, d2 C4 J& f) O
8 y0 P A' `7 P9 s- v. U5 \
6 P+ m; i0 m. o) q& B相关用户代码:$ }) O- v" E! b& h6 g- p8 y
- /* Private variables ---------------------------------------------------------*/
3 f, B3 J3 Q8 M1 Y/ t+ s2 Y - ADC_HandleTypeDef hadc4;
* R- n' M! A9 t - DMA_NodeTypeDef Node_GPDMA1_Channel1;
# r1 r V+ Q4 l( _ - DMA_QListTypeDef List_GPDMA1_Channel1;9 N% s- U5 E/ k4 g+ \1 d/ U, b! s
- DMA_HandleTypeDef handle_GPDMA1_Channel0;3 E7 e7 \% I; g B3 o5 G) K
- /* USER CODE BEGIN PV */
; v+ e7 Z$ x, B/ y4 X# s( j
( U- e5 P) s2 S- /* USER CODE BEGIN 2 */0 U7 i" H2 m' F& m: q6 D4 i
- ! D9 V5 l0 G( B- d k* `/ G3 Z
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
, y8 n# Z: x' } - ) e9 g8 U o/ @
- MX_ADC4Queue_Config();% K5 e4 s3 X' j% k$ r+ Y
- $ u6 o4 z0 ~/ e- Y! G# w! K
- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
5 @6 q3 C% g6 Y' q) V h [4 j
, r/ N: y9 c6 d- x, W- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);4 a- z0 q1 L7 U) u
- - h# B- J; N4 {: H$ e( D
- if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)2 C, r9 e, w; `
- {
4 E' P+ Q4 ~' l9 E1 T+ r7 f; t+ m - Error_Handler();2 X* E f) W) j1 F. Q4 i$ m% A
- }, d% L/ F8 `: F, y! `' s1 R' o
2 [+ f% v* Y$ m1 E7 Z, q: {- if (HAL_ADC_Start_DMA(&hadc4,3 h& j$ s7 w5 u2 i. z) M) [
- (uint32_t *)ADC4_Result,
3 }) \$ R9 Y* F T - (ADC_BUFFRER_SIZE)
" r8 j+ ?0 _& s8 G# ?+ \' a v9 ^ - ) != HAL_OK)5 l, ^9 O ^: v+ C7 R0 [
- {8 |/ ]' F0 {% h+ m& X9 U
- Error_Handler();
$ J" e- G! W; |& e5 T9 e/ \6 x - }
" t K, g7 U! \ - /* USER CODE BEGIN WHILE */
复制代码 v1 d8 p9 V/ h+ _
结果验证【显示了2组数据】:" \! d, V9 ?- H5 g5 w; W1 Q
4 R+ f& M0 l# B- W$ n6 s
1 W0 Z& k) I# Q% S- n
, k7 ]% S Q$ {' I% J) P$ |; n, o
6 a, ?& U3 N$ k
5 C6 Q2 R- P( x
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。
- c. d9 j" q8 N+ {# k2 j
! k7 j4 v6 s& w5 v4 R2 N
# a+ I6 O! a9 A5 o/ v$ a1 @4 G" f) G4 M+ F
如有侵权请联系删除: H0 L( ^2 O$ i* a" k
3 [; B N# J* k8 y转载自: 茶话MCU
* \) Q! \: b# q3 V+ p+ A1 G, I& q6 ~ L1 U; a1 F, O! ` r; H
6 i/ ?- V% Q6 n' u4 q9 x" Z; R |
学习一下