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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。& X( D" f1 J% v$ r8 V4 m" u- G. _
$ L2 {) I* x+ C$ u

) N, r, K4 J( {" t先对ADC1基于DMA标准请求模式做演示。
# J! k8 e% J9 ]* I. B( D9 x0 `5 Q- Y/ A! ~) n. p
6 |" @$ b, x1 ^' u  s  V' ^& g$ o
随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。8 t+ R% W" ~6 z% ~6 W" K, ?! t
4 g7 }/ k, j' U6 Y' G8 L  m$ u
- A9 Y( Y0 o( Z- P3 G7 y  }, G
微信图片_20230802163811_5.png
" X2 x5 o4 j5 C: g: g7 V/ P6 s' L9 a/ B8 i% j
微信图片_20230802163811_4.png 2 j1 Y. K3 w* L: R

, `2 g1 D6 n2 v# x: {4 e/ S 微信图片_20230802163811_3.png
3 {& y/ L3 N7 \9 O8 }8 P
" l% F6 z8 b6 d# l. E
0 l4 e; @$ }1 T# V$ i/ ]9 R
相关代码:
8 ?. \$ G, C. i. E( h( Y
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   
    # d% S" x1 r# F" P; v% Z# K! D
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];( P) c6 n3 o+ |; |2 a( J; |" l
  3. * M2 F2 L( V( [" `: ?
  4. ADC_HandleTypeDef hadc1;
    + \" e) z& C- D: @5 D
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC13 e) U) O+ \5 e  Z- W$ y% ]( n
  6. 7 J- \0 C6 c( G
  7.   /* USER CODE BEGIN 2 */5 t6 @+ c& b( h4 m

  8. - `7 r+ o. W" z) ^" M

  9. ( Y' m& W: J: F- n- r
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    ( u3 Y! C/ _/ C- f' A1 j6 }
  11.     ' o" K9 B) J: r% g
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
      X7 v7 R  J* [
  13. & F7 H9 S+ k: w+ T
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,8 [' [' B! Q) m, n* M
  15.                          (ADC_BUFFRER_SIZE)% h% p& L2 J/ o2 @
  16.                        ) != HAL_OK)
    : o- q% }. O. G3 N1 S
  17.   {) |- \, h- [1 L8 b$ Z& }$ q
  18.     Error_Handler();) g" h  C, M" `/ _7 q7 E4 a' `/ k
  19.   }
    ; Y3 ~2 h! x* _. Q! j2 e/ `: J3 R
  20. % o0 e3 o) z2 H: k2 A. v2 x& ^8 r
  21.    /* USER CODE END 2 */
复制代码
; ?$ s, q  o. |& ~
运行结果如下图所示:【目前4个通道我是悬空的】
/ i1 Q( [3 G! j5 O3 e5 m: r9 Q6 w  x! D3 s
, o* c. n- L: A, n. [% z9 ?
微信图片_20230802163811_2.png
) A& S: r8 E$ Y, A- E% E
' j3 o8 x# d& W/ `' u3 z
! q( f7 P+ J, s3 F5 }, z% p+ ^
现在对ADC4基于DMA链表模式做演示,其实就一个节点。
& ^2 z, I7 G. Y" V) Z1 L
: M  c! t, P% T9 v5 d0 n7 D
. k4 U2 n: n2 N5 f) X& y# `4 L7 x
选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!3 O( l2 P9 [6 K' @" F
  D/ v) S8 d% @0 m

  |5 p7 @1 J8 T7 L; _8 Z% Q 微信图片_20230802163811_1.png
3 b  o" N: b3 i% {6 k' S1 R$ k, R0 W7 o& k+ I
4 J/ O5 K6 g1 |! y$ W- g
关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。  d% O; `" j& l

( f+ ]9 U1 ?! L' s; U

' b8 W7 D; Q! ?1 |) K+ L 微信图片_20230802163811.png
4 k, D3 n' R& x( f$ h) d- V) E# n9 V0 X
微信图片_20230802163812_2.png 0 K8 x" F. T! N- o9 i& h
; s: C( `8 x+ O7 n0 W: x3 L* B1 M
微信图片_20230802163812_1.png
7 n1 e4 Z2 c( Y" n  i9 l
' A" x. q5 r4 M% j; c3 k: g, f

9 U1 ^3 k0 ?( i* T2 h相关用户代码:
+ A0 m7 v- x; }# u
  1. /* Private variables ---------------------------------------------------------*/
    1 y" m/ Q# ?3 D
  2. ADC_HandleTypeDef hadc4;  |- `, I$ ~  f9 Z7 i6 C
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;" e7 v/ \% F: N1 j2 |+ ~9 B2 j9 j
  4. DMA_QListTypeDef List_GPDMA1_Channel1;3 \8 |, ^) V5 p+ ?5 d5 E5 r
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;3 j4 ^3 V% Z. x
  6. /* USER CODE BEGIN PV */0 C6 m( S  ~% W, V2 d" K6 Y

  7. 9 ~3 ~- W0 C! D" N
  8. /* USER CODE BEGIN 2 */. L& x) o& A: l1 s5 {3 w7 v* P

  9. % L# Y$ z% J- |5 v* y
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    : k% ?  t$ B& t. ~6 o

  11. . q" ]: Y" g  T9 }" |
  12. MX_ADC4Queue_Config();
    2 ?1 Z+ l# B; N/ Q2 i1 i3 }. u0 @

  13. 8 A+ M  W, s& y* I, Y
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
    + Q. J6 ~/ w7 G: N0 M; F

  15. + R1 P2 v3 G# w0 g3 Q  v. ^
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
    5 ~5 B6 m# v- P% d
  17.    
    2 U0 Q! [1 y" h( g6 O3 J7 F4 |, u
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
    7 b4 j. C2 m5 g( J, j! d, u& X
  19. {/ Q* m/ B3 ^/ ]8 r6 e
  20. Error_Handler();
    . {0 D- O+ E  _! K' k8 r. ?
  21. }
    + j4 z% ~* n( R9 C8 ~1 G

  22. , x9 S% E9 o7 N8 [* M" d
  23. if (HAL_ADC_Start_DMA(&hadc4,
    - g4 g) i6 n- {# ~) S( a4 R
  24. (uint32_t *)ADC4_Result,* |: ]5 D+ N5 K' h
  25. (ADC_BUFFRER_SIZE)
    0 w9 L$ V/ ?8 Q5 a% F  s
  26. ) != HAL_OK)
    8 c8 P6 I2 ?: b: T: t: r) w
  27. {3 K3 l$ G. E1 x
  28. Error_Handler();% A) }7 L, D* v4 a0 U( }. I, ]
  29. }4 a: j$ `! K2 ]$ @2 i* m; t" J
  30. /* USER CODE BEGIN WHILE */
复制代码

9 t  n+ j6 X/ m9 Q/ _& H结果验证【显示了2组数据】:. s: K, p0 H1 Q- D0 J! k  G/ k
9 X' K* f! Z; C+ |' @+ M7 G9 U4 `

- ~6 r  u* u6 m, f7 H1 z1 k" M2 t( f 微信图片_20230802163812.png / S; B- h6 W5 |2 l% r, C
0 ^4 B% K7 w6 r# ~8 c8 o

5 d8 v/ H1 X: U$ Z' K最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。- _3 P/ F* O' a' d1 d! c  l

) m$ {2 |. f, a) ~; t( p) B

# t6 o0 g- c: J# z4 d' G% g' A
/ h, N( A& j3 X& `0 C0 }% i如有侵权请联系删除3 a. w  E! G. `7 ~
# ~# Q% t9 c: N, d
转载自: 茶话MCU
  S; c5 ^# @% _4 k
6 k2 |) y8 f, V" g5 L( ^3 y- n: Q* p( N, _0 L# B
收藏 评论1 发布时间:2023-8-2 16:42

举报

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

学习一下

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