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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
, |, ~4 V' r* x" R, k5 L9 c, Q* N4 `  a% e* J  O
) {! }3 s& Z+ C0 f9 _# N
先对ADC1基于DMA标准请求模式做演示。' s9 q' `" [; a" L: I1 K6 U, N" {
( |! i# j! |7 B

0 ~3 {8 v2 e) n& g& ?随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
& o7 @# _, B6 Q8 P; j, x* ?
' ?" K8 y3 L8 o7 v2 O4 |* E
) A, {8 X: l, ]8 h4 }8 `9 {! q+ `1 _
微信图片_20230802163811_5.png 8 |& E; V9 d$ W, p. R
, y+ Y8 r( y; ~. `8 ^
微信图片_20230802163811_4.png
+ K. a; z3 b1 Y' T
4 C3 l9 @( A9 D. i7 } 微信图片_20230802163811_3.png
) |  H3 [) R8 z8 w( E
% k" {! P9 |' X# V1 w

( d. ?8 x6 n! S$ T: y7 r相关代码:
( B0 e2 X& O4 Y  v( k' t3 L
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   8 {: k; I' F/ {: ]7 `
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];* v" b% ^# K* j, w- v8 f4 @
  3. 2 Y# w6 e! M6 K$ C6 n1 Q
  4. ADC_HandleTypeDef hadc1;5 z2 Q6 C* y( l9 {' G) m
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
    $ _& c+ [& F" j! ]- {0 p
  6.   {' H: q5 f9 V* Z% P: t5 t' f
  7.   /* USER CODE BEGIN 2 */
    % b- @- R9 K1 n+ A5 n4 j0 {

  8. 5 N0 t+ ]5 s) n/ j" @$ w

  9. - a5 I2 V# d3 ^9 L0 z  `& B
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version1 Q+ F8 K3 b2 Y
  11.     ' B2 n- }! B+ Z" }7 E( `
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
    " V- C) C- a( t9 B9 r( o5 e3 i

  13. 3 |7 K8 M# s( @
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,3 N# p2 Y, m# f  A2 o7 V1 G
  15.                          (ADC_BUFFRER_SIZE)
    $ [+ J4 ^, p, y
  16.                        ) != HAL_OK)
    3 z* X: G7 b2 o
  17.   {
    * ]9 S1 }/ d4 t% }( g  L, K* d0 f
  18.     Error_Handler();
    * ~+ b6 h5 T7 p, O( z; a0 v3 `5 j
  19.   } ' r& j& d& Y. T: Z4 U

  20. * o6 {. p2 [4 E; ?8 m
  21.    /* USER CODE END 2 */
复制代码
: Y: M9 ?+ I' m+ i
运行结果如下图所示:【目前4个通道我是悬空的】3 _# G7 b6 ]1 Q( {3 g0 R. q
, t* l. a4 |& J7 F; w8 J1 A# [7 Z

3 K: H( x6 N4 P* }: `% Z 微信图片_20230802163811_2.png
/ K2 ~8 q. {, b) B- g' }9 ?0 U5 M& t3 _/ u* t

: y; j! q, K" T现在对ADC4基于DMA链表模式做演示,其实就一个节点。
0 U- z1 }9 N- }5 f
& e9 Y. L4 J9 T

7 z8 [0 f) V4 k$ Q) r7 ~7 Y选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!
, B- t1 S) k& J: B" ]2 d
: K( ]6 ^; v: \% B

7 I9 R6 E# q8 `+ f 微信图片_20230802163811_1.png ) @: r+ h$ ?2 `4 ^* e4 K

3 F9 j& R9 V* Y- b, g) V

$ j+ F7 t( i2 F0 _' o关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。/ |. \# _; d: d* Y2 l( X6 r2 O
, r0 J# F. Q: |# e' z: _
7 H1 M" {, A( x8 f/ t# W+ P6 J
微信图片_20230802163811.png
5 r0 g1 p2 @; Z4 i2 x8 M
* H9 C7 M2 B  b9 X( ]  f8 a 微信图片_20230802163812_2.png
9 G$ q7 s9 j- V3 r2 f. R8 B
3 m$ D* C  ^, Q7 H6 i% @ 微信图片_20230802163812_1.png
3 m, d2 C4 J& f) O
8 y0 P  A' `7 P9 s- v. U5 \

6 P+ m; i0 m. o) q& B相关用户代码:$ }) O- v" E! b& h6 g- p8 y
  1. /* Private variables ---------------------------------------------------------*/
    3 f, B3 J3 Q8 M1 Y/ t+ s2 Y
  2. ADC_HandleTypeDef hadc4;
    * R- n' M! A9 t
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;
    # r1 r  V+ Q4 l( _
  4. DMA_QListTypeDef List_GPDMA1_Channel1;9 N% s- U5 E/ k4 g+ \1 d/ U, b! s
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;3 E7 e7 \% I; g  B3 o5 G) K
  6. /* USER CODE BEGIN PV */
    ; v+ e7 Z$ x, B/ y4 X# s( j

  7. ( U- e5 P) s2 S
  8. /* USER CODE BEGIN 2 */0 U7 i" H2 m' F& m: q6 D4 i
  9. ! D9 V5 l0 G( B- d  k* `/ G3 Z
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    , y8 n# Z: x' }
  11. ) e9 g8 U  o/ @
  12. MX_ADC4Queue_Config();% K5 e4 s3 X' j% k$ r+ Y
  13. $ u6 o4 z0 ~/ e- Y! G# w! K
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
    5 @6 q3 C% g6 Y' q) V  h  [4 j

  15. , r/ N: y9 c6 d- x, W
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);4 a- z0 q1 L7 U) u
  17.     - h# B- J; N4 {: H$ e( D
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)2 C, r9 e, w; `
  19. {
    4 E' P+ Q4 ~' l9 E1 T+ r7 f; t+ m
  20. Error_Handler();2 X* E  f) W) j1 F. Q4 i$ m% A
  21. }, d% L/ F8 `: F, y! `' s1 R' o

  22. 2 [+ f% v* Y$ m1 E7 Z, q: {
  23. if (HAL_ADC_Start_DMA(&hadc4,3 h& j$ s7 w5 u2 i. z) M) [
  24. (uint32_t *)ADC4_Result,
    3 }) \$ R9 Y* F  T
  25. (ADC_BUFFRER_SIZE)
    " r8 j+ ?0 _& s8 G# ?+ \' a  v9 ^
  26. ) != HAL_OK)5 l, ^9 O  ^: v+ C7 R0 [
  27. {8 |/ ]' F0 {% h+ m& X9 U
  28. Error_Handler();
    $ J" e- G! W; |& e5 T9 e/ \6 x
  29. }
    " t  K, g7 U! \
  30. /* USER CODE BEGIN WHILE */
复制代码
  v1 d8 p9 V/ h+ _
结果验证【显示了2组数据】:" \! d, V9 ?- H5 g5 w; W1 Q

4 R+ f& M0 l# B- W$ n6 s

1 W0 Z& k) I# Q% S- n 微信图片_20230802163812.png , k7 ]% S  Q$ {' I% J) P$ |; n, o
6 a, ?& U3 N$ k
5 C6 Q2 R- P( x
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。
- c. d9 j" q8 N+ {# k2 j
! k7 j4 v6 s& w5 v4 R2 N

# a+ I6 O! a9 A5 o/ v$ a1 @4 G" f) G4 M+ F
如有侵权请联系删除: H0 L( ^2 O$ i* a" k

3 [; B  N# J* k8 y转载自: 茶话MCU
* \) Q! \: b# q3 V+ p+ A1 G, I& q6 ~  L1 U; a1 F, O! `  r; H

6 i/ ?- V% Q6 n' u4 q9 x" Z; R
收藏 评论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 手机版