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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
+ l# }; X5 z- M
/ W* C3 x' E! w; \* {2 _

3 V0 t( Q+ g8 U$ x( O$ g先对ADC1基于DMA标准请求模式做演示。. z# Y0 W6 {5 n4 Y- S( U2 T
: R; Z  N  ^, \# h
# z4 \8 H- s! y9 ^+ y% I; \9 [! b' Z
随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。( z1 b3 l* [, _+ K, _2 B

. k+ B0 |( |( ]) k+ `

5 D7 s9 R9 F6 S* L& t7 x 微信图片_20230802163811_5.png
) W+ e# t/ J6 g/ Q0 n) {2 P; O
3 Z) O* |) l7 k( Q; ?. X6 | 微信图片_20230802163811_4.png
3 o9 t7 e2 e1 k! k- S7 O; }
6 s1 R" e( t, w$ J7 r 微信图片_20230802163811_3.png 2 r# y/ K. p4 ^6 D9 q
/ a0 c7 N9 Q# z. J' s; X( A
# y2 h) M5 k' e0 G
相关代码:
3 [8 z4 W, C. |3 O8 _. @& s" B
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   
    # s% N* v& l6 Z0 r
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];1 W! h" C- l4 r+ Q8 o7 I: m+ A
  3. % k* ~2 M% `/ i# I! o
  4. ADC_HandleTypeDef hadc1;
    & d- }3 L& \5 r. k4 z9 K
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1* E! @- L9 F  w3 n! N  o4 b" `

  6. " G6 L' J2 F8 M! J
  7.   /* USER CODE BEGIN 2 */' ?; a; W' O4 n+ O! f+ h0 g
  8. - W" i9 }2 N2 Z+ h& p/ l
  9. / d! q8 G# h) r! K/ }( ]3 X% W% i
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    7 Z( ~! F& [: R
  11.    
    : h) T, |/ T4 y. ^1 z( I
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);( t; J4 P$ D' _

  13. ) E- W! T/ y5 k7 W2 a/ `5 z) \5 ~
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
    # l: v# v( t* {
  15.                          (ADC_BUFFRER_SIZE)" U4 A8 `7 @& F9 o; e9 y" P
  16.                        ) != HAL_OK)
    : l7 N4 y' Z( _) C) B5 d1 `
  17.   {
    * p0 r  `3 B- t, J0 ]
  18.     Error_Handler();0 p+ z3 e: ^0 Z5 O
  19.   }
    / j$ K+ g9 L" d1 T% j8 |: B; M. y

  20. ' I7 G& x* ?1 M5 K; U; S1 Q
  21.    /* USER CODE END 2 */
复制代码
  F. y' Z, _! j0 q
运行结果如下图所示:【目前4个通道我是悬空的】  O; U) ^6 M& H$ S& |3 _

2 H- a  K* r4 k! J0 c

3 U% X+ n2 p1 X0 o3 V* ~# H 微信图片_20230802163811_2.png * K& M, N$ A' M. H1 R( u5 @2 _% d6 ~
* V; Y( e* k1 j' `4 F1 u+ w
( c3 L# d2 B# E- ^* ], @: U; Q
现在对ADC4基于DMA链表模式做演示,其实就一个节点。% K5 a1 U! g- Z& ^. c4 C; _

2 e. F/ Z* T* F7 j# W/ ~* `" {+ `# \

' ]7 g8 P( {) p! }/ ~5 Y9 L选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!6 ^+ s( E" a6 I% I3 S# O) Z
3 Z' j0 l& [! u, j

/ t4 d' B! P5 M0 G6 } 微信图片_20230802163811_1.png
, O( w( l- t' A/ O
& j9 U2 O! e: z2 K! V! ?1 t5 P
* u, k; k3 r# R
关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。# J0 N$ e" u* s: m- q# g5 q5 E9 d; ?6 c" {

# h* e( A$ y- X0 L" r# D  K! C" {
( C  e6 ]- {" ]9 g
微信图片_20230802163811.png
% w7 W0 {% a9 l1 x& B% v* _( t
0 }% w2 K: p& r# I  F9 K. i; E4 s 微信图片_20230802163812_2.png 2 \: G, E3 `* Z

" w; j/ S# A1 M3 ]% b- o/ I 微信图片_20230802163812_1.png
. N3 ^1 h! Q4 {+ s8 u! L! s# [) v+ @& f8 u/ g0 S

) Y* s. q. T& l. {% m: r, Q相关用户代码:! ]+ }3 o0 s- o& |( h
  1. /* Private variables ---------------------------------------------------------*/, \* v, S" L8 Q0 e
  2. ADC_HandleTypeDef hadc4;
    , r4 h  w+ g! k
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;
    % C! w5 b# `  Y7 d) n
  4. DMA_QListTypeDef List_GPDMA1_Channel1;/ ?" P2 E2 }1 _& X
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;
    5 z1 X5 I- U# x$ _2 V) U7 N
  6. /* USER CODE BEGIN PV */
    " X) y* u# I- p2 O

  7. 6 G8 L1 `4 b6 Y, l7 E6 b
  8. /* USER CODE BEGIN 2 *// |, v7 d. [- X! K! v2 j, e
  9. 6 f: M8 a9 G' _6 S
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version7 s6 Q' t8 v) ?9 g6 q2 [

  11. 0 B7 `5 Z5 L! \/ J3 W
  12. MX_ADC4Queue_Config();
    9 s+ j8 o& ?/ d1 E

  13. 2 q0 D& a; ?$ S! [
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
    : o; @# D. B- {7 Q# P) z

  15. 0 D  `9 |( x8 W1 G+ I1 s
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);
    2 f# f/ e* d7 m& D0 s
  17.     1 E2 f6 ~5 l+ N+ I
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
    5 Y- r  |* [$ s
  19. {, Z7 i1 W, f) |2 W3 x6 _+ s/ t: D
  20. Error_Handler();
    3 x9 ^2 t* P" l, D- r
  21. }
    ! p: B$ \! S1 v  f* t2 `
  22. - S$ F( ?, \1 g1 f
  23. if (HAL_ADC_Start_DMA(&hadc4,: b1 {1 E5 ]# X3 G& b
  24. (uint32_t *)ADC4_Result,
    # }$ Y- C$ V5 [" E( o3 n8 ^
  25. (ADC_BUFFRER_SIZE)
    : ~  [5 v) |: V- A* J) H0 X; I
  26. ) != HAL_OK)
    8 S9 @5 }$ x, a: t8 @. D
  27. {
    7 U5 q9 K  \" H) }* t3 N
  28. Error_Handler();
    & Q7 ]5 @( l, R" X" r; x
  29. }  b" z0 N# I! l% {
  30. /* USER CODE BEGIN WHILE */
复制代码
* {8 {) N) m% u
结果验证【显示了2组数据】:, F: _" w0 M, O4 p" Y: |( [
- {& s! U' J" _7 ]: L2 a& ^2 }

" c3 D0 {# r. m. q5 Y% b 微信图片_20230802163812.png
  X- P* g% G* j1 @# h' o7 D% _+ T7 G: X/ y
9 k/ Q) ^8 i& v2 Q3 p
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。
  }* b. |; h& m. \2 `" S% p; s' c9 R- s9 s% A
3 d$ [4 o+ D$ }( N  w) {* p' E. N& I

" z7 X2 P& R" d- x# s如有侵权请联系删除
1 j4 o: e5 p3 |& ]
  c* b" y$ L3 Y" C转载自: 茶话MCU
: i$ E' g# b0 y& G! f
: t* [- E0 b+ ~% ~% a
+ u' G: k0 H: I' m
收藏 评论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 手机版