有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
" Z- G ?5 {$ M
" u' K# ?! X5 }
! X3 Z4 K8 a3 {& B J( ~先对ADC1基于DMA标准请求模式做演示。
% a* K: P$ T1 q* ^4 S$ V2 ?8 ^7 I3 a# |) U" V
; Q- q. x+ c* y; n+ K6 ]% R$ V4 p- O随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。4 n: C6 f( [1 M1 `7 c& L. c1 I9 Z
2 Y( G! F+ _$ n% p3 I; O0 {" U( Z9 W
5 E @2 g! Q' e# w+ W: Y+ a2 s: U
, |1 N3 Q$ Y% R
# G7 X: e! e8 O _, W$ _8 V5 o" S6 W7 n
% Z' E; [# C* \' y. f+ v1 [: J7 r; u" G
2 W& _7 _2 C! S% K6 k. H相关代码:4 v. {" [* q7 H' X" I5 k$ j
- #define ADC_BUFFRER_SIZE ((uint32_t) 8) 0 o" j F) U( k9 M. l& @6 j K4 O. }
- uint32_t ADC1_Result[ADC_BUFFRER_SIZE];
. Y- \- N8 [) v0 `6 i - / Z+ o3 V+ W& X" q8 A
- ADC_HandleTypeDef hadc1;
/ z7 p! u* E+ a8 M: h9 y5 X, ` - DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
/ r& K }9 z. `
) v- E$ H6 r# W. j( Y1 G: X- /* USER CODE BEGIN 2 */( q2 }2 \( x3 _3 b) ?
- 8 q+ }( W( r/ E F! w+ S! \1 ^
- : X# O$ l% i3 \( I
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
, \/ t( C% g5 H8 } - 3 g% ^$ H# K. V+ d# V
- __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
# t. _$ e9 k; ^ - 3 u$ A8 c% q6 |6 M. s" R! Q
- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
* J2 p$ l! a" n! H9 j - (ADC_BUFFRER_SIZE)
4 H- v& Y& P9 z$ o6 e5 G( ?9 d - ) != HAL_OK)/ k: c/ n6 N2 j6 u! C
- {
9 Z: U' ]& y: A' z - Error_Handler();9 n( T7 t/ Y: ?$ j5 b, h3 e
- }
0 H8 E3 ^0 g, E5 l' U - # u0 z, {8 `9 S) t
- /* USER CODE END 2 */
复制代码 6 }2 M. L7 \/ x$ t: i6 G) H; T
运行结果如下图所示:【目前4个通道我是悬空的】
0 E- S; P. o2 ?3 @( @+ t& O% u- W& ?
1 u" E. Q5 c3 C% \3 Y$ J9 W6 {& F, q' ?# w7 b+ R) q1 ]% e6 R
/ a5 x. c4 h0 k8 \2 T1 `1 i8 ~$ D
: j: B9 C/ z; x6 ?* y6 X% w. S现在对ADC4基于DMA链表模式做演示,其实就一个节点。9 S. f X9 t/ L
0 Q7 Z; @' J7 U7 A0 ]6 i
- [ z2 g# U Q& {8 z- Y* j; K% K选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!
, r- W3 [5 U+ [4 }" R( c9 i0 ?. y R' M8 x j) N* d
1 c1 C7 P, B. |# K
* B3 t; M# z& ^. R: Z
2 ?9 p; {0 y, y$ D& M5 h* g3 A3 [
关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。! E7 w; f9 |8 k4 x
# n4 d; t: |( W2 _* u% |% X$ a: R
3 K" `9 f7 X$ J: A3 R, x7 J/ b
4 p0 @% V9 W N8 Y! B$ n2 d8 g) p7 p2 b' w- g6 v; g
8 l4 K/ `! d4 X; j7 k, j& q' ?1 f! [+ O2 z
8 o; K) n b3 p$ a1 O/ ~
/ S; {- H, ~- R) \/ G y6 J. ? v* q% x2 s# C" E G" i6 N
相关用户代码:7 f% v7 J1 p8 w+ b6 {- q
- /* Private variables ---------------------------------------------------------*/. w9 @2 L! B9 h" m" d
- ADC_HandleTypeDef hadc4;5 q+ M, |! ?/ L( m- e9 U" Y. Q+ ?" @
- DMA_NodeTypeDef Node_GPDMA1_Channel1;
3 m6 J# b+ U# v4 L - DMA_QListTypeDef List_GPDMA1_Channel1;
7 w4 ^% r# [; q& [# Y - DMA_HandleTypeDef handle_GPDMA1_Channel0;0 Y0 w) e% q7 ]3 }9 s. l' p
- /* USER CODE BEGIN PV */
- {. ~, Q) S8 j- j' U - / Q. n5 ^* v& b5 [6 X
- /* USER CODE BEGIN 2 */
1 h- w9 u) z! N2 F9 t- a7 z
! b6 c" E3 h8 }) _- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version" K) g6 x' }9 K& x0 g. o( C' t% [
+ q A4 [1 v/ K6 D6 O) E( e% c- MX_ADC4Queue_Config();) x: o" L% A6 G3 l0 V+ x
# N/ ~( S1 b1 H- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);# A& h4 e# g" k$ E, G* I: E
; z6 c$ |4 E# H% u* X- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
0 ]0 w9 l$ x0 K -
" G, d4 E& f6 Y) ?; m. S& x& J! h - if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
+ P' \2 B- s+ P. x3 D: R: R9 x- m+ | - {
& P/ @$ w9 j1 s j - Error_Handler();. `) u- f# A, D
- }( Q$ J5 W: Q9 W, @) U+ T
- 5 F# V8 X" s9 e
- if (HAL_ADC_Start_DMA(&hadc4,
- l% g: r, f7 C7 C" u - (uint32_t *)ADC4_Result,. F+ f! n5 |5 u+ H1 o3 U6 `
- (ADC_BUFFRER_SIZE)
, t7 s1 I3 P7 K0 m - ) != HAL_OK)
8 X- S) G& ^: z! U# n0 U - {
3 q. A8 m: o5 M - Error_Handler();& s/ \+ a# O. r2 t$ f, ]" S* M8 v
- }
! |. f4 Y3 |5 D- `6 |7 }/ b" M - /* USER CODE BEGIN WHILE */
复制代码
* G* v# |& ^6 ]# r5 Y' B5 `1 |结果验证【显示了2组数据】:; a, x, p# c0 L6 F: \; a4 u* ~; f; v
, x) a& j/ R1 G) f3 ]
. f4 O* d# Y" q
! \# @) l+ r1 k# K8 a2 O- s, z. \ Z$ q" W3 W; K4 W+ | L
( Z Y7 R# t. S8 k, M* [( `4 b6 `最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。3 E a7 \ r3 b9 F3 N- i1 _
$ X5 K' J$ E. `3 I( L9 n6 D
$ U. T$ s& d0 S) c! |0 B5 J5 ?, }, }" `! g* n
如有侵权请联系删除
! N8 K) f8 a+ c8 J# N1 E( x2 `$ s' R; \6 M4 t7 S
转载自: 茶话MCU
6 R0 Z5 A+ [9 l
' T! f$ P) k7 e; e
* m m* N1 ^! M) F, v6 H |
学习一下