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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。3 H3 R& d7 J8 o# l; l

, d: p/ R% |6 `1 u4 M* K
' v* J) A) f/ ?+ p' t4 C
先对ADC1基于DMA标准请求模式做演示。# h' D, r) m* ~

% ~4 M9 S& W$ n! [# I

# I& Z* w0 L# w6 b: X7 R随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
/ y7 Y6 r" s8 d3 ?5 h* p
* u  Q+ U- ^' G4 {& l
* w! U$ d& k% l& B' t
微信图片_20230802163811_5.png
; J, s, I/ h) x7 s% x. C6 D: j; N2 q, r* `& y
微信图片_20230802163811_4.png
  _" k5 b/ u: {# `
5 t1 \( q/ b8 W% y  b 微信图片_20230802163811_3.png ) f& v+ e7 |6 a4 g7 Y7 H

3 ~  Y( H$ M* \7 O1 G: S
! H2 w1 C2 j% [7 B4 P) B  x
相关代码:" I  i  z- D( U: ^7 f
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   0 d, Y$ E; m0 {8 K! c
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];
    . S  `$ R+ W4 Y6 f1 \

  3. % a: b6 v* R" _5 `( n4 c4 ~5 R8 u1 h: j
  4. ADC_HandleTypeDef hadc1;1 g) o2 w. `% [" V9 b; ?: P
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1' o& \2 D3 k) \3 p: z5 k

  6. 4 y/ ^% d8 ^; ], n! o
  7.   /* USER CODE BEGIN 2 */, H  |7 g: y: @% l3 x

  8. 2 x) S) a$ ?; G  g" t) @1 U5 j( A4 X

  9. 4 ]9 s, I( P" j
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version, }  A8 S) B2 \* T
  11.     ; d7 `' p( c* ]' z3 G
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
    ! M  ^" t! U* N, w

  13. 3 w0 d8 V3 N- y/ O1 t5 \
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
    # ~4 G9 A. p+ j* t$ s+ h+ o
  15.                          (ADC_BUFFRER_SIZE)3 L: [- Z2 y* Z( K9 H$ \  X' P+ y/ r
  16.                        ) != HAL_OK)7 Y, @  W# N! C! k- Q& T3 @2 M( U
  17.   {
    . K- ?/ Q* H6 ?: W
  18.     Error_Handler();
    ; r" w+ t- e, ^+ w
  19.   } # n6 _. r  _4 D" `

  20. / d, y  |* R+ `; H2 u$ A
  21.    /* USER CODE END 2 */
复制代码

: @5 [) o, E9 t5 I: E运行结果如下图所示:【目前4个通道我是悬空的】
7 R* W; S& T2 j$ f3 K5 v3 l
6 Q( W1 k& A2 u
% o  q" i. }: \1 L) T) N
微信图片_20230802163811_2.png
& S  h/ L* X7 p& f* i2 r2 ^
$ i2 N3 x: N: S8 m: O1 P

; i+ M+ x- x. b8 [+ A( k- ^# a现在对ADC4基于DMA链表模式做演示,其实就一个节点。
8 F& x4 B7 M$ d* B3 e% g+ V$ G+ d: l. R! U+ H+ g
% F3 l) m" \2 [( a" q% L/ E7 `
选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!+ K3 p9 l/ ^0 T. F5 q

. K5 D2 f" v" Q8 K7 K# {
9 K  f# d, G8 q2 c5 j- j8 ?! v, Q+ u
微信图片_20230802163811_1.png
9 N) G! H1 `/ q  w0 [/ ^
8 I# ]7 W, t+ V( h# `* g/ [% \5 m
% U  Y6 d; ~4 }5 k( s6 h6 S, x$ L
关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
' [4 I( k9 l8 v( a# J/ k) t3 g3 b
  C2 L- U+ P, B7 C6 F2 k3 j

; N/ S% f& ~# N' o/ b/ N- ? 微信图片_20230802163811.png
2 I. H0 w( b$ r; [4 G3 i. d4 d. \# e6 j& A
微信图片_20230802163812_2.png 3 ^3 R+ F- _' ]2 m' d& x4 `# f
7 k5 Z5 f# I/ S' e3 H- O+ H7 @7 @8 g
微信图片_20230802163812_1.png
* `  o  F' |- i
; X8 {+ f; l$ f" Y" F

& y- o, j" z- B/ Q! B" S相关用户代码:. @0 ]  d8 x: f& w( ^
  1. /* Private variables ---------------------------------------------------------*/
    ! W2 a6 K; `* E' F  [- _
  2. ADC_HandleTypeDef hadc4;
    2 W% c$ G& {6 j+ ^( g) ?- c
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;
    0 g6 J/ G9 {5 v9 E- E$ ~. Z
  4. DMA_QListTypeDef List_GPDMA1_Channel1;
    * A# P+ x# ?( \
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;4 |9 c1 H6 F6 S" d0 i- G
  6. /* USER CODE BEGIN PV */
    0 x+ ~; n. `" r0 \  C. q; r5 T
  7. 8 n8 Z2 y# |' J) h0 B
  8. /* USER CODE BEGIN 2 */
    7 d' X9 y# ?0 p& [
  9. / K0 g$ x5 q1 Z( H$ O' E* \" v2 {6 q: A
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    ' `# Z% C7 ^% z2 z; f1 t
  11. $ d+ Z+ {7 b; ^3 y3 ]4 e
  12. MX_ADC4Queue_Config();9 `2 o) _3 [0 q! ?% h0 T& N' [' ^
  13. ! [% R& V4 s  _4 l2 l: F' }
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);' n1 u+ c( I9 t# i$ g! \

  15. , x2 i+ [$ v5 R' T  {% `* t
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
    - w* q+ N3 q  J
  17.    
    1 r  i1 Z4 N* M& i: l6 h
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
    4 [+ @  @7 E& F6 L+ N( ~. J5 l
  19. {+ J3 Z! y0 ?0 \  t0 ?
  20. Error_Handler();
    8 Z4 a) t+ ^# |- H* D- E# C" b' }
  21. }. f, D+ D1 q' B1 T
  22. + e3 G/ [& a0 h  W* [1 k' y9 @
  23. if (HAL_ADC_Start_DMA(&hadc4,
    - |% B3 n+ P8 c6 H& P/ J
  24. (uint32_t *)ADC4_Result,
    7 O8 Y( |( v% j& c+ D3 h6 @" z
  25. (ADC_BUFFRER_SIZE)4 z; f! P, A' [3 o1 j" w
  26. ) != HAL_OK)6 p3 @+ U4 q2 j4 E
  27. {
    1 @) l5 [9 ~2 ]' }! M7 C6 ^
  28. Error_Handler();0 ?( t* \! t: g
  29. }
    " L( G/ H: Z5 a- @. ~
  30. /* USER CODE BEGIN WHILE */
复制代码
0 R) M5 I& P+ i, p1 h$ y
结果验证【显示了2组数据】:
. I* i2 L  c8 H! J& v3 t/ n  P1 z
3 j3 M& A. o6 f0 z4 t4 Y! L- q' I7 O
8 H+ A7 ]. d+ Z& b1 g* w
微信图片_20230802163812.png
4 b5 E1 ]5 G8 I* `& i/ ]+ c
4 u; J) Z* {$ }$ o8 R: g

% t' x5 D3 W- j. L最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。9 t* M9 _. ], R/ M2 f* u5 y+ A

1 P2 r) ~) P; t8 M) }
( E# s' Z* f, \
, w# Z2 K3 K; P9 l
如有侵权请联系删除; s' ?4 ?- N( H( \  J. F' u7 i

: }: ?& J% }, B/ t# j" I/ Y转载自: 茶话MCU, l8 [! [+ T* h

4 B! [/ w; w, b5 n8 H/ x5 u/ X) L" j% [# P
收藏 评论1 发布时间:2023-8-2 16:42

举报

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

学习一下

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版