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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
" Z- G  ?5 {$ M
" u' K# ?! X5 }

! X3 Z4 K8 a3 {& B  J( ~先对ADC1基于DMA标准请求模式做演示。
% a* K: P$ T1 q* ^4 S$ V2 ?8 ^7 I3 a# |) U" V

; Q- q. x+ c* y; n+ K6 ]% R$ V4 p- O随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。4 n: C6 f( [1 M1 `7 c& L. c1 I9 Z

2 Y( G! F+ _$ n
% p3 I; O0 {" U( Z9 W
微信图片_20230802163811_5.png
5 E  @2 g! Q' e# w+ W: Y+ a2 s: U
, |1 N3 Q$ Y% R 微信图片_20230802163811_4.png
# G7 X: e! e8 O  _, W$ _8 V5 o" S6 W7 n
微信图片_20230802163811_3.png
% Z' E; [# C* \' y. f+ v1 [: J7 r; u" G

2 W& _7 _2 C! S% K6 k. H相关代码:4 v. {" [* q7 H' X" I5 k$ j
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   0 o" j  F) U( k9 M. l& @6 j  K4 O. }
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];
    . Y- \- N8 [) v0 `6 i
  3. / Z+ o3 V+ W& X" q8 A
  4. ADC_HandleTypeDef hadc1;
    / z7 p! u* E+ a8 M: h9 y5 X, `
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
    / r& K  }9 z. `

  6. ) v- E$ H6 r# W. j( Y1 G: X
  7.   /* USER CODE BEGIN 2 */( q2 }2 \( x3 _3 b) ?
  8. 8 q+ }( W( r/ E  F! w+ S! \1 ^
  9. : X# O$ l% i3 \( I
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    , \/ t( C% g5 H8 }
  11.     3 g% ^$ H# K. V+ d# V
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
    # t. _$ e9 k; ^
  13. 3 u$ A8 c% q6 |6 M. s" R! Q
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
    * J2 p$ l! a" n! H9 j
  15.                          (ADC_BUFFRER_SIZE)
    4 H- v& Y& P9 z$ o6 e5 G( ?9 d
  16.                        ) != HAL_OK)/ k: c/ n6 N2 j6 u! C
  17.   {
    9 Z: U' ]& y: A' z
  18.     Error_Handler();9 n( T7 t/ Y: ?$ j5 b, h3 e
  19.   }
    0 H8 E3 ^0 g, E5 l' U
  20. # u0 z, {8 `9 S) t
  21.    /* USER CODE END 2 */
复制代码
6 }2 M. L7 \/ x$ t: i6 G) H; T
运行结果如下图所示:【目前4个通道我是悬空的】
0 E- S; P. o2 ?3 @( @+ t& O% u- W& ?
1 u" E. Q5 c3 C% \3 Y$ J9 W6 {& F, q' ?
# w7 b+ R) q1 ]% e6 R
微信图片_20230802163811_2.png
/ a5 x. c4 h0 k8 \2 T1 `1 i8 ~$ D

: j: B9 C/ z; x6 ?* y6 X% w. S现在对ADC4基于DMA链表模式做演示,其实就一个节点。9 S. f  X9 t/ L
0 Q7 Z; @' J7 U7 A0 ]6 i

- [  z2 g# U  Q& {8 z- Y* j; K% K选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!
, r- W3 [5 U+ [4 }" R( c9 i0 ?. y  R' M8 x  j) N* d
1 c1 C7 P, B. |# K
微信图片_20230802163811_1.png * B3 t; M# z& ^. R: Z

2 ?9 p; {0 y, y$ D
& M5 h* g3 A3 [
关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。! E7 w; f9 |8 k4 x
# n4 d; t: |( W2 _* u% |% X$ a: R
3 K" `9 f7 X$ J: A3 R, x7 J/ b
微信图片_20230802163811.png
4 p0 @% V9 W  N8 Y! B$ n2 d8 g) p7 p2 b' w- g6 v; g
微信图片_20230802163812_2.png
8 l4 K/ `! d4 X; j7 k, j& q' ?1 f! [+ O2 z
微信图片_20230802163812_1.png 8 o; K) n  b3 p$ a1 O/ ~

/ S; {- H, ~- R) \/ G  y6 J
. ?  v* q% x2 s# C" E  G" i6 N
相关用户代码:7 f% v7 J1 p8 w+ b6 {- q
  1. /* Private variables ---------------------------------------------------------*/. w9 @2 L! B9 h" m" d
  2. ADC_HandleTypeDef hadc4;5 q+ M, |! ?/ L( m- e9 U" Y. Q+ ?" @
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;
    3 m6 J# b+ U# v4 L
  4. DMA_QListTypeDef List_GPDMA1_Channel1;
    7 w4 ^% r# [; q& [# Y
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;0 Y0 w) e% q7 ]3 }9 s. l' p
  6. /* USER CODE BEGIN PV */
    - {. ~, Q) S8 j- j' U
  7. / Q. n5 ^* v& b5 [6 X
  8. /* USER CODE BEGIN 2 */
    1 h- w9 u) z! N2 F9 t- a7 z

  9. ! b6 c" E3 h8 }) _
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version" K) g6 x' }9 K& x0 g. o( C' t% [

  11. + q  A4 [1 v/ K6 D6 O) E( e% c
  12. MX_ADC4Queue_Config();) x: o" L% A6 G3 l0 V+ x

  13. # N/ ~( S1 b1 H
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);# A& h4 e# g" k$ E, G* I: E

  15. ; z6 c$ |4 E# H% u* X
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
    0 ]0 w9 l$ x0 K
  17.    
    " G, d4 E& f6 Y) ?; m. S& x& J! h
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
    + P' \2 B- s+ P. x3 D: R: R9 x- m+ |
  19. {
    & P/ @$ w9 j1 s  j
  20. Error_Handler();. `) u- f# A, D
  21. }( Q$ J5 W: Q9 W, @) U+ T
  22. 5 F# V8 X" s9 e
  23. if (HAL_ADC_Start_DMA(&hadc4,
    - l% g: r, f7 C7 C" u
  24. (uint32_t *)ADC4_Result,. F+ f! n5 |5 u+ H1 o3 U6 `
  25. (ADC_BUFFRER_SIZE)
    , t7 s1 I3 P7 K0 m
  26. ) != HAL_OK)
    8 X- S) G& ^: z! U# n0 U
  27. {
    3 q. A8 m: o5 M
  28. Error_Handler();& s/ \+ a# O. r2 t$ f, ]" S* M8 v
  29. }
    ! |. f4 Y3 |5 D- `6 |7 }/ b" M
  30. /* USER CODE BEGIN WHILE */
复制代码

* G* v# |& ^6 ]# r5 Y' B5 `1 |结果验证【显示了2组数据】:; a, x, p# c0 L6 F: \; a4 u* ~; f; v
, x) a& j/ R1 G) f3 ]

. f4 O* d# Y" q 微信图片_20230802163812.png
! \# @) l+ r1 k# K8 a2 O- s, z. \  Z$ q" W3 W; K4 W+ |  L

( Z  Y7 R# t. S8 k, M* [( `4 b6 `最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。3 E  a7 \  r3 b9 F3 N- i1 _
$ X5 K' J$ E. `3 I( L9 n6 D

$ U. T$ s& d0 S) c! |0 B5 J5 ?, }, }" `! g* n
如有侵权请联系删除
! N8 K) f8 a+ c8 J# N1 E( x2 `$ s' R; \6 M4 t7 S
转载自: 茶话MCU
6 R0 Z5 A+ [9 l
' T! f$ P) k7 e; e
* m  m* N1 ^! M) F, v6 H
收藏 评论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 手机版