有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
+ l# }; X5 z- M
/ W* C3 x' E! w; \* {2 _
3 V0 t( Q+ g8 U$ x( O$ g先对ADC1基于DMA标准请求模式做演示。. z# Y0 W6 {5 n4 Y- S( U2 T
: R; Z N ^, \# h
# z4 \8 H- s! y9 ^+ y% I; \9 [! b' Z
随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。( z1 b3 l* [, _+ K, _2 B
. k+ B0 |( |( ]) k+ `
5 D7 s9 R9 F6 S* L& t7 x
) W+ e# t/ J6 g/ Q0 n) {2 P; O
3 Z) O* |) l7 k( Q; ?. X6 |
3 o9 t7 e2 e1 k! k- S7 O; }
6 s1 R" e( t, w$ J7 r
2 r# y/ K. p4 ^6 D9 q
/ a0 c7 N9 Q# z. J' s; X( A
# y2 h) M5 k' e0 G
相关代码:
3 [8 z4 W, C. |3 O8 _. @& s" B- #define ADC_BUFFRER_SIZE ((uint32_t) 8)
# s% N* v& l6 Z0 r - uint32_t ADC1_Result[ADC_BUFFRER_SIZE];1 W! h" C- l4 r+ Q8 o7 I: m+ A
- % k* ~2 M% `/ i# I! o
- ADC_HandleTypeDef hadc1;
& d- }3 L& \5 r. k4 z9 K - DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1* E! @- L9 F w3 n! N o4 b" `
" G6 L' J2 F8 M! J- /* USER CODE BEGIN 2 */' ?; a; W' O4 n+ O! f+ h0 g
- - W" i9 }2 N2 Z+ h& p/ l
- / d! q8 G# h) r! K/ }( ]3 X% W% i
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
7 Z( ~! F& [: R -
: h) T, |/ T4 y. ^1 z( I - __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);( t; J4 P$ D' _
) E- W! T/ y5 k7 W2 a/ `5 z) \5 ~- if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
# l: v# v( t* { - (ADC_BUFFRER_SIZE)" U4 A8 `7 @& F9 o; e9 y" P
- ) != HAL_OK)
: l7 N4 y' Z( _) C) B5 d1 ` - {
* p0 r `3 B- t, J0 ] - Error_Handler();0 p+ z3 e: ^0 Z5 O
- }
/ j$ K+ g9 L" d1 T% j8 |: B; M. y
' I7 G& x* ?1 M5 K; U; S1 Q- /* USER CODE END 2 */
复制代码 F. y' Z, _! j0 q
运行结果如下图所示:【目前4个通道我是悬空的】 O; U) ^6 M& H$ S& |3 _
2 H- a K* r4 k! J0 c
3 U% X+ n2 p1 X0 o3 V* ~# H
* K& M, N$ A' M. H1 R( u5 @2 _% d6 ~
* V; Y( e* k1 j' `4 F1 u+ w
( c3 L# d2 B# E- ^* ], @: U; Q
现在对ADC4基于DMA链表模式做演示,其实就一个节点。% K5 a1 U! g- Z& ^. c4 C; _
2 e. F/ Z* T* F7 j# W/ ~* `" {+ `# \
' ]7 g8 P( {) p! }/ ~5 Y9 L选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!6 ^+ s( E" a6 I% I3 S# O) Z
3 Z' j0 l& [! u, j
/ t4 d' B! P5 M0 G6 }
, O( w( l- t' A/ O
& j9 U2 O! e: z2 K! V! ?1 t5 P* u, k; k3 r# R
关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。# J0 N$ e" u* s: m- q# g5 q5 E9 d; ?6 c" {
# h* e( A$ y- X0 L" r# D K! C" {( C e6 ]- {" ]9 g
% w7 W0 {% a9 l1 x& B% v* _( t
0 }% w2 K: p& r# I F9 K. i; E4 s
2 \: G, E3 `* Z
" w; j/ S# A1 M3 ]% b- o/ I
. N3 ^1 h! Q4 {+ s8 u! L! s# [) v+ @& f8 u/ g0 S
) Y* s. q. T& l. {% m: r, Q相关用户代码:! ]+ }3 o0 s- o& |( h
- /* Private variables ---------------------------------------------------------*/, \* v, S" L8 Q0 e
- ADC_HandleTypeDef hadc4;
, r4 h w+ g! k - DMA_NodeTypeDef Node_GPDMA1_Channel1;
% C! w5 b# ` Y7 d) n - DMA_QListTypeDef List_GPDMA1_Channel1;/ ?" P2 E2 }1 _& X
- DMA_HandleTypeDef handle_GPDMA1_Channel0;
5 z1 X5 I- U# x$ _2 V) U7 N - /* USER CODE BEGIN PV */
" X) y* u# I- p2 O
6 G8 L1 `4 b6 Y, l7 E6 b- /* USER CODE BEGIN 2 *// |, v7 d. [- X! K! v2 j, e
- 6 f: M8 a9 G' _6 S
- HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version7 s6 Q' t8 v) ?9 g6 q2 [
0 B7 `5 Z5 L! \/ J3 W- MX_ADC4Queue_Config();
9 s+ j8 o& ?/ d1 E
2 q0 D& a; ?$ S! [- __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
: o; @# D. B- {7 Q# P) z
0 D `9 |( x8 W1 G+ I1 s- HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
2 f# f/ e* d7 m& D0 s - 1 E2 f6 ~5 l+ N+ I
- if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
5 Y- r |* [$ s - {, Z7 i1 W, f) |2 W3 x6 _+ s/ t: D
- Error_Handler();
3 x9 ^2 t* P" l, D- r - }
! p: B$ \! S1 v f* t2 ` - - S$ F( ?, \1 g1 f
- if (HAL_ADC_Start_DMA(&hadc4,: b1 {1 E5 ]# X3 G& b
- (uint32_t *)ADC4_Result,
# }$ Y- C$ V5 [" E( o3 n8 ^ - (ADC_BUFFRER_SIZE)
: ~ [5 v) |: V- A* J) H0 X; I - ) != HAL_OK)
8 S9 @5 }$ x, a: t8 @. D - {
7 U5 q9 K \" H) }* t3 N - Error_Handler();
& Q7 ]5 @( l, R" X" r; x - } b" z0 N# I! l% {
- /* USER CODE BEGIN WHILE */
复制代码 * {8 {) N) m% u
结果验证【显示了2组数据】:, F: _" w0 M, O4 p" Y: |( [
- {& s! U' J" _7 ]: L2 a& ^2 }
" c3 D0 {# r. m. q5 Y% b
X- P* g% G* j1 @# h' o7 D% _+ T7 G: X/ y
9 k/ Q) ^8 i& v2 Q3 p
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。
}* b. |; h& m. \2 `" S% p; s' c9 R- s9 s% A
3 d$ [4 o+ D$ }( N w) {* p' E. N& I
" z7 X2 P& R" d- x# s如有侵权请联系删除
1 j4 o: e5 p3 |& ]
c* b" y$ L3 Y" C转载自: 茶话MCU
: i$ E' g# b0 y& G! f
: t* [- E0 b+ ~% ~% a
+ u' G: k0 H: I' m |
学习一下