有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
" `& h9 U$ R& \! A
3 `- ^4 S' @- g/ I$ L9 M5 u% |6 g- f& U; w
先对ADC1基于DMA标准请求模式做演示。
$ }" q; A9 |/ G) I
1 p7 C6 B) `+ D. U
3 L* z! a2 J6 A随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。* u6 B( v! J- N& T! M. T' t
f# x- i, j6 K0 q) _1 M. B# J( s& w1 s6 |- z2 J! @: l8 @/ _
; I3 f1 g* x: v% s/ X ]
$ [- |- [ D( o W& Z% m4 H: r
0 N+ m% D6 F& b4 x! D
% C0 m, e+ c, Y" i
, [2 R- j' X% b. F8 y/ V1 {! n) x" {% a, Z
; e- h# d. k `* }& |" x
相关代码:( {$ ^7 @5 u7 B
- #define ADC_BUFFRER_SIZE ((uint32_t) 8)
% h# j1 Y: K. k+ `4 X, K - uint32_t ADC1_Result[ADC_BUFFRER_SIZE];/ X) O+ N1 d' d4 |# a- m+ ?& v
- ' {% Y, ?( M0 q* O" n4 O5 k) F: M7 X
- ADC_HandleTypeDef hadc1;1 k* z$ h5 C; Z: s% N+ P* ?- W
- DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
/ a+ f- e( a5 w6 V1 g5 ?+ N - ' a7 r. T1 ~/ i+ T
- /* USER CODE BEGIN 2 */
# \# F& {, `8 h4 v# M
3 ^- ~. _& @7 g
+ G$ [4 g# ] m' { d6 ? p9 j- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
: M; p9 {. L3 {( ] -
7 |2 c" s/ D! o- g - __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
& N! o+ I& L- g/ n4 R# e; N# j
; M0 q$ w7 m# v* ~6 S- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
+ n! A- S9 Z* z! d2 [, ?: x5 t- z+ O5 { - (ADC_BUFFRER_SIZE)) S4 G; f4 {9 c3 C% h& C( l
- ) != HAL_OK)
) p6 j- [% f) i4 a' T c$ | - {
4 J% x/ Z9 n+ z3 T - Error_Handler();/ `8 z6 q# f" r# v8 b" v
- }
5 @2 h6 M! y( T8 e1 T: f - * L4 K, w! _/ A3 z2 \) U2 l( R6 r
- /* USER CODE END 2 */
复制代码 0 Q# {& P* ]4 K
运行结果如下图所示:【目前4个通道我是悬空的】. n! m. G4 U h6 ?1 g7 n
+ i0 p7 C4 ~- J/ ^ M& K( I( K y3 i2 l1 D) W. E
& i3 X3 j# o5 b8 g( G) _" c" P* I6 x% v# y' c
% n! ^- S6 e& A# s. r- J$ B
现在对ADC4基于DMA链表模式做演示,其实就一个节点。
. J1 A8 q# S3 p! v$ E" S) N: ^( T7 f; |' l5 E
2 l) v- b: H( @% ~. l8 V选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!0 D3 W6 Q' s/ f$ \
) o; X4 a7 c u( L& B1 Z$ @& y
9 c* [' k9 {8 g' a3 d
& z' h/ z: |. v2 c5 f: h
X' o( c" s$ L! i& \% h
; l" b/ \, f* m( F& ~关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
1 O& A7 N2 H0 x6 y! M; z! z- r7 ?' s( i% Z
, ]. p g- ~+ F9 X2 C* t; ~/ G
5 N& j1 B! @. j* O6 B, `( o i( I M7 E( G
5 w2 D2 h9 y7 S3 e" [2 x' c6 ?. c, I
, t8 r. D$ e8 y* g; d) D
8 h! F& W, W( T1 `& L
; V9 G# l. J) {8 s
* y5 j- T/ P' y# A- @( j相关用户代码:& @, u4 G8 p, o$ Q1 b4 |
- /* Private variables ---------------------------------------------------------*/- H1 G1 l7 D" u T( k
- ADC_HandleTypeDef hadc4;3 l6 {+ V4 e% W2 V+ ]0 m5 w
- DMA_NodeTypeDef Node_GPDMA1_Channel1;" ?$ U8 k9 [( E U/ E
- DMA_QListTypeDef List_GPDMA1_Channel1;
" f. { s. G* ]$ }. p0 B, ?) ^8 J - DMA_HandleTypeDef handle_GPDMA1_Channel0;
/ k; V# F4 v6 `! n/ I | - /* USER CODE BEGIN PV */2 E; J. b; H8 T5 K- n6 v2 c0 L
- ! {' k. m' ]( |9 d+ A! x
- /* USER CODE BEGIN 2 */# D' M( m' n# |% K) [, B
- . f, N' @- X8 I% f" j! r
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
3 O1 x: [" \% G$ O2 ]& G
; P* @4 \* S4 h& C% e3 [- MX_ADC4Queue_Config();
$ G+ u+ x& [' x J$ M4 x8 }7 a - + \- i) Z+ C4 j- D# O
- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
- \( x6 \' H F- p - 0 R4 Q! H/ p7 [
- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);3 D- L0 [# M$ m& ?7 [
-
. B0 L9 ?' S5 n2 `) j - if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
0 a; o2 o' D4 X: p6 M- Z - {1 p1 C( \ ^ B F) Q! B
- Error_Handler();# p' x$ e1 b9 z" s
- }
0 z7 W6 E& r* u% \
* l( H) F7 Z8 f! B) _- if (HAL_ADC_Start_DMA(&hadc4,
! ~" H, I) ]% E; }0 h - (uint32_t *)ADC4_Result,
* Y' m X3 {1 {" O8 }7 v H - (ADC_BUFFRER_SIZE)
* N) v3 v0 `8 V% p+ s - ) != HAL_OK)- [( n% M" x( X5 y2 C- ]8 J
- {
$ b2 n7 c5 c5 `$ ] - Error_Handler();
7 U' p3 f, n9 E. _* V. M8 s - }0 u2 @3 l: W/ K, }. P
- /* USER CODE BEGIN WHILE */
复制代码
( \3 e* d8 w' I结果验证【显示了2组数据】:
9 }/ @ ~* k- U4 ]6 ]( R% L* i! S# v" P
7 X$ \. i& f+ h
# h" k5 f5 {+ S9 g T
' ^- E H0 R+ x. f) P3 x2 U
8 {7 {1 a9 R+ \9 X
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。6 V; X* ]$ x1 ]; t9 q* A
: W U8 }. o8 D+ X% E3 J* e, A
' `* Z& i1 T$ [; N8 x' e" W0 j% W# ~7 m6 F) V( H3 K
如有侵权请联系删除: d1 D4 H8 {' ]/ i3 W/ F; m
# Y( l& E% Z/ u% ~1 i" b转载自: 茶话MCU
7 }1 ^& w6 V, e# x- B3 D, V! |$ I; H4 N; j$ L+ j9 G
/ H, a+ z" ` I- r, a* u% j. | Y |
学习一下