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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
; t) s5 ~: f/ Z& o: r- t) W  s+ K0 u
7 H5 L" }1 m3 }% W# a

9 m7 c4 Y8 c4 q7 I  V3 K先对ADC1基于DMA标准请求模式做演示。
" R. n! u& G, }; O3 ~1 H/ n3 n6 F' W( m* |4 w! k9 c  G' `/ g
. z* r$ b0 X; W- J2 y: l
随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
7 f' c/ h+ r) _+ w0 F7 K9 k9 o4 c* K& k

1 Z- H' A2 \- n  p- z 微信图片_20230802163811_5.png 9 d  [# J* Z5 S0 v* G0 }

* L2 t; o, Z# x" o/ z5 k 微信图片_20230802163811_4.png
: ?! g: w2 _% ~9 W) c
& w" E  {! U4 A# @ 微信图片_20230802163811_3.png
3 _) K, B  j  ?; Q8 I" k  Y: {$ _: a) V& n$ D9 a1 ^
. k) j9 M: A  e! F
相关代码:, Y0 W! u, ~$ z! R: h7 a+ W) n/ I
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   2 j! u& V6 o2 Q# V- h# ], e( u
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];' K0 |  `" M3 i. ?. N! L: @
  3. + `5 N: Q+ Y' w: x" s) ]# ]
  4. ADC_HandleTypeDef hadc1;2 X$ d- S$ }  `1 A8 u, {; O9 \
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1) t, Y5 w/ \6 }+ q" D  e

  6. ) Y( N2 x2 j* r  ^
  7.   /* USER CODE BEGIN 2 */0 R  k( x" N+ z7 M
  8. ! R4 k; c& u0 w: r: d' Y+ q# c
  9. 5 _8 |: ^7 B+ P- h" o# R! y# n
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    0 T4 e) e5 Q9 G/ h5 P( i! d" D1 W
  11.    
    6 s9 b. N* ^% C# E
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);/ h5 p+ L6 ~& O
  13. ! ?: A1 Y$ s  w
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
    + g, c* o- n/ L5 r5 F8 }6 q
  15.                          (ADC_BUFFRER_SIZE)
    : j) x6 C4 I+ W7 {. c% A6 ^
  16.                        ) != HAL_OK)( q5 E- U! P/ |4 p0 R4 D
  17.   {6 o9 b; A5 x* o: z1 y
  18.     Error_Handler();. J& o4 J/ E+ b3 l0 R. \! O* v( M
  19.   } 0 |1 W" ^2 c4 `0 {, Q

  20. , J. g/ d. |& c$ l# p! x% O
  21.    /* USER CODE END 2 */
复制代码

; Q1 E! b* G1 W% i2 h4 q" c运行结果如下图所示:【目前4个通道我是悬空的】$ K7 Y+ O; L- K' C
2 j' R: o) K; T0 y8 ~6 l* |- d
3 p. T1 O0 i: j! I; C) P4 q
微信图片_20230802163811_2.png
1 h: m8 W) ?* B- H. X, ^% @& F% c% o, F, I# b& R8 j
' c; G  a9 w# Q) |9 e+ o
现在对ADC4基于DMA链表模式做演示,其实就一个节点。
% Q9 f. d$ p, \7 C. K$ P9 c) H, v' `+ m+ ]' m
4 ?/ j/ V5 t9 v2 _( Y* B, ^+ K
选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!
4 y+ B1 r) j, @5 w; H# T/ E5 `1 h, Q4 B2 e# R0 w! B
9 P* o! T) R% [$ G& N! x4 j. M( F
微信图片_20230802163811_1.png # d3 A9 l: D7 ^& q0 @4 y; Y; \3 |

& ~4 J+ ~  @; X* i* g0 m  E4 h

; s" p  U" S* a& J) E关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。4 n; {: R7 {1 u  S  G
; j& G+ C4 A( R0 i% e

; }# c1 |0 c/ Z! F3 K$ W9 y 微信图片_20230802163811.png
/ O3 D* L* Y0 O' J& f! j/ m
  w) @0 x, ~- F 微信图片_20230802163812_2.png ' o  S" G% m6 o( ^

( M# M& u3 v$ U+ T( r# {  G 微信图片_20230802163812_1.png
4 o* _4 z; w5 e8 N6 i% s7 z4 `! a4 N( z( ^: ~5 `

7 W$ J9 o+ p7 M. h0 u8 V+ W相关用户代码:
4 I: [, g- V# h: Z* o! H
  1. /* Private variables ---------------------------------------------------------*/; z  t1 B$ i5 z) P7 \
  2. ADC_HandleTypeDef hadc4;
    6 d) j8 w. v; J$ d
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;
    4 S- y+ \  E* `" O/ F, u
  4. DMA_QListTypeDef List_GPDMA1_Channel1;( V5 x* _- R2 E& x8 o* _  K
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;
    + [; _: I" z* U* l2 o  M
  6. /* USER CODE BEGIN PV */
    # }' b* R0 r' s) c( S
  7. ! p/ S' y' M: Y  `
  8. /* USER CODE BEGIN 2 */$ _! j) O  j+ A" K6 C! G4 s  s

  9. ! d9 L& g! j  I/ m5 v) O
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    & i" z2 e7 J9 Y' `2 Z: w
  11. , Y1 @* D, W& O6 X" i
  12. MX_ADC4Queue_Config();
    / x0 I" e5 ]2 [9 @) R

  13. " }/ o7 \6 ]1 t+ i: p5 l
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
    % X( \8 m8 @$ B, U# n# Z
  15. % p' h' {$ Y7 ?- E1 Z! F
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);* I' D: c3 d+ c" o1 t
  17.     2 m. y+ m6 y: q$ `" I( g0 V" A: e8 A
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)/ j- M4 ]0 X1 f6 ^
  19. {
    8 x: u% a4 d; q6 N& x& A
  20. Error_Handler();. a7 I5 n$ O/ k! T; A; F
  21. }. E9 N* _" f& V

  22. ' O5 ]5 z. o, W4 R4 M$ `
  23. if (HAL_ADC_Start_DMA(&hadc4,
    8 _6 Y1 M8 ^' y6 s! @
  24. (uint32_t *)ADC4_Result,
    ( a; [. t8 j9 G6 l; |9 I! F4 O; B
  25. (ADC_BUFFRER_SIZE); }7 L; ^4 l2 Q8 D/ L+ ]0 Z
  26. ) != HAL_OK)6 K) L- A2 K# a1 l+ }( u8 K
  27. {4 b4 B: _( z9 X' U& f
  28. Error_Handler();
    / Z# q6 T: U8 e9 t
  29. }
    + ]7 {6 P* u' m. b9 ~
  30. /* USER CODE BEGIN WHILE */
复制代码
2 i" ?# F0 M% l( O6 J0 {
结果验证【显示了2组数据】:
6 ^8 ?( s/ q$ Z* w% r6 M, I+ k# P) j8 P# c" i) w% p1 H! X
* i+ c* y, ~# e6 X+ B0 }( t
微信图片_20230802163812.png 2 i' B0 f; P# N. i: Q

3 Z9 Z2 A: R8 o% K$ A& Q% |: y$ m

: ^  [8 L2 Y; m最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。% `' m3 O' i) S" D2 v
% k# R5 L5 F7 p% m. |  H
5 _) U) G! |" s+ l

* G8 ~2 A; Q$ O0 m  I如有侵权请联系删除
/ ]  {. ^* i7 {; Z9 p5 D* u3 ^/ U; {) ]3 Z; ?
转载自: 茶话MCU* {$ ?8 O0 f; V& r

7 P! t9 P* o$ V% W$ c
6 j6 j( n$ J4 P+ j0 ?5 T
收藏 评论1 发布时间:2023-8-2 16:42

举报

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

学习一下

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版