有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
+ Q$ {' ?: I7 h9 I7 V8 E& z! v1 l0 E& ~* g2 Z" z
; t4 M5 g' |3 n
先对ADC1基于DMA标准请求模式做演示。/ ?$ P! d P! y; I) [
; s. R* P2 c& j" k8 h& s9 I0 J8 n6 _1 x, H
随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。$ y" f7 O7 T/ E X' v5 a1 V
' e2 M3 t& V; J i
/ n, ~, U- j1 S/ P
7 X: w: r& ^3 w% r
. T; V, b7 Z) N) J& \. O! b
1 [; T& h# G# S. ?0 ~4 Q) H2 v) x8 g- S$ j" E1 Z
" W, i$ T- b N2 H6 `: U O+ }# R+ v" z. O g/ B
M# ? F! h" h, x0 q0 K7 X0 R相关代码:
P+ d+ F2 p+ S7 Q& f- L- #define ADC_BUFFRER_SIZE ((uint32_t) 8)
5 @& W* H7 H9 @# B4 h4 [1 d, { - uint32_t ADC1_Result[ADC_BUFFRER_SIZE];
* J$ {# z, P4 B$ N* X
& r9 p. J3 A' W/ P# Y2 d9 G* O! O- ADC_HandleTypeDef hadc1;+ ]3 w) R' t& i: {$ M4 l3 {+ d2 ?; O
- DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
$ v# w' p6 Q \- J
9 R6 S3 Q. K0 i& _* V5 \# A0 b- /* USER CODE BEGIN 2 */' K0 P, a/ Z' f& Z( n; ]5 I
- 9 |" a$ p b8 y/ l4 c
0 f: j9 q# `( R- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version. L' A" y9 c0 J" {1 o5 Z
- 0 q% N, d7 K/ l n4 R
- __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);2 [" f( ?' m% g2 t/ F
. _" q5 I v( m! L- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
. O% l/ h# u* H+ n( r1 q - (ADC_BUFFRER_SIZE)
$ y V3 t1 e( K - ) != HAL_OK)
) z: \3 @6 d( Z! q - {; h6 q: s$ `: p. l* C. a
- Error_Handler();
# B5 l0 O+ z5 ~ - }
, e/ m8 w' P. l8 @ - & L$ l" U: ?' s3 W# ~2 l
- /* USER CODE END 2 */
复制代码 6 Q7 Q6 e) L; K( H+ `
运行结果如下图所示:【目前4个通道我是悬空的】; j$ W! t' M/ i
# Q8 h& |4 q) J; j% z6 v
" k4 [- S- i1 i- J" F E/ `( Q6 \
- {/ i( \. z+ g* v7 ~# Y, G' T
5 z$ p$ h0 J- t7 o, h4 u& O# r7 e3 D0 v! y
现在对ADC4基于DMA链表模式做演示,其实就一个节点。
: J9 I0 G7 G4 ]9 s, d0 ^# \7 x$ R+ n8 z8 V) {
/ S8 l/ ~9 a9 A2 O
选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!0 J! [, O' F$ Z5 g, K
9 Z+ X: T+ k5 _
- X* B9 Q' x/ l# _, S
2 k9 r; j! @9 n8 ^! j: I: E1 [
1 [3 W4 T3 B5 v+ F: |$ \* N: W关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
5 T& D4 u2 ^6 n( B
+ f+ E Z$ Q* s/ b& C8 i
, B2 P a; u5 J* j) L
# \! G: u- f7 M; o: A5 c9 I
0 c6 H: F+ U1 |$ \' K5 Z: b0 z+ y
0 I0 r5 I$ j1 e" ^1 \, H
# c& |$ d/ `0 |" S( b; \' g. P" \
- V4 T' j9 K9 V# l, w6 b' C8 r) |, E& n/ j0 t- N5 n
' j$ y$ f2 v$ h6 j3 l相关用户代码:
& C0 }% a5 P, s" n. K- /* Private variables ---------------------------------------------------------*/
) n1 Q. `4 `' t3 F; s' F - ADC_HandleTypeDef hadc4;
. B+ z! ]) S& Q! L; }& ?: t- ^ - DMA_NodeTypeDef Node_GPDMA1_Channel1;' k, m0 v4 `9 g/ U1 y
- DMA_QListTypeDef List_GPDMA1_Channel1;
9 V* U" s9 X+ R - DMA_HandleTypeDef handle_GPDMA1_Channel0;
9 _+ J/ p6 t) r1 o0 c, H" Q! P+ U - /* USER CODE BEGIN PV */% m+ G$ T, w9 }, q, V
8 V$ R& N; f! B3 s- /* USER CODE BEGIN 2 */) a+ r, U! S4 F
: W G/ t# e6 K4 ~- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
- h! N+ A. t7 b% v/ {+ Q) d" b* b
5 h. D2 N- D4 s, w6 E' X: D- MX_ADC4Queue_Config();
8 ?* ? _7 R$ d6 T
, ]+ N0 z- s! c& v) ]% u! m- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);' b" v+ r: n) i8 l1 i4 }5 H
- + t' y4 W$ N1 t
- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);+ C- h8 i( p& w, l X
- # a" w: j& S4 {1 Z. a- ?4 x
- if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)7 r( a9 s5 W1 g- O4 r" }
- {
1 C5 s" t0 i- E3 p# ?$ h% S+ r - Error_Handler();
+ J! f' E. E+ R4 T$ g* b* X* d - }8 O/ J& d% F" O/ u5 P- p A6 ~1 A
) q5 C* P/ r0 k& g9 @" h; R- if (HAL_ADC_Start_DMA(&hadc4,( y7 n: Z4 e6 Q4 W) l5 w
- (uint32_t *)ADC4_Result,0 v9 h' C9 N) n
- (ADC_BUFFRER_SIZE)3 Y- v( `; I- W c: `3 R A
- ) != HAL_OK)
. @! z. ?3 R, l7 ` - {+ ^) k0 L+ G; c s7 e: ~
- Error_Handler();) y; G# L b: f/ n% V) i
- }& [. n6 o0 s. ~7 ]. A3 u) X% u. o
- /* USER CODE BEGIN WHILE */
复制代码 8 A4 ~1 D- `8 N# S) h/ a
结果验证【显示了2组数据】:4 p, O# ]6 P2 J+ x3 {* W
0 i# s( P9 m/ N' B ]. h$ Z) u9 E/ ~* L# x( P
2 y9 i6 C2 G. @. B1 @: G% a! L
; h! q5 n; J( u: D1 J" V/ L5 C1 E4 h# G1 P
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。3 @: T8 E# a) ?7 Z
) ~; ^. L, C( ]" W
3 ^" e5 b# H) O3 A _) z1 O$ J" P3 @: ]# j
如有侵权请联系删除" }! C7 S# H+ G# M. y! Y' k7 N
# j: B9 W% Z o$ o" Q转载自: 茶话MCU
1 Y1 F7 ?; t! @* z0 T: V, d0 p: a6 z; x6 d) m9 ~
6 B A- B7 W) [! S
|
学习一下