有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
. J( G% Y! o r% e
8 U* |4 W# t- I- m6 X1 E- W& ?5 B: ]
先对ADC1基于DMA标准请求模式做演示。; s" C$ p; e3 Z
c* E0 L2 h0 \, s% r
0 N' a( z& j0 U/ G1 {/ ^& }& x随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
8 A2 g/ |9 M9 n4 V4 `( w, r* J! |+ a+ R1 q, L0 z0 ^1 H3 U- N& O
+ r6 |1 v' v, E0 J: d$ }- t6 F
3 ^1 w! g8 f/ f1 F
$ k$ `5 F f# Q
2 O1 ^- m8 e" L9 X. G% }
. p3 `7 u6 Q0 d2 u6 D, |+ }4 D6 d
, C0 @1 {0 t" y; Z6 W2 [) m. M$ r
% i! C+ K, I$ R1 y u
0 q$ w: j; H- v
相关代码:
: L4 ~4 s2 p* _- #define ADC_BUFFRER_SIZE ((uint32_t) 8) 2 [ n' Q1 F$ ^; _- ^
- uint32_t ADC1_Result[ADC_BUFFRER_SIZE];) u- J- b) M4 e( @0 s- u, p9 G: S
- ' n7 B' y% C z/ z1 |# }
- ADC_HandleTypeDef hadc1;2 ^2 u5 |5 R/ n- v8 \+ J
- DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
6 _. Y; L F; E- w9 l
* o+ D* I# u T0 x: }- /* USER CODE BEGIN 2 */. H; O" E1 H7 u& l2 q$ c
9 Q+ Z& Y: f' a$ [* P! @- F4 ^9 J$ {4 [6 J. m4 g( K6 A- b
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
. J7 I9 o' @- X0 d: Z; j) R -
4 o2 [- {1 ?7 h7 ` - __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
3 d+ t, g% r% B: C4 O! E
* f) q* K: P& v2 F9 l# ]- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,) _( Y# e. z1 d B5 {- e
- (ADC_BUFFRER_SIZE)5 O) d4 d# |! \7 m: D9 F) r
- ) != HAL_OK)
+ U: [- k2 |" G& ? - {; t0 C; o: a7 Z( s
- Error_Handler();# I: D0 I- \: q5 r) [
- }
; ^* e* `4 Q& O8 o+ y' s4 }/ F - 4 V* [8 y1 q( H# J. O% j* K' h6 m
- /* USER CODE END 2 */
复制代码 " I# y$ D% e; F: Q5 |# J
运行结果如下图所示:【目前4个通道我是悬空的】
+ \6 J/ |5 L- P3 ?0 b, a. u5 p8 e" X6 y1 V# u. I
6 O9 r: l0 n- W( y3 ^- @
7 Q q7 Z9 e9 Z4 c1 X
. g2 t% s2 `+ |5 F; z7 b
; V9 z# z; P) t* X# Q现在对ADC4基于DMA链表模式做演示,其实就一个节点。
6 \+ n( a* W& F7 Z0 I, p' n' b, ?- T* X
6 o* l' V9 i# ]- w$ M选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!/ s/ k% b1 X* [
7 g" V5 [7 e. e" a6 A1 j7 ?$ b+ t9 J8 B' k
, k2 e7 J: t. N, S% [, J, _- p
+ R8 {" g9 }/ ~" B M7 k7 z
0 u3 {2 A0 e4 X, g关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
- N# P- k) X+ l! Y4 Z" G: J( J! \* j( k; k- T! M' a
O3 I6 [1 }/ [8 c! w- s3 ~0 |3 Y* ~
/ Y( o8 Q, y4 ?" h4 R/ M) l
+ h6 ~$ F' L! ^, \1 n" G
- a. r, w- W4 S8 U K) C2 R; W$ f9 z: s0 R
7 c8 j( N: I- f" }
) ^8 c9 N! Y- b& ]+ g
& \) v, A5 b7 h( \8 J) m相关用户代码:
9 q0 f! _2 B8 k% I- /* Private variables ---------------------------------------------------------*/0 {9 o \4 h' w* p+ ?# g. D
- ADC_HandleTypeDef hadc4;
+ t8 W3 R& E/ I. B4 L5 Q - DMA_NodeTypeDef Node_GPDMA1_Channel1;
6 A0 y8 }, U9 c* X - DMA_QListTypeDef List_GPDMA1_Channel1; L* z l) k$ J5 P
- DMA_HandleTypeDef handle_GPDMA1_Channel0;
: a+ q5 `7 q- v9 U" d2 { - /* USER CODE BEGIN PV */5 \5 T( ^6 {2 [& {6 B" T5 I
- , H/ v5 _6 z* S- ]* B
- /* USER CODE BEGIN 2 */6 A. Z5 D) b/ A( c* H! P$ n
- 9 g! ?& z) }% Y) R
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
, L8 b- I1 F/ r0 Z& z- I9 Y+ e
5 [* F( L+ a/ q( f4 d0 d0 G- MX_ADC4Queue_Config();2 d3 `6 F( @4 m9 ?/ M, f, H( K
- ! i+ O1 {9 D8 e5 N/ V
- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
1 e4 _6 z3 B! A; ~$ z) c) j - 8 a7 M: j! A) n
- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
' ~& Q3 m4 P+ L - 4 }9 b/ J4 B' A1 _
- if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)( G' u; n" P9 Y" r
- {& Q' R1 g( N! O8 U. p" E5 M
- Error_Handler();
8 u; C1 r6 H3 I2 M' |9 @ - }8 z5 K, i' @3 M- ^# U
& t) b2 Y! M2 k+ t& f V, G3 J- if (HAL_ADC_Start_DMA(&hadc4,
8 n9 x _9 g: e. j; p( Z" u - (uint32_t *)ADC4_Result,/ Q4 ? ?% l, ~5 ]
- (ADC_BUFFRER_SIZE)
/ ~( Y- k/ Y& R* | - ) != HAL_OK)# p( l- F( N2 @3 r e% y7 n% N
- {
- ^$ X: L( a3 p' ^ - Error_Handler();' U7 v# v0 R! k- m
- }
" E0 g; g3 J( ~$ c# z - /* USER CODE BEGIN WHILE */
复制代码
8 f! R6 {) p( C) u. u结果验证【显示了2组数据】:3 b% f1 P# g2 r. p4 T/ n3 y
% n; J* }# I5 O6 \& p) z+ x
( e+ A$ t8 U K0 @4 R1 f
/ R( f9 ^$ N/ ^( Q) S; {* t
. \( n! {/ l# @+ S! x3 b$ P; i# s
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。: ~" K* s; Y. Z u+ v
& d4 M: ^! p& p5 d& d
9 J( B& g1 J1 k' ~8 t& u! m& i* r% p; d: G; F7 `2 N
如有侵权请联系删除7 l6 ]0 g9 K0 x1 j! R
8 i4 h* E% \6 b
转载自: 茶话MCU
/ @: o& ~& U8 d. j. F0 d, v( I9 X/ r- \
$ }6 ^% u) U5 i: E1 a3 f R |
学习一下