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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
* [5 s; I( ~3 b6 k5 Q& Z4 j, ~5 `* A+ r2 l3 N( c( o# f+ e

. ?9 y. }7 i0 b$ I3 m6 t先对ADC1基于DMA标准请求模式做演示。
. c5 \2 P) M* z0 n8 w7 p: X
' a; t6 [* {% M7 I$ C7 I# O

" \7 Q2 s& U" ?. D1 U# i8 m随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
3 d( ?  J, ^, S! m) w8 a9 ?
% y: x" D& _4 D
! o/ Y$ p8 c6 O& d1 ]  U8 [  s
微信图片_20230802163811_5.png
4 @- Q0 ?3 l3 K  y/ A
4 `( b5 t0 g& _; G# H. U& M 微信图片_20230802163811_4.png
: e0 i7 {% u) A+ o; X+ C! T% ^4 A# w
微信图片_20230802163811_3.png $ S; U3 u. k3 o: c6 n

, N6 k) @- s9 y
% j: p; ~1 k+ `# n6 z; ]; F9 L
相关代码:9 u/ U( {: r! Q8 [8 o- y
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   + k& j: i5 u. Y1 I, [; ]% m
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];
    + D) L2 s2 {" u# e2 Y
  3. 6 w- ?/ L( A. v( I+ h
  4. ADC_HandleTypeDef hadc1;
    2 E% a0 K7 w' Q2 t) T  ]- X
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1) t& p; A' V% f$ o' _
  6. - }2 G  Y- Z' `
  7.   /* USER CODE BEGIN 2 */
    . y/ }9 E( b: ]0 R1 }# V( B

  8. 1 \( f  ^  q4 @# P( K1 i1 M

  9. 6 @) I- I+ k  b! q, _5 a, v
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    # l/ `/ G- r0 D- [
  11.     " [, L+ N! R0 F7 E' O
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
      J- d8 |6 A5 C

  13. , g! Z' @/ S( P, k
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,; H: L2 S/ u$ q& f2 ^
  15.                          (ADC_BUFFRER_SIZE)0 O# A  l0 [6 h( z
  16.                        ) != HAL_OK)
    $ c" H7 d* k7 j! V3 j$ @  o7 J
  17.   {
    : D& Q4 D2 P: m; ~! p3 B
  18.     Error_Handler();, l4 r+ x- L3 v3 X( ?. F
  19.   }
    9 O$ H" a; P2 C" N" P
  20. ) A0 I( L/ ]9 I# k6 ]! `7 J
  21.    /* USER CODE END 2 */
复制代码
! T& E6 f7 S( `4 A& T% x. _0 s1 C9 Q
运行结果如下图所示:【目前4个通道我是悬空的】
% ?/ D+ N" S, @& E& A4 ?# _
( I# C& T* i9 c% `- J
, A! g4 b5 V8 B
微信图片_20230802163811_2.png / r7 ^( R9 i" R

& k8 c+ ]0 Q1 }' O

1 N) t- U! L3 x, A. {现在对ADC4基于DMA链表模式做演示,其实就一个节点。% u5 E  X  W7 A1 F1 W+ B# J

5 g% _* ?1 B; e/ W3 f' x% U

. i5 j( d1 E6 ?* D, F' [0 `选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!, \& M" H9 p! E1 g/ b

$ n. Z9 e+ w) g

) |8 v# c7 z2 |, z3 @$ N 微信图片_20230802163811_1.png
  S. e. D1 Y$ D) X2 u7 g6 p0 I4 p
- y9 u! Z4 I% k) c" [4 O2 ~

2 D* v0 P5 J9 O6 A* |" o7 E关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
8 T$ L0 r8 B2 e. j
5 i, \' o# T0 M2 o  H

$ p6 U5 v) O, X7 @$ D 微信图片_20230802163811.png
2 Z' j% `4 L# S
9 k# r7 i# ]4 O7 G# i: ? 微信图片_20230802163812_2.png 8 n" I- j; P9 W' ?0 c" N' e3 N/ l

. Z1 K: v8 E& Q# X: X 微信图片_20230802163812_1.png
* W  H) e$ G' q# F
' s  g3 `; [0 R+ p) M' R
% p! g8 Z/ }; B) ]7 s8 i8 Q
相关用户代码:, z* |2 O! Q3 c& d# L+ I
  1. /* Private variables ---------------------------------------------------------*/
    ; y8 F; ^6 \; z4 k
  2. ADC_HandleTypeDef hadc4;5 U3 z. j6 Q0 n& B* O, o% H
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;
    ) r, f* B  V, L: R9 A% P$ Y( ^+ }
  4. DMA_QListTypeDef List_GPDMA1_Channel1;% d2 {. G9 f& p* ]9 A+ n
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;
    * @3 C& |/ {3 g0 Y
  6. /* USER CODE BEGIN PV */  g' w$ C9 Z3 I9 Y# O) `, P' j* O% P

  7. - C1 a: e' L, C' t
  8. /* USER CODE BEGIN 2 */4 G: q: W9 V, z. {9 |0 O4 K
  9. - j" n+ k. x5 [7 e  c3 B" Y2 K4 w
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    ( ^4 k$ S  N- N5 M) }) W: R

  11. / ]! ^9 P, T: W. `- b/ ]8 t& s
  12. MX_ADC4Queue_Config();$ d3 [& S. P! W
  13. 6 w; r" G' I* C' m+ L
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);5 F- B" P5 U$ l
  15. 9 C7 `- h* y: A6 T# S
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
    1 j, y/ I( j  Z
  17.     ( N2 A9 D2 b" Q% h/ e2 T
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
    ! m, i: n( ]4 K$ V  F
  19. {
    + Y6 _* F; h; W8 u3 ]7 y
  20. Error_Handler();$ l( m. Z& b1 n. Q4 D
  21. }
    . p, L9 j. v5 a6 B

  22. 7 e7 N/ Q0 O- U% O
  23. if (HAL_ADC_Start_DMA(&hadc4,
    8 D' _' L4 z2 W+ P  m* a5 F
  24. (uint32_t *)ADC4_Result,, Z: X4 m: k! L5 W+ t, e/ o
  25. (ADC_BUFFRER_SIZE)6 a+ v& n4 J$ k" S6 F
  26. ) != HAL_OK)
    " [9 g5 f* Y9 l+ c- J6 l: V; k
  27. {: k/ F& v- X( _# m2 c3 W5 \: t
  28. Error_Handler();2 d8 A3 L" V3 s
  29. }
    + e; \, p1 j. [& z8 F
  30. /* USER CODE BEGIN WHILE */
复制代码
1 i& x0 @- H0 ^" H' f5 o
结果验证【显示了2组数据】:) T+ m0 Z9 a" w0 d/ {4 ^/ a

3 {' J2 Y7 e0 d9 n( I* l1 d2 i: Q
8 s- s3 v+ K! B+ I9 O) G
微信图片_20230802163812.png : u( O: e- F: ?0 `

& I7 h# @- V) E2 Z5 x  N7 n

  [* ~5 ~- |  T, x. i; K最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。
' ^, @$ T4 I2 {  I, \
- }3 Z+ Q0 K+ L+ r0 ]

" I& |5 d1 H6 t9 K  h# c8 `* U& N5 K, y( K! ?! N
如有侵权请联系删除$ Z% C% C0 f5 P2 u  m2 d

( D8 u: Y3 V6 R" t' _转载自: 茶话MCU
$ c* c% {, [) |6 }- B! X
  v3 o( K. P. j
- n1 G: L1 J9 _/ c  B  G
收藏 评论1 发布时间:2023-8-2 16:42

举报

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

学习一下

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