有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
* [5 s; I( ~3 b6 k5 Q& Z4 j, ~5 `* A+ r2 l3 N( c( o# f+ e
. ?9 y. }7 i0 b$ I3 m6 t先对ADC1基于DMA标准请求模式做演示。
. c5 \2 P) M* z0 n8 w7 p: X
' a; t6 [* {% M7 I$ C7 I# O
" \7 Q2 s& U" ?. D1 U# i8 m随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
3 d( ? J, ^, S! m) w8 a9 ?
% y: x" D& _4 D! o/ Y$ p8 c6 O& d1 ] U8 [ s
4 @- Q0 ?3 l3 K y/ A
4 `( b5 t0 g& _; G# H. U& M
: e0 i7 {% u) A+ o; X+ C! T% ^4 A# w
$ S; U3 u. k3 o: c6 n
, N6 k) @- s9 y% j: p; ~1 k+ `# n6 z; ]; F9 L
相关代码:9 u/ U( {: r! Q8 [8 o- y
- #define ADC_BUFFRER_SIZE ((uint32_t) 8) + k& j: i5 u. Y1 I, [; ]% m
- uint32_t ADC1_Result[ADC_BUFFRER_SIZE];
+ D) L2 s2 {" u# e2 Y - 6 w- ?/ L( A. v( I+ h
- ADC_HandleTypeDef hadc1;
2 E% a0 K7 w' Q2 t) T ]- X - DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1) t& p; A' V% f$ o' _
- - }2 G Y- Z' `
- /* USER CODE BEGIN 2 */
. y/ }9 E( b: ]0 R1 }# V( B
1 \( f ^ q4 @# P( K1 i1 M
6 @) I- I+ k b! q, _5 a, v- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
# l/ `/ G- r0 D- [ - " [, L+ N! R0 F7 E' O
- __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
J- d8 |6 A5 C
, g! Z' @/ S( P, k- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,; H: L2 S/ u$ q& f2 ^
- (ADC_BUFFRER_SIZE)0 O# A l0 [6 h( z
- ) != HAL_OK)
$ c" H7 d* k7 j! V3 j$ @ o7 J - {
: D& Q4 D2 P: m; ~! p3 B - Error_Handler();, l4 r+ x- L3 v3 X( ?. F
- }
9 O$ H" a; P2 C" N" P - ) A0 I( L/ ]9 I# k6 ]! `7 J
- /* USER CODE END 2 */
复制代码 ! T& E6 f7 S( `4 A& T% x. _0 s1 C9 Q
运行结果如下图所示:【目前4个通道我是悬空的】
% ?/ D+ N" S, @& E& A4 ?# _
( I# C& T* i9 c% `- J, A! g4 b5 V8 B
/ r7 ^( R9 i" R
& k8 c+ ]0 Q1 }' O
1 N) t- U! L3 x, A. {现在对ADC4基于DMA链表模式做演示,其实就一个节点。% u5 E X W7 A1 F1 W+ B# J
5 g% _* ?1 B; e/ W3 f' x% U
. i5 j( d1 E6 ?* D, F' [0 `选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!, \& M" H9 p! E1 g/ b
$ n. Z9 e+ w) g
) |8 v# c7 z2 |, z3 @$ N
S. e. D1 Y$ D) X2 u7 g6 p0 I4 p
- y9 u! Z4 I% k) c" [4 O2 ~
2 D* v0 P5 J9 O6 A* |" o7 E关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
8 T$ L0 r8 B2 e. j
5 i, \' o# T0 M2 o H
$ p6 U5 v) O, X7 @$ D
2 Z' j% `4 L# S
9 k# r7 i# ]4 O7 G# i: ?
8 n" I- j; P9 W' ?0 c" N' e3 N/ l
. Z1 K: v8 E& Q# X: X
* W H) e$ G' q# F
' s g3 `; [0 R+ p) M' R% p! g8 Z/ }; B) ]7 s8 i8 Q
相关用户代码:, z* |2 O! Q3 c& d# L+ I
- /* Private variables ---------------------------------------------------------*/
; y8 F; ^6 \; z4 k - ADC_HandleTypeDef hadc4;5 U3 z. j6 Q0 n& B* O, o% H
- DMA_NodeTypeDef Node_GPDMA1_Channel1;
) r, f* B V, L: R9 A% P$ Y( ^+ } - DMA_QListTypeDef List_GPDMA1_Channel1;% d2 {. G9 f& p* ]9 A+ n
- DMA_HandleTypeDef handle_GPDMA1_Channel0;
* @3 C& |/ {3 g0 Y - /* USER CODE BEGIN PV */ g' w$ C9 Z3 I9 Y# O) `, P' j* O% P
- C1 a: e' L, C' t- /* USER CODE BEGIN 2 */4 G: q: W9 V, z. {9 |0 O4 K
- - j" n+ k. x5 [7 e c3 B" Y2 K4 w
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
( ^4 k$ S N- N5 M) }) W: R
/ ]! ^9 P, T: W. `- b/ ]8 t& s- MX_ADC4Queue_Config();$ d3 [& S. P! W
- 6 w; r" G' I* C' m+ L
- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);5 F- B" P5 U$ l
- 9 C7 `- h* y: A6 T# S
- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
1 j, y/ I( j Z - ( N2 A9 D2 b" Q% h/ e2 T
- if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
! m, i: n( ]4 K$ V F - {
+ Y6 _* F; h; W8 u3 ]7 y - Error_Handler();$ l( m. Z& b1 n. Q4 D
- }
. p, L9 j. v5 a6 B
7 e7 N/ Q0 O- U% O- if (HAL_ADC_Start_DMA(&hadc4,
8 D' _' L4 z2 W+ P m* a5 F - (uint32_t *)ADC4_Result,, Z: X4 m: k! L5 W+ t, e/ o
- (ADC_BUFFRER_SIZE)6 a+ v& n4 J$ k" S6 F
- ) != HAL_OK)
" [9 g5 f* Y9 l+ c- J6 l: V; k - {: k/ F& v- X( _# m2 c3 W5 \: t
- Error_Handler();2 d8 A3 L" V3 s
- }
+ e; \, p1 j. [& z8 F - /* USER CODE BEGIN WHILE */
复制代码 1 i& x0 @- H0 ^" H' f5 o
结果验证【显示了2组数据】:) T+ m0 Z9 a" w0 d/ {4 ^/ a
3 {' J2 Y7 e0 d9 n( I* l1 d2 i: Q8 s- s3 v+ K! B+ I9 O) G
: u( O: e- F: ?0 `
& I7 h# @- V) E2 Z5 x N7 n
[* ~5 ~- | T, x. i; K最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。
' ^, @$ T4 I2 { I, \
- }3 Z+ Q0 K+ L+ r0 ]
" I& |5 d1 H6 t9 K h# c8 `* U& N5 K, y( K! ?! N
如有侵权请联系删除$ Z% C% C0 f5 P2 u m2 d
( D8 u: Y3 V6 R" t' _转载自: 茶话MCU
$ c* c% {, [) |6 }- B! X
v3 o( K. P. j
- n1 G: L1 J9 _/ c B G |
学习一下