有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。3 H3 R& d7 J8 o# l; l
, d: p/ R% |6 `1 u4 M* K' v* J) A) f/ ?+ p' t4 C
先对ADC1基于DMA标准请求模式做演示。# h' D, r) m* ~
% ~4 M9 S& W$ n! [# I
# I& Z* w0 L# w6 b: X7 R随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
/ y7 Y6 r" s8 d3 ?5 h* p
* u Q+ U- ^' G4 {& l* w! U$ d& k% l& B' t
; J, s, I/ h) x7 s% x. C6 D: j; N2 q, r* `& y
_" k5 b/ u: {# `
5 t1 \( q/ b8 W% y b
) f& v+ e7 |6 a4 g7 Y7 H
3 ~ Y( H$ M* \7 O1 G: S! H2 w1 C2 j% [7 B4 P) B x
相关代码:" I i z- D( U: ^7 f
- #define ADC_BUFFRER_SIZE ((uint32_t) 8) 0 d, Y$ E; m0 {8 K! c
- uint32_t ADC1_Result[ADC_BUFFRER_SIZE];
. S `$ R+ W4 Y6 f1 \
% a: b6 v* R" _5 `( n4 c4 ~5 R8 u1 h: j- ADC_HandleTypeDef hadc1;1 g) o2 w. `% [" V9 b; ?: P
- DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1' o& \2 D3 k) \3 p: z5 k
4 y/ ^% d8 ^; ], n! o- /* USER CODE BEGIN 2 */, H |7 g: y: @% l3 x
2 x) S) a$ ?; G g" t) @1 U5 j( A4 X
4 ]9 s, I( P" j- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version, } A8 S) B2 \* T
- ; d7 `' p( c* ]' z3 G
- __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
! M ^" t! U* N, w
3 w0 d8 V3 N- y/ O1 t5 \- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
# ~4 G9 A. p+ j* t$ s+ h+ o - (ADC_BUFFRER_SIZE)3 L: [- Z2 y* Z( K9 H$ \ X' P+ y/ r
- ) != HAL_OK)7 Y, @ W# N! C! k- Q& T3 @2 M( U
- {
. K- ?/ Q* H6 ?: W - Error_Handler();
; r" w+ t- e, ^+ w - } # n6 _. r _4 D" `
/ d, y |* R+ `; H2 u$ A- /* USER CODE END 2 */
复制代码
: @5 [) o, E9 t5 I: E运行结果如下图所示:【目前4个通道我是悬空的】
7 R* W; S& T2 j$ f3 K5 v3 l
6 Q( W1 k& A2 u% o q" i. }: \1 L) T) N
& S h/ L* X7 p& f* i2 r2 ^
$ i2 N3 x: N: S8 m: O1 P
; i+ M+ x- x. b8 [+ A( k- ^# a现在对ADC4基于DMA链表模式做演示,其实就一个节点。
8 F& x4 B7 M$ d* B3 e% g+ V$ G+ d: l. R! U+ H+ g
% F3 l) m" \2 [( a" q% L/ E7 `
选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!+ K3 p9 l/ ^0 T. F5 q
. K5 D2 f" v" Q8 K7 K# {9 K f# d, G8 q2 c5 j- j8 ?! v, Q+ u
9 N) G! H1 `/ q w0 [/ ^
8 I# ]7 W, t+ V( h# `* g/ [% \5 m% U Y6 d; ~4 }5 k( s6 h6 S, x$ L
关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
' [4 I( k9 l8 v( a# J/ k) t3 g3 b
C2 L- U+ P, B7 C6 F2 k3 j
; N/ S% f& ~# N' o/ b/ N- ?
2 I. H0 w( b$ r; [4 G3 i. d4 d. \# e6 j& A
3 ^3 R+ F- _' ]2 m' d& x4 `# f
7 k5 Z5 f# I/ S' e3 H- O+ H7 @7 @8 g
* ` o F' |- i
; X8 {+ f; l$ f" Y" F
& y- o, j" z- B/ Q! B" S相关用户代码:. @0 ] d8 x: f& w( ^
- /* Private variables ---------------------------------------------------------*/
! W2 a6 K; `* E' F [- _ - ADC_HandleTypeDef hadc4;
2 W% c$ G& {6 j+ ^( g) ?- c - DMA_NodeTypeDef Node_GPDMA1_Channel1;
0 g6 J/ G9 {5 v9 E- E$ ~. Z - DMA_QListTypeDef List_GPDMA1_Channel1;
* A# P+ x# ?( \ - DMA_HandleTypeDef handle_GPDMA1_Channel0;4 |9 c1 H6 F6 S" d0 i- G
- /* USER CODE BEGIN PV */
0 x+ ~; n. `" r0 \ C. q; r5 T - 8 n8 Z2 y# |' J) h0 B
- /* USER CODE BEGIN 2 */
7 d' X9 y# ?0 p& [ - / K0 g$ x5 q1 Z( H$ O' E* \" v2 {6 q: A
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
' `# Z% C7 ^% z2 z; f1 t - $ d+ Z+ {7 b; ^3 y3 ]4 e
- MX_ADC4Queue_Config();9 `2 o) _3 [0 q! ?% h0 T& N' [' ^
- ! [% R& V4 s _4 l2 l: F' }
- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);' n1 u+ c( I9 t# i$ g! \
, x2 i+ [$ v5 R' T {% `* t- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
- w* q+ N3 q J -
1 r i1 Z4 N* M& i: l6 h - if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
4 [+ @ @7 E& F6 L+ N( ~. J5 l - {+ J3 Z! y0 ?0 \ t0 ?
- Error_Handler();
8 Z4 a) t+ ^# |- H* D- E# C" b' } - }. f, D+ D1 q' B1 T
- + e3 G/ [& a0 h W* [1 k' y9 @
- if (HAL_ADC_Start_DMA(&hadc4,
- |% B3 n+ P8 c6 H& P/ J - (uint32_t *)ADC4_Result,
7 O8 Y( |( v% j& c+ D3 h6 @" z - (ADC_BUFFRER_SIZE)4 z; f! P, A' [3 o1 j" w
- ) != HAL_OK)6 p3 @+ U4 q2 j4 E
- {
1 @) l5 [9 ~2 ]' }! M7 C6 ^ - Error_Handler();0 ?( t* \! t: g
- }
" L( G/ H: Z5 a- @. ~ - /* USER CODE BEGIN WHILE */
复制代码 0 R) M5 I& P+ i, p1 h$ y
结果验证【显示了2组数据】:
. I* i2 L c8 H! J& v3 t/ n P1 z
3 j3 M& A. o6 f0 z4 t4 Y! L- q' I7 O8 H+ A7 ]. d+ Z& b1 g* w
4 b5 E1 ]5 G8 I* `& i/ ]+ c
4 u; J) Z* {$ }$ o8 R: g
% t' x5 D3 W- j. L最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。9 t* M9 _. ], R/ M2 f* u5 y+ A
1 P2 r) ~) P; t8 M) }( E# s' Z* f, \
, w# Z2 K3 K; P9 l
如有侵权请联系删除; s' ?4 ?- N( H( \ J. F' u7 i
: }: ?& J% }, B/ t# j" I/ Y转载自: 茶话MCU, l8 [! [+ T* h
4 B! [/ w; w, b5 n8 H/ x5 u/ X) L" j% [# P
|
学习一下