你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32U5 ADC+DMA配置经验分享

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
+ Q$ {' ?: I7 h9 I7 V8 E& z! v1 l0 E& ~* g2 Z" z
; t4 M5 g' |3 n
先对ADC1基于DMA标准请求模式做演示。/ ?$ P! d  P! y; I) [

; s. R* P2 c& j" k8 h& s
9 I0 J8 n6 _1 x, H
随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。$ y" f7 O7 T/ E  X' v5 a1 V

' e2 M3 t& V; J  i

/ n, ~, U- j1 S/ P 微信图片_20230802163811_5.png
7 X: w: r& ^3 w% r
. T; V, b7 Z) N) J& \. O! b 微信图片_20230802163811_4.png
1 [; T& h# G# S. ?0 ~4 Q) H2 v) x8 g- S$ j" E1 Z
微信图片_20230802163811_3.png
" W, i$ T- b  N2 H6 `: U  O+ }# R+ v" z. O  g/ B

  M# ?  F! h" h, x0 q0 K7 X0 R相关代码:
  P+ d+ F2 p+ S7 Q& f- L
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   
    5 @& W* H7 H9 @# B4 h4 [1 d, {
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];
    * J$ {# z, P4 B$ N* X

  3. & r9 p. J3 A' W/ P# Y2 d9 G* O! O
  4. ADC_HandleTypeDef hadc1;+ ]3 w) R' t& i: {$ M4 l3 {+ d2 ?; O
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
    $ v# w' p6 Q  \- J

  6. 9 R6 S3 Q. K0 i& _* V5 \# A0 b
  7.   /* USER CODE BEGIN 2 */' K0 P, a/ Z' f& Z( n; ]5 I
  8. 9 |" a$ p  b8 y/ l4 c

  9. 0 f: j9 q# `( R
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version. L' A" y9 c0 J" {1 o5 Z
  11.     0 q% N, d7 K/ l  n4 R
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);2 [" f( ?' m% g2 t/ F

  13. . _" q5 I  v( m! L
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
    . O% l/ h# u* H+ n( r1 q
  15.                          (ADC_BUFFRER_SIZE)
    $ y  V3 t1 e( K
  16.                        ) != HAL_OK)
    ) z: \3 @6 d( Z! q
  17.   {; h6 q: s$ `: p. l* C. a
  18.     Error_Handler();
    # B5 l0 O+ z5 ~
  19.   }
    , e/ m8 w' P. l8 @
  20. & L$ l" U: ?' s3 W# ~2 l
  21.    /* USER CODE END 2 */
复制代码
6 Q7 Q6 e) L; K( H+ `
运行结果如下图所示:【目前4个通道我是悬空的】; j$ W! t' M/ i
# Q8 h& |4 q) J; j% z6 v
" k4 [- S- i1 i- J" F  E/ `( Q6 \
微信图片_20230802163811_2.png - {/ i( \. z+ g* v7 ~# Y, G' T

5 z$ p$ h0 J- t7 o
, h4 u& O# r7 e3 D0 v! y
现在对ADC4基于DMA链表模式做演示,其实就一个节点。
: J9 I0 G7 G4 ]9 s, d0 ^# \7 x$ R+ n8 z8 V) {
/ S8 l/ ~9 a9 A2 O
选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!0 J! [, O' F$ Z5 g, K
9 Z+ X: T+ k5 _

- X* B9 Q' x/ l# _, S 微信图片_20230802163811_1.png
2 k9 r; j! @9 n8 ^! j: I: E1 [

1 [3 W4 T3 B5 v+ F: |$ \* N: W关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
5 T& D4 u2 ^6 n( B
+ f+ E  Z$ Q* s/ b& C8 i

, B2 P  a; u5 J* j) L 微信图片_20230802163811.png # \! G: u- f7 M; o: A5 c9 I
0 c6 H: F+ U1 |$ \' K5 Z: b0 z+ y
微信图片_20230802163812_2.png 0 I0 r5 I$ j1 e" ^1 \, H

# c& |$ d/ `0 |" S( b; \' g. P" \ 微信图片_20230802163812_1.png
- V4 T' j9 K9 V# l, w6 b' C8 r) |, E& n/ j0 t- N5 n

' j$ y$ f2 v$ h6 j3 l相关用户代码:
& C0 }% a5 P, s" n. K
  1. /* Private variables ---------------------------------------------------------*/
    ) n1 Q. `4 `' t3 F; s' F
  2. ADC_HandleTypeDef hadc4;
    . B+ z! ]) S& Q! L; }& ?: t- ^
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;' k, m0 v4 `9 g/ U1 y
  4. DMA_QListTypeDef List_GPDMA1_Channel1;
    9 V* U" s9 X+ R
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;
    9 _+ J/ p6 t) r1 o0 c, H" Q! P+ U
  6. /* USER CODE BEGIN PV */% m+ G$ T, w9 }, q, V

  7. 8 V$ R& N; f! B3 s
  8. /* USER CODE BEGIN 2 */) a+ r, U! S4 F

  9. : W  G/ t# e6 K4 ~
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    - h! N+ A. t7 b% v/ {+ Q) d" b* b

  11. 5 h. D2 N- D4 s, w6 E' X: D
  12. MX_ADC4Queue_Config();
    8 ?* ?  _7 R$ d6 T

  13. , ]+ N0 z- s! c& v) ]% u! m
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);' b" v+ r: n) i8 l1 i4 }5 H
  15. + t' y4 W$ N1 t
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);+ C- h8 i( p& w, l  X
  17.     # a" w: j& S4 {1 Z. a- ?4 x
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)7 r( a9 s5 W1 g- O4 r" }
  19. {
    1 C5 s" t0 i- E3 p# ?$ h% S+ r
  20. Error_Handler();
    + J! f' E. E+ R4 T$ g* b* X* d
  21. }8 O/ J& d% F" O/ u5 P- p  A6 ~1 A

  22. ) q5 C* P/ r0 k& g9 @" h; R
  23. if (HAL_ADC_Start_DMA(&hadc4,( y7 n: Z4 e6 Q4 W) l5 w
  24. (uint32_t *)ADC4_Result,0 v9 h' C9 N) n
  25. (ADC_BUFFRER_SIZE)3 Y- v( `; I- W  c: `3 R  A
  26. ) != HAL_OK)
    . @! z. ?3 R, l7 `
  27. {+ ^) k0 L+ G; c  s7 e: ~
  28. Error_Handler();) y; G# L  b: f/ n% V) i
  29. }& [. n6 o0 s. ~7 ]. A3 u) X% u. o
  30. /* USER CODE BEGIN WHILE */
复制代码
8 A4 ~1 D- `8 N# S) h/ a
结果验证【显示了2组数据】:4 p, O# ]6 P2 J+ x3 {* W

0 i# s( P9 m/ N' B  ]
. h$ Z) u9 E/ ~* L# x( P
微信图片_20230802163812.png 2 y9 i6 C2 G. @. B1 @: G% a! L

; h! q5 n; J( u
: D1 J" V/ L5 C1 E4 h# G1 P
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。3 @: T8 E# a) ?7 Z
) ~; ^. L, C( ]" W

3 ^" e5 b# H) O3 A  _) z1 O$ J" P3 @: ]# j
如有侵权请联系删除" }! C7 S# H+ G# M. y! Y' k7 N

# j: B9 W% Z  o$ o" Q转载自: 茶话MCU
1 Y1 F7 ?; t! @* z0 T: V, d0 p: a6 z; x6 d) m9 ~
6 B  A- B7 W) [! S
收藏 评论1 发布时间:2023-8-2 16:42

举报

1个回答
无极考拉 回答时间:2023-9-8 08:56:44

学习一下

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版