有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。5 y: u* x, Q+ g' P1 Y
8 _# N) k4 ^; ]* Z+ T
5 T# j7 P' e/ p8 r U4 H先对ADC1基于DMA标准请求模式做演示。
* R9 D7 H, w9 ^$ g
0 v/ r& i2 V" [2 D$ O
. k8 W, G2 b1 I随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
) D+ W7 m( ^- h5 P& C" K. p. C2 I' q" i1 t1 d( H
7 ~ M+ G2 N4 |: G
4 g; R% b. L% S; d+ Q
* U/ {( H5 g% w b2 \! Y; U, G
' |9 p/ r& b a6 R) G
& c5 ~8 ^) T/ \ X/ n$ C
0 }- H' N' t6 {9 c3 B; z) \% `6 I( M
/ O" K8 R$ N( M% A
! M4 x; [3 Z$ C# A* w6 M3 a' f相关代码:: g5 W& h& G: b: M
- #define ADC_BUFFRER_SIZE ((uint32_t) 8) 9 |2 w( k% t3 }
- uint32_t ADC1_Result[ADC_BUFFRER_SIZE];8 S- ^1 k2 p! C$ J
- , a+ B: d7 g. f: W- l; C+ T
- ADC_HandleTypeDef hadc1;5 A+ v: |) ~4 q
- DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
, @* K9 }' y+ X }5 h
4 m- I2 ]( S+ m- /* USER CODE BEGIN 2 */
# F+ d7 K0 f0 N5 x+ Y) g0 ^
* R% c V) ^8 L1 E' g. n
( Z5 Z' L- { P- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version3 B: C! Z+ B6 g' q! V
- 1 @; H8 G8 S# s& V
- __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);) K0 |4 h, n; O% D, Y" X! m" n
- : o& f' ~0 i* F2 r4 _7 B: A
- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
/ c+ q9 L$ [5 Q5 r - (ADC_BUFFRER_SIZE)
" b$ U& f9 v! a1 K- {9 p, w% V) L4 v5 ` - ) != HAL_OK)
! d0 h( S4 H4 w$ R' W: |. U8 q, _ - {, @0 T& V% T+ J# a! v, W; J' T
- Error_Handler(); ^& }. s! j0 D% [5 B. T
- } ! v6 ?! t& {- I- ?
- , @( A. p1 o2 L# l4 E- _# s
- /* USER CODE END 2 */
复制代码 $ s. M7 | B1 M. J9 Q
运行结果如下图所示:【目前4个通道我是悬空的】3 e# n" C4 O* [1 e" v, s4 p
4 t: D, H) ?* j) [& i9 l6 t0 P6 D- M: Z8 I! N& _' Y9 m7 ?
8 Q; Z/ ]: \4 w/ m* x& ~6 d
* `7 V- o% n) e) u
; V, I1 f5 G" x( d) T" G9 S* i
现在对ADC4基于DMA链表模式做演示,其实就一个节点。
, w2 u% y7 D. l( z: r$ ^
7 |; F7 y$ F, Z' N+ K
1 K d$ [0 l- z9 Q; f7 S( @选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!1 x- U) z) E) `+ t/ \
% }% n: E5 J, h+ u: E8 O( v: A/ A9 C
a8 M6 u) n# e1 \" _+ X' p( z. c* P
1 w4 @5 G9 s) g+ d1 w% X
5 S) R1 }/ M/ L9 q* Y: m# {
_# x% z- R; @# [: _- L9 G% r; a关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。, W F8 ~7 v6 q
3 x* {& V9 d: b, w* w0 c' t
$ F; w" A% u+ E5 u$ h
* U) G1 N2 Y6 M8 O; Z6 g& ^# h+ v
) M( n. h% k9 G) z% {) Z% L
4 w/ D0 l' n' \$ D, l* Q
! y: E- w1 j- z5 S1 E: w9 K
- V" i& X; g7 |. Q6 a
1 t2 A9 I. W2 f( o% k- g9 f% N9 v* K
4 Q/ L7 X( }3 p: H L相关用户代码:
+ J9 Z* Z, n. \9 w0 n( k- /* Private variables ---------------------------------------------------------*/
- K4 b+ i+ a1 ? - ADC_HandleTypeDef hadc4;
- ]5 D% q5 [! A0 Q# m - DMA_NodeTypeDef Node_GPDMA1_Channel1;$ o3 v" ?- N) e4 I) ^7 v+ x/ }8 o* t
- DMA_QListTypeDef List_GPDMA1_Channel1;. ~5 R) v: O6 H) B& R% f! E" D2 [2 z
- DMA_HandleTypeDef handle_GPDMA1_Channel0; E' W& d/ @. t. c) T# y
- /* USER CODE BEGIN PV */
|9 R5 K% t* p - / r( X3 _2 _% v: q# S
- /* USER CODE BEGIN 2 */9 _$ @2 G( X1 J$ [$ v5 h; a
- + x7 ~" ^4 Z/ V! [1 g- i) B
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version# l0 r$ G/ K" y3 A' w
, L( w8 d2 G# W- MX_ADC4Queue_Config();
; W# s4 `$ W1 t5 d
* D9 e- F2 }" d$ Q+ {& c- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);3 t1 |+ Y5 h8 e5 D
0 H1 X1 C2 B5 P0 |3 ?% V9 X- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);% b5 ~2 Q* U8 |1 z/ I; B6 Q
-
7 C) }5 Q1 S. [; | - if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)7 K1 I+ a& U# ?9 V6 i
- {& J/ q8 e/ z) G
- Error_Handler();, p0 _% F" x, T, L& r9 y9 b; }" @
- }% E* J. ^* D7 y
- 1 Q% S; P; i+ n4 y0 n- `# s+ S2 p
- if (HAL_ADC_Start_DMA(&hadc4,
# A/ E+ \* S' {% ^ - (uint32_t *)ADC4_Result,: P8 _2 D7 ]$ d3 n" d) f% p* y2 r
- (ADC_BUFFRER_SIZE)
' C; P K! X2 J2 s/ n; T' ~1 { - ) != HAL_OK)" A2 w6 t& T4 V4 C i% S; t/ G
- {4 s. @& a& S+ e; o
- Error_Handler();
1 v m C3 X+ q5 _- b6 W - }
2 U7 G" p3 U) @% O9 b - /* USER CODE BEGIN WHILE */
复制代码
& k/ S8 y1 {. i: o6 L结果验证【显示了2组数据】:0 I' g0 q: F4 J& d3 G* T
! j# z( S6 K8 u/ ~5 m
; @9 [6 f6 O% O6 R( |3 d
+ X1 K+ z5 u, r; Q3 Q4 s6 k' z: y& j4 E5 Z% |% ~4 @& L3 U+ }
# d: i" _8 |6 o* D4 h' \
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。
, P5 d/ }% A4 n6 r0 W
" @; s9 e) u0 B: ]; V7 x5 r6 m4 {6 E9 H1 E. Z
3 \9 z1 H G" M# G如有侵权请联系删除+ B Y" Q. A2 D
( E ^8 X* Q+ ^, i) S3 [0 O
转载自: 茶话MCU
& j [# l8 Z% B- B. q8 c& ~; I# @) F) I
- [- W# d9 X. m: n$ F
|
学习一下