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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
: j4 q  F9 f' j1 G6 [" q% w6 b9 L1 K' D  v( `

! b8 i* x- v: Q! Q. w( v) @# c! y先对ADC1基于DMA标准请求模式做演示。8 N* F) c: i: w6 `

7 d) y- B7 n: r5 F& m$ d+ a! T

2 {) o; D9 M8 H/ L/ e随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。
. ?3 T& u- |1 ]2 u7 k+ Q
/ N2 G8 T+ v& `, m: Q4 g

- F% H- L9 E' c; ?0 R5 Y 微信图片_20230802163811_5.png - Y" Y& Q9 m, T0 c
/ j5 V6 b( ~0 B  S5 f  R2 j4 m
微信图片_20230802163811_4.png
  K8 j. k& U' s9 g% E4 t" w& g9 i; r1 i2 V( l$ o  p
微信图片_20230802163811_3.png 0 a, H5 ?# E$ f! V) e3 z

  R" O1 y% R; X4 [; E' V/ \
, Q3 g0 e" i5 d8 e* [2 F
相关代码:
2 ~; ]# P; S3 t9 W, I; m  Y
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   : Q1 a2 ]7 h: H. o. o
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];
    3 Z6 }5 X' G9 T+ w

  3. 4 P. X- p1 O5 _: A, M
  4. ADC_HandleTypeDef hadc1;8 e, |& ~4 w: Z) {2 @
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
    7 w0 t/ N- L. N+ f' q  u* R

  6. ; L$ [* v  j. J0 g/ @0 b8 f
  7.   /* USER CODE BEGIN 2 */1 C8 @( a+ F* o" U2 ^# W
  8. - t, D) y6 \5 S% d: Q( [8 j& ^

  9. - T  U, m: A; u7 r6 x; |
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version. V6 ^6 y% C& d; M$ A" T" W; v
  11.    
    8 L3 ~  ~, N7 r7 ?, _6 c8 p) T
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
    % Q2 Q  e7 I5 U- [4 H" z

  13. - O3 D, a& G5 O
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,* b: o  [! r$ @! W, \- [
  15.                          (ADC_BUFFRER_SIZE)( r( Z+ l+ Z8 }
  16.                        ) != HAL_OK)
    * s5 k% `( \, s3 D- e0 k/ q
  17.   {
    + ~& h: [" ~: Y7 f/ _0 \: J
  18.     Error_Handler();& M7 @  R6 |4 H
  19.   } , q+ D) q+ L$ v* U9 R: w" Y: E

  20. 4 V2 A8 E+ b+ p2 B$ }$ q+ A* r
  21.    /* USER CODE END 2 */
复制代码

# o( ~: F5 \4 d! M+ u- [运行结果如下图所示:【目前4个通道我是悬空的】
$ B- W5 ^' g9 L
8 ]7 a$ q; p; N3 |2 `
6 h2 u& z6 h+ o& f+ L0 F% s5 O
微信图片_20230802163811_2.png + p% P$ B6 z6 u( r+ l+ z) O; k
  T* ?' e6 [6 S$ r! M
3 Z2 {! k( N; G( N+ {5 ]8 b$ f1 U: G
现在对ADC4基于DMA链表模式做演示,其实就一个节点。# S5 A" O! I8 R/ [

, ]: c) M; Q+ u* r3 k- l/ k2 J. f
! i/ C7 F& n1 v5 R" Z
选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!
7 ~! z( O' \  l7 a/ G
3 G  u5 _" {# l
6 I, O# e. ?) h
微信图片_20230802163811_1.png 0 [; d3 w2 D6 ^7 I# b' a" P. o
, @4 J6 x3 H9 w. r1 l

, v9 g, c' F& K  }0 w( d关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。4 y# F# A7 d; W. O7 s$ [

, B+ U, G! @+ D+ a6 ]+ O& U
. E2 n& G4 n, b. p5 x9 |0 n  E
微信图片_20230802163811.png
8 J# \% x! }/ Q' \) A. N, O$ P! P- A
* ]0 O/ P; a) G1 o4 j- f/ `  L+ l; o 微信图片_20230802163812_2.png
; S; z/ r8 [! c: g) q0 H- O8 ~/ n8 i3 Q$ f" d; {
微信图片_20230802163812_1.png : u6 u8 _" ^. D( M2 e! I
7 f2 k1 b9 c  q6 I( T
. N$ u4 y5 L0 N7 l; w0 n
相关用户代码:
1 z% k$ a) Z& O, \0 q3 {
  1. /* Private variables ---------------------------------------------------------*/
    9 j1 O# [: v) j* \) M6 [3 I9 x$ S6 q
  2. ADC_HandleTypeDef hadc4;
    * k1 S) r! P- P& G) b# J2 H" Q
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;
    $ _- A3 p+ a/ f, U+ m  P' S* I1 O
  4. DMA_QListTypeDef List_GPDMA1_Channel1;& D3 |$ e; F  M3 M
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;" B, R1 P9 `# i1 h# n3 a
  6. /* USER CODE BEGIN PV */4 M2 C. ~3 I1 i4 p+ ~) `

  7. + X1 l% F; B; g1 F9 p/ N6 Q
  8. /* USER CODE BEGIN 2 */
    ) p) \% @/ a; }0 f( j
  9. 9 j$ G2 I7 H8 d1 d
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version0 |- z2 U9 c8 }$ {

  11. 3 _+ d5 ?/ p  c, ~, w$ Z4 ~
  12. MX_ADC4Queue_Config();
    & a) ]9 ~- y/ J5 O: v2 Q) f

  13. 4 Y' d* I: m  v5 C0 q+ X
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);4 q$ ?1 [9 J% ^# [

  15. ) ]9 }  S# I/ ~
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
    2 N6 r2 }; t3 H& }9 |: R1 g' _
  17.    
    : z3 a, x$ R# U% h1 }
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)6 Y" s) A# I8 M
  19. {
    1 U; a' {) A" T5 }  ^  |8 s1 L
  20. Error_Handler();
    0 \" r. i' S, ]7 @8 ]! ?/ o
  21. }2 m: W/ k' i2 q* F# u* e7 F  p
  22. % d9 B# I; X: F  ~
  23. if (HAL_ADC_Start_DMA(&hadc4,
    0 C# N& k. g( B6 f* |# a% k% D$ \
  24. (uint32_t *)ADC4_Result,) p' u: q3 _1 E9 A+ k
  25. (ADC_BUFFRER_SIZE)% V' P, U, v) m: T* j5 A
  26. ) != HAL_OK)+ W) k3 C# U0 ^% U
  27. {8 F9 \8 i7 e' ]: C6 E1 U, J, W
  28. Error_Handler();
    0 b6 l( V! h2 c- X8 T5 A2 j8 N% J
  29. }
    7 P$ V$ z. v6 N. D
  30. /* USER CODE BEGIN WHILE */
复制代码
9 A) j- T( @: S
结果验证【显示了2组数据】:
8 V. Y2 F* K( k* e! m* ?( V; o' j: D4 a$ X9 @
3 j2 J7 A" h. |; l. Z" F  G
微信图片_20230802163812.png & W2 ~7 r( L) s$ X( t
' H  \* ~& f  T/ S
3 k- w9 H$ K) o$ Y! J' i3 z
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。. a- F# r  X& H0 r6 X8 M: ]" M

7 k1 @% i- n( p2 H' q& L3 T3 z

! w3 r/ v7 J" _5 {# a" ]# q+ ~0 A+ B0 @1 i* i7 \- [
如有侵权请联系删除5 O7 r$ S2 R3 @/ ?

) e5 c) D9 J0 C转载自: 茶话MCU. c* l8 a+ n/ T2 s/ L5 w$ T
2 v$ ]: r7 Z1 C3 n0 P. d/ M4 l1 @

# R# \0 L, s7 @
赞 收藏 评论1 发布时间:2023-8-2 16:42

举报

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

学习一下

所属标签

相似技术帖

官网相关资源

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