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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。# q# K3 n& ^5 y  E& N
5 o0 {9 u( D. N+ H

$ t( P( e# E! Y  a' j0 z' o先对ADC1基于DMA标准请求模式做演示。
6 n3 A. h* W, t4 @6 N2 n5 x0 w: _" C* ^3 ]6 {

& e. \2 Q# y. R2 D9 e% |随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
! w1 X4 F$ X# V9 m
4 o! J& [: r9 V4 L1 R  T

! q, X& G0 E: H' z 微信图片_20230802163811_5.png # m2 O7 b) ^# A) H( ]+ G

, g! j% U5 `0 q1 o9 y* h2 _, A" E 微信图片_20230802163811_4.png
$ D3 z! C( |3 q( D
* b: a" v9 R" Y 微信图片_20230802163811_3.png
+ w  C9 s1 b+ H% F* G; X1 ]/ `
$ V+ v* t, k6 Z1 F
6 L4 h5 c, Y$ d8 x9 O% {- F
相关代码:
3 s, P9 k$ w, P( ]8 L
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   
    # V) L' A2 S& g! f( A( R9 \$ Z
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];
    " H. Z& \8 m8 P/ w  u0 @( b

  3. # u2 R1 A. T! T3 l5 f2 P( H
  4. ADC_HandleTypeDef hadc1;
    3 H- m; e7 y4 b( u$ x# v; `9 J
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
    5 ]" {( T! j4 C  r
  6. : _3 F/ Q; D8 ^7 n# i: u& f- p
  7.   /* USER CODE BEGIN 2 */7 Z! f' w8 G! i7 X  }

  8. ! Q$ j. ^2 F" r" R  _% c% W6 T; A9 J

  9. ' m. a& Z2 i! a! `) @7 h+ m
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    , e1 a! J7 R8 X* o1 k0 @. b
  11.     . F# a5 v" I# B% f& I0 v* x
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);$ M' x) \$ @* n; |/ z: W
  13. * A- Q8 \9 o" ^  W
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,2 U. u. M  \( o" `# X4 j, B5 H
  15.                          (ADC_BUFFRER_SIZE). a6 H3 d* h  H( Y; q2 R
  16.                        ) != HAL_OK). H5 ~' M" l5 A$ R0 r( B3 I
  17.   {
    1 y3 N( ]1 ~% \6 V
  18.     Error_Handler();3 K6 R6 r8 l+ `$ p
  19.   } 0 |) K0 I# F! Z; T6 w+ J, @
  20. ; o! a9 E4 N* x9 B' Y1 h
  21.    /* USER CODE END 2 */
复制代码
. u8 b7 `& r; ^$ u5 ?1 k% W
运行结果如下图所示:【目前4个通道我是悬空的】
7 @6 |8 p( o7 O8 S! o
' \5 A2 u/ y7 G# p6 s( C' v' @
- ~- P1 }- y6 D5 b
微信图片_20230802163811_2.png
" a# o) s, f! v( P; w) r! @- c3 t. l7 V" z3 Q

' e; b: {1 T8 C( g% m6 _现在对ADC4基于DMA链表模式做演示,其实就一个节点。- F- w  z6 {/ _

! P3 w5 B( H# V8 K; H9 W

) O- T# u+ T# m7 `* P7 T; W6 Q* E6 ]选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!) m/ U0 o8 \1 P7 ?0 C' u5 u& f: B
9 z5 ?" m, r4 J; x5 g
, ]5 Y/ k+ l4 N/ J& m1 l6 @
微信图片_20230802163811_1.png
, C( o: j# Y" M5 ^: x7 a! F* p2 d0 r2 P
! K  @- c, y# h& i- o
关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
& y& u6 [% z3 F6 \+ c: C
; D0 w& a3 e4 m% l
1 b; ~# y; M* h
微信图片_20230802163811.png
# I' O- y6 X! Y# W2 ~/ m' m4 f: z, o" K
微信图片_20230802163812_2.png
- S, k# v" i) h4 y3 K4 `7 p2 h8 i
微信图片_20230802163812_1.png 6 v2 s$ F) _) z, V7 v0 n) f. ^

$ l2 C; B' s. m1 z8 y* _

( r$ T. p$ x7 @$ `相关用户代码:
1 T& Y2 N. s  M( B/ U7 v% \$ j; e
  1. /* Private variables ---------------------------------------------------------*/0 ]: N; g# _7 k' G/ ]+ |
  2. ADC_HandleTypeDef hadc4;
    ( x3 Y/ Y0 R% |. a
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;
    5 v' ]' d% H6 e, m/ ]3 N
  4. DMA_QListTypeDef List_GPDMA1_Channel1;, u3 M% |* a2 F5 ]" {6 Q/ ?
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;
    " ?; n# B, x, p3 ?" k' v
  6. /* USER CODE BEGIN PV */
    0 u2 {5 Z1 y" S2 H
  7. 1 ~, y$ L, v; Q
  8. /* USER CODE BEGIN 2 */
    ' ?# P( y0 q& m$ ~0 I7 B

  9. & r) r9 o8 t  k7 w8 c
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    , Y4 A' [7 H# s2 k
  11.   ]8 I7 n$ k! M4 p6 ]$ K
  12. MX_ADC4Queue_Config();
    2 j( P2 C- @  U  `5 t" R

  13. ; d$ d6 u6 }+ a" d7 u+ y" D
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);4 e& n8 A4 }: J" z# |: n
  15. 0 h* X" C, ^# x; V  R# V, ^
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
    9 ^! ~5 b) v/ D" D6 z4 T
  17.     6 t& Q/ `: s% V6 I4 g) a
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)+ [3 @# H8 A% O; W$ M: r
  19. {
    ( Y) h; Y$ `$ F3 j# |& i
  20. Error_Handler();+ P. ]( s, Z+ W! d
  21. }
    # H' v# i/ s6 d. x) ?/ Q( h) B
  22. / X. l1 [: d9 N6 M& f
  23. if (HAL_ADC_Start_DMA(&hadc4,
    ) ]" ?" u- I8 Y) F6 Y) E- s
  24. (uint32_t *)ADC4_Result,
    1 q$ ~. o  i2 t4 \5 w2 A7 D/ g, P$ j
  25. (ADC_BUFFRER_SIZE)
    : S5 i' W. B5 j5 M% d: a) _4 C
  26. ) != HAL_OK)
    # v2 G0 N; `. M) Z. B4 H% j
  27. {" q) n) {5 S2 h) `: c
  28. Error_Handler();
    4 v  J- p% n  u8 }4 `/ G* [; Z! {
  29. }' p6 H' e* Y' P7 h; \
  30. /* USER CODE BEGIN WHILE */
复制代码
. \: N! `$ Q9 z* v: s
结果验证【显示了2组数据】:5 L* ~8 ]" b9 E
8 U) b7 V/ X; ?# L7 N

" ^: @! ?$ v( e) F9 c0 @ 微信图片_20230802163812.png
5 t+ X0 t% v; |4 _) o/ O$ a9 D! q0 H! T' [; c4 K/ i7 M

7 U: k, G; G( Y4 k' P: Q最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。3 p4 c! m  e) E- E
: k! J. R9 @- l: \7 W) Y  s0 ]5 s
2 Q7 v! z: ?/ S' p9 l4 i+ ]# N
4 C/ ^- H: W/ R! y$ }8 m
如有侵权请联系删除) O. D- E0 `! c3 ]9 K
3 S/ R8 l1 K! Q  e6 _  {
转载自: 茶话MCU0 S+ u# K# g  A. z* p: c' {2 Q+ Y8 n
" S6 S' [5 d; U  B2 W' F0 b: c
/ j" I* l! y7 @/ u5 M0 s
收藏 评论1 发布时间:2023-8-2 16:42

举报

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

学习一下

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版