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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
. J( G% Y! o  r% e
8 U* |4 W# t- I- m
6 X1 E- W& ?5 B: ]
先对ADC1基于DMA标准请求模式做演示。; s" C$ p; e3 Z

  c* E0 L2 h0 \, s% r

0 N' a( z& j0 U/ G1 {/ ^& }& x随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
8 A2 g/ |9 M9 n4 V4 `( w, r* J! |+ a+ R1 q, L0 z0 ^1 H3 U- N& O
+ r6 |1 v' v, E0 J: d$ }- t6 F
微信图片_20230802163811_5.png
3 ^1 w! g8 f/ f1 F
$ k$ `5 F  f# Q 微信图片_20230802163811_4.png 2 O1 ^- m8 e" L9 X. G% }

. p3 `7 u6 Q0 d2 u6 D, |+ }4 D6 d 微信图片_20230802163811_3.png , C0 @1 {0 t" y; Z6 W2 [) m. M$ r
% i! C+ K, I$ R1 y  u
0 q$ w: j; H- v
相关代码:
: L4 ~4 s2 p* _
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   2 [  n' Q1 F$ ^; _- ^
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];) u- J- b) M4 e( @0 s- u, p9 G: S
  3. ' n7 B' y% C  z/ z1 |# }
  4. ADC_HandleTypeDef hadc1;2 ^2 u5 |5 R/ n- v8 \+ J
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
    6 _. Y; L  F; E- w9 l

  6. * o+ D* I# u  T0 x: }
  7.   /* USER CODE BEGIN 2 */. H; O" E1 H7 u& l2 q$ c

  8. 9 Q+ Z& Y: f' a$ [* P! @
  9.   F4 ^9 J$ {4 [6 J. m4 g( K6 A- b
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    . J7 I9 o' @- X0 d: Z; j) R
  11.    
    4 o2 [- {1 ?7 h7 `
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
    3 d+ t, g% r% B: C4 O! E

  13. * f) q* K: P& v2 F9 l# ]
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,) _( Y# e. z1 d  B5 {- e
  15.                          (ADC_BUFFRER_SIZE)5 O) d4 d# |! \7 m: D9 F) r
  16.                        ) != HAL_OK)
    + U: [- k2 |" G& ?
  17.   {; t0 C; o: a7 Z( s
  18.     Error_Handler();# I: D0 I- \: q5 r) [
  19.   }
    ; ^* e* `4 Q& O8 o+ y' s4 }/ F
  20. 4 V* [8 y1 q( H# J. O% j* K' h6 m
  21.    /* USER CODE END 2 */
复制代码
" I# y$ D% e; F: Q5 |# J
运行结果如下图所示:【目前4个通道我是悬空的】
+ \6 J/ |5 L- P3 ?0 b, a. u5 p8 e" X6 y1 V# u. I
6 O9 r: l0 n- W( y3 ^- @
微信图片_20230802163811_2.png 7 Q  q7 Z9 e9 Z4 c1 X

. g2 t% s2 `+ |5 F; z7 b

; V9 z# z; P) t* X# Q现在对ADC4基于DMA链表模式做演示,其实就一个节点。
6 \+ n( a* W& F7 Z0 I, p' n' b, ?- T* X

6 o* l' V9 i# ]- w$ M选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!/ s/ k% b1 X* [

7 g" V5 [7 e. e" a
6 A1 j7 ?$ b+ t9 J8 B' k
微信图片_20230802163811_1.png
, k2 e7 J: t. N, S% [, J, _- p
+ R8 {" g9 }/ ~" B  M7 k7 z

0 u3 {2 A0 e4 X, g关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
- N# P- k) X+ l! Y4 Z" G: J( J! \* j( k; k- T! M' a
  O3 I6 [1 }/ [8 c! w- s3 ~0 |3 Y* ~
微信图片_20230802163811.png / Y( o8 Q, y4 ?" h4 R/ M) l

+ h6 ~$ F' L! ^, \1 n" G 微信图片_20230802163812_2.png
- a. r, w- W4 S8 U  K) C2 R; W$ f9 z: s0 R
微信图片_20230802163812_1.png 7 c8 j( N: I- f" }

) ^8 c9 N! Y- b& ]+ g

& \) v, A5 b7 h( \8 J) m相关用户代码:
9 q0 f! _2 B8 k% I
  1. /* Private variables ---------------------------------------------------------*/0 {9 o  \4 h' w* p+ ?# g. D
  2. ADC_HandleTypeDef hadc4;
    + t8 W3 R& E/ I. B4 L5 Q
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;
    6 A0 y8 }, U9 c* X
  4. DMA_QListTypeDef List_GPDMA1_Channel1;  L* z  l) k$ J5 P
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;
    : a+ q5 `7 q- v9 U" d2 {
  6. /* USER CODE BEGIN PV */5 \5 T( ^6 {2 [& {6 B" T5 I
  7. , H/ v5 _6 z* S- ]* B
  8. /* USER CODE BEGIN 2 */6 A. Z5 D) b/ A( c* H! P$ n
  9. 9 g! ?& z) }% Y) R
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    , L8 b- I1 F/ r0 Z& z- I9 Y+ e

  11. 5 [* F( L+ a/ q( f4 d0 d0 G
  12. MX_ADC4Queue_Config();2 d3 `6 F( @4 m9 ?/ M, f, H( K
  13. ! i+ O1 {9 D8 e5 N/ V
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
    1 e4 _6 z3 B! A; ~$ z) c) j
  15. 8 a7 M: j! A) n
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
    ' ~& Q3 m4 P+ L
  17.     4 }9 b/ J4 B' A1 _
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)( G' u; n" P9 Y" r
  19. {& Q' R1 g( N! O8 U. p" E5 M
  20. Error_Handler();
    8 u; C1 r6 H3 I2 M' |9 @
  21. }8 z5 K, i' @3 M- ^# U

  22. & t) b2 Y! M2 k+ t& f  V, G3 J
  23. if (HAL_ADC_Start_DMA(&hadc4,
    8 n9 x  _9 g: e. j; p( Z" u
  24. (uint32_t *)ADC4_Result,/ Q4 ?  ?% l, ~5 ]
  25. (ADC_BUFFRER_SIZE)
    / ~( Y- k/ Y& R* |
  26. ) != HAL_OK)# p( l- F( N2 @3 r  e% y7 n% N
  27. {
    - ^$ X: L( a3 p' ^
  28. Error_Handler();' U7 v# v0 R! k- m
  29. }
    " E0 g; g3 J( ~$ c# z
  30. /* USER CODE BEGIN WHILE */
复制代码

8 f! R6 {) p( C) u. u结果验证【显示了2组数据】:3 b% f1 P# g2 r. p4 T/ n3 y

% n; J* }# I5 O6 \& p) z+ x

( e+ A$ t8 U  K0 @4 R1 f 微信图片_20230802163812.png / R( f9 ^$ N/ ^( Q) S; {* t

. \( n! {/ l# @+ S
! x3 b$ P; i# s
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。: ~" K* s; Y. Z  u+ v

& d4 M: ^! p& p5 d& d

9 J( B& g1 J1 k' ~8 t& u! m& i* r% p; d: G; F7 `2 N
如有侵权请联系删除7 l6 ]0 g9 K0 x1 j! R
8 i4 h* E% \6 b
转载自: 茶话MCU
/ @: o& ~& U8 d. j. F0 d, v( I9 X/ r- \

$ }6 ^% u) U5 i: E1 a3 f  R
赞 收藏 评论1 发布时间:2023-8-2 16:42

举报

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

学习一下

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版