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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。, T) N+ f% l" W) _$ U

! N7 Y# Z2 ^' S" V0 G! _
6 g0 H3 T' M3 A% g- d  T
先对ADC1基于DMA标准请求模式做演示。7 H; s. ]1 q4 P" W! h

* M! r5 F% m  \: p, C- M# C9 D
/ I/ {4 D# Z2 o1 m4 L# Z  [
随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。; }8 o: W! E+ x- x& ?
; W9 _4 C- Q; r& g9 w" z; G
( Q0 b! w2 o" ~& Q: \6 F- _) ?. M
微信图片_20230802163811_5.png
" q# C+ T& s2 ?2 y8 c9 W1 C
) H7 n$ r% b0 T. ~! w7 b/ @ 微信图片_20230802163811_4.png 6 l" x# c9 W( x; N' j! p1 P8 \% g; F

6 E3 b$ r: p8 @1 k; N 微信图片_20230802163811_3.png
3 |$ q/ \4 |6 o6 ~. F
4 ^5 ?5 @" G3 Z3 \& L) f! w6 f
9 H7 i. V  ?  q- P" c2 k+ h- l
相关代码:
+ E' r3 X, G3 w3 I$ _
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   
    9 b8 T7 R( u+ i( ?0 `! B/ Y
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];( x# L3 I7 F" u; z

  3. ; V" m# K* p$ s' k/ {  K
  4. ADC_HandleTypeDef hadc1;
    ! h, R# p. p( i1 q
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC12 Y; f- i# ]- ^8 n7 g/ X  M5 Y

  6. ' [* [+ }1 i# N( ]0 R* Y* s9 D
  7.   /* USER CODE BEGIN 2 */
    " C1 |3 s; M: v) d
  8. ( ]0 h' G% S6 Z3 @) \

  9. & G, b; j1 Z/ o+ E) B6 \
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version' \/ }1 b& v# [8 W
  11.    
    0 v7 o0 M) u, U2 m
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
    . b3 U. M+ ^, F9 Y  n0 @0 \

  13. * I! h- ?' n  O- T; s& c
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
    ( j7 F/ Z/ ]+ R3 s& C" {
  15.                          (ADC_BUFFRER_SIZE)( c& ~5 J  n0 C: v/ Y9 @9 ^4 Z
  16.                        ) != HAL_OK)
    " i$ b& o7 u* @8 f% Y7 A4 t. E
  17.   {6 r$ l4 G/ h+ u6 e
  18.     Error_Handler();+ \0 D5 v6 K: z7 L* {; a3 ~
  19.   } ; C. z3 A4 m- o- a; b9 F

  20.   e6 U- i- y; g  w/ o) g1 B
  21.    /* USER CODE END 2 */
复制代码

8 U  Y3 U  p% n) r# r3 m- r运行结果如下图所示:【目前4个通道我是悬空的】  X  l2 o* k+ O3 J5 A5 x# s9 W
" l! M8 D7 r. l( b* w8 b1 l# b* u' t
( M+ y5 A  `$ P6 Q0 e
微信图片_20230802163811_2.png # A& |. b9 ~, Z0 G4 w/ |/ p/ A! q

0 ?# F3 ^7 y" I1 t. Q

+ u: M5 n# D: d; c8 _现在对ADC4基于DMA链表模式做演示,其实就一个节点。
: I% l6 T& ]% w4 |/ {
( J8 v: I4 Y" x8 M! A+ i1 L
0 Z& J( s2 L+ b7 y7 o, _
选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!* v* }5 C' _+ j
! z: X( x) E' `' `( t2 \

  j" U, d. }, S' N 微信图片_20230802163811_1.png
9 C  n) k! s1 r$ ]( j# N# j; z( k/ m

1 Q, {) A& R  Q/ |* K7 M  ?4 _! q; Q关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。' `, w* O/ z  N1 K& z: p( `7 h
, ?- J" e; B) @: A, j

/ E& K2 T+ u% U1 \7 E$ s2 Z" \& F* T 微信图片_20230802163811.png $ y+ k/ W# T. i; d( ~; c8 D

* I6 ]8 X! R) g. G; j2 ^! z 微信图片_20230802163812_2.png
$ P) a) A- W( S. {" T" v4 U3 V) _& `( X% n# B* b1 A- {% g
微信图片_20230802163812_1.png
$ S3 b$ s3 j+ _! g% z$ g/ ]8 f
0 X  Y  Y, W% Q0 Q: c. w0 ]

2 S6 ?) c8 f* E- h- {相关用户代码:  _  v/ U% \3 [3 S  {8 V9 e
  1. /* Private variables ---------------------------------------------------------*/( Q. c" M! }$ Q7 \& d
  2. ADC_HandleTypeDef hadc4;' j. n9 N# ?" r; U- a$ B% z& r# M. k
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;) ^5 Z% `- y- b1 V5 u8 c
  4. DMA_QListTypeDef List_GPDMA1_Channel1;
    ' F) o: @; ?# y; R4 N
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;' l( h4 d1 Z& w8 N: ^2 \- i
  6. /* USER CODE BEGIN PV */
    3 R) ?8 Y% q) z( ^4 b* d
  7. " q8 R" T5 |1 ]: R3 Z
  8. /* USER CODE BEGIN 2 *// o$ ]; p  l& W

  9.   t; V0 R/ G: u; A4 h7 p4 [3 F/ K
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    , B; Y6 L- w* y2 `

  11.   }$ G  h' _) h; h7 _. I
  12. MX_ADC4Queue_Config();* q( p  B. C3 I9 b4 u3 b% {7 p3 k( u
  13. : |/ V0 ?0 B5 |4 l, ~/ X' m
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
    0 _6 W  V1 Y/ M+ Q2 [' n4 U

  15. 0 N4 f/ `% {) o( [) Z9 V0 G
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
      v: U4 t; {6 v- t6 e
  17.     . a5 }7 H1 e& D' x! Y, {. t
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
    - r; n7 H3 t' f# ^0 V, v' o" p
  19. {- z; L8 T' c1 z$ v" k+ t& `$ J7 N# q
  20. Error_Handler();
    # @  {/ H; o1 Q  V7 C
  21. }' E. s( a% a$ L) [( X% X

  22. 8 n" v* x$ R, p; H; D' S+ h/ }. ^
  23. if (HAL_ADC_Start_DMA(&hadc4,# l% X. n8 X, V- ]: k% L7 f% ?
  24. (uint32_t *)ADC4_Result,7 y; p  a. \. D; r3 l
  25. (ADC_BUFFRER_SIZE)
    ( o# O7 X2 s7 i
  26. ) != HAL_OK)
    , ?, Z! T' u: e# Y
  27. {* O* ~: L3 U* u
  28. Error_Handler();
    4 ~. Q$ U5 k; w" Z1 Y2 ?' \' L& P
  29. }
    - Z. }; }9 h2 H4 r0 ?& r: n) f
  30. /* USER CODE BEGIN WHILE */
复制代码

+ F7 C! k# A  I- _7 x, n' ?结果验证【显示了2组数据】:
5 V! |+ R5 z/ l6 k# V6 E8 d/ }& ~8 r* ^1 h0 q) F

- j: U/ a4 N! v7 s* _ 微信图片_20230802163812.png
# y. r, I/ o, ?+ R  {4 H0 n! N- T* A4 w, i! d0 ~/ |* [

3 J8 Y3 t0 L" B8 y* K, Z, `最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。
7 |9 P& r; i8 @. l: Q% R4 g, h! H7 J- X' ~

* E+ R- R( L: ?7 D0 b/ K: n
5 O" ^' d" F+ V" p/ R) W: ]如有侵权请联系删除
- u0 P1 u$ h2 J! _4 v8 ]* z3 T8 t: t2 C0 v8 `
转载自: 茶话MCU3 C1 F' o3 O, F$ ^0 e
8 D# d2 |1 Z5 Z8 e" r' z+ P
3 S6 b0 d% w) [; h- ^6 |
赞 收藏 评论1 发布时间:2023-8-2 16:42

举报

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

学习一下

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版