有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
; t) s5 ~: f/ Z& o: r- t) W s+ K0 u
7 H5 L" }1 m3 }% W# a
9 m7 c4 Y8 c4 q7 I V3 K先对ADC1基于DMA标准请求模式做演示。
" R. n! u& G, }; O3 ~1 H/ n3 n6 F' W( m* |4 w! k9 c G' `/ g
. z* r$ b0 X; W- J2 y: l
随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
7 f' c/ h+ r) _+ w0 F7 K9 k9 o4 c* K& k
1 Z- H' A2 \- n p- z
9 d [# J* Z5 S0 v* G0 }
* L2 t; o, Z# x" o/ z5 k
: ?! g: w2 _% ~9 W) c
& w" E {! U4 A# @
3 _) K, B j ?; Q8 I" k Y: {$ _: a) V& n$ D9 a1 ^
. k) j9 M: A e! F
相关代码:, Y0 W! u, ~$ z! R: h7 a+ W) n/ I
- #define ADC_BUFFRER_SIZE ((uint32_t) 8) 2 j! u& V6 o2 Q# V- h# ], e( u
- uint32_t ADC1_Result[ADC_BUFFRER_SIZE];' K0 | `" M3 i. ?. N! L: @
- + `5 N: Q+ Y' w: x" s) ]# ]
- ADC_HandleTypeDef hadc1;2 X$ d- S$ } `1 A8 u, {; O9 \
- DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1) t, Y5 w/ \6 }+ q" D e
) Y( N2 x2 j* r ^- /* USER CODE BEGIN 2 */0 R k( x" N+ z7 M
- ! R4 k; c& u0 w: r: d' Y+ q# c
- 5 _8 |: ^7 B+ P- h" o# R! y# n
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
0 T4 e) e5 Q9 G/ h5 P( i! d" D1 W -
6 s9 b. N* ^% C# E - __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);/ h5 p+ L6 ~& O
- ! ?: A1 Y$ s w
- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
+ g, c* o- n/ L5 r5 F8 }6 q - (ADC_BUFFRER_SIZE)
: j) x6 C4 I+ W7 {. c% A6 ^ - ) != HAL_OK)( q5 E- U! P/ |4 p0 R4 D
- {6 o9 b; A5 x* o: z1 y
- Error_Handler();. J& o4 J/ E+ b3 l0 R. \! O* v( M
- } 0 |1 W" ^2 c4 `0 {, Q
, J. g/ d. |& c$ l# p! x% O- /* USER CODE END 2 */
复制代码
; Q1 E! b* G1 W% i2 h4 q" c运行结果如下图所示:【目前4个通道我是悬空的】$ K7 Y+ O; L- K' C
2 j' R: o) K; T0 y8 ~6 l* |- d
3 p. T1 O0 i: j! I; C) P4 q
1 h: m8 W) ?* B- H. X, ^% @& F% c% o, F, I# b& R8 j
' c; G a9 w# Q) |9 e+ o
现在对ADC4基于DMA链表模式做演示,其实就一个节点。
% Q9 f. d$ p, \7 C. K$ P9 c) H, v' `+ m+ ]' m
4 ?/ j/ V5 t9 v2 _( Y* B, ^+ K
选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!
4 y+ B1 r) j, @5 w; H# T/ E5 `1 h, Q4 B2 e# R0 w! B
9 P* o! T) R% [$ G& N! x4 j. M( F
# d3 A9 l: D7 ^& q0 @4 y; Y; \3 |
& ~4 J+ ~ @; X* i* g0 m E4 h
; s" p U" S* a& J) E关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。4 n; {: R7 {1 u S G
; j& G+ C4 A( R0 i% e
; }# c1 |0 c/ Z! F3 K$ W9 y
/ O3 D* L* Y0 O' J& f! j/ m
w) @0 x, ~- F
' o S" G% m6 o( ^
( M# M& u3 v$ U+ T( r# { G
4 o* _4 z; w5 e8 N6 i% s7 z4 `! a4 N( z( ^: ~5 `
7 W$ J9 o+ p7 M. h0 u8 V+ W相关用户代码:
4 I: [, g- V# h: Z* o! H- /* Private variables ---------------------------------------------------------*/; z t1 B$ i5 z) P7 \
- ADC_HandleTypeDef hadc4;
6 d) j8 w. v; J$ d - DMA_NodeTypeDef Node_GPDMA1_Channel1;
4 S- y+ \ E* `" O/ F, u - DMA_QListTypeDef List_GPDMA1_Channel1;( V5 x* _- R2 E& x8 o* _ K
- DMA_HandleTypeDef handle_GPDMA1_Channel0;
+ [; _: I" z* U* l2 o M - /* USER CODE BEGIN PV */
# }' b* R0 r' s) c( S - ! p/ S' y' M: Y `
- /* USER CODE BEGIN 2 */$ _! j) O j+ A" K6 C! G4 s s
! d9 L& g! j I/ m5 v) O- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
& i" z2 e7 J9 Y' `2 Z: w - , Y1 @* D, W& O6 X" i
- MX_ADC4Queue_Config();
/ x0 I" e5 ]2 [9 @) R
" }/ o7 \6 ]1 t+ i: p5 l- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
% X( \8 m8 @$ B, U# n# Z - % p' h' {$ Y7 ?- E1 Z! F
- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);* I' D: c3 d+ c" o1 t
- 2 m. y+ m6 y: q$ `" I( g0 V" A: e8 A
- if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)/ j- M4 ]0 X1 f6 ^
- {
8 x: u% a4 d; q6 N& x& A - Error_Handler();. a7 I5 n$ O/ k! T; A; F
- }. E9 N* _" f& V
' O5 ]5 z. o, W4 R4 M$ `- if (HAL_ADC_Start_DMA(&hadc4,
8 _6 Y1 M8 ^' y6 s! @ - (uint32_t *)ADC4_Result,
( a; [. t8 j9 G6 l; |9 I! F4 O; B - (ADC_BUFFRER_SIZE); }7 L; ^4 l2 Q8 D/ L+ ]0 Z
- ) != HAL_OK)6 K) L- A2 K# a1 l+ }( u8 K
- {4 b4 B: _( z9 X' U& f
- Error_Handler();
/ Z# q6 T: U8 e9 t - }
+ ]7 {6 P* u' m. b9 ~ - /* USER CODE BEGIN WHILE */
复制代码 2 i" ?# F0 M% l( O6 J0 {
结果验证【显示了2组数据】:
6 ^8 ?( s/ q$ Z* w% r6 M, I+ k# P) j8 P# c" i) w% p1 H! X
* i+ c* y, ~# e6 X+ B0 }( t
2 i' B0 f; P# N. i: Q
3 Z9 Z2 A: R8 o% K$ A& Q% |: y$ m
: ^ [8 L2 Y; m最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。% `' m3 O' i) S" D2 v
% k# R5 L5 F7 p% m. | H
5 _) U) G! |" s+ l
* G8 ~2 A; Q$ O0 m I如有侵权请联系删除
/ ] {. ^* i7 {; Z9 p5 D* u3 ^/ U; {) ]3 Z; ?
转载自: 茶话MCU* {$ ?8 O0 f; V& r
7 P! t9 P* o$ V% W$ c
6 j6 j( n$ J4 P+ j0 ?5 T |
学习一下