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

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

[复制链接]
攻城狮Melo 发布时间:2023-8-2 16:42
有人使用STM32U5系列MCU开发产品,在用到ADC结合DMA传输时遇到点障碍,这里针对片内ADC1和ADC4基于DMA标准请求模式和链表模式演示下实现过程,以供参考。
" `& h9 U$ R& \! A
3 `- ^4 S' @- g/ I
$ L9 M5 u% |6 g- f& U; w
先对ADC1基于DMA标准请求模式做演示。
$ }" q; A9 |/ G) I
1 p7 C6 B) `+ D. U

3 L* z! a2 J6 A随意选择ADC1的4个通道,扫描模式,连续转换,DMA传输转换结果并令DMA工作在外设字到内存字的循环传输模式。使用CubeMx进行配置。其中DMA通道使用Channel 1。* u6 B( v! J- N& T! M. T' t

  f# x- i, j6 K0 q) _1 M. B# J( s& w
1 s6 |- z2 J! @: l8 @/ _
微信图片_20230802163811_5.png
; I3 f1 g* x: v% s/ X  ]
$ [- |- [  D( o  W& Z% m4 H: r 微信图片_20230802163811_4.png 0 N+ m% D6 F& b4 x! D

% C0 m, e+ c, Y" i 微信图片_20230802163811_3.png
, [2 R- j' X% b. F8 y/ V1 {! n) x" {% a, Z
; e- h# d. k  `* }& |" x
相关代码:( {$ ^7 @5 u7 B
  1. #define     ADC_BUFFRER_SIZE   ((uint32_t)  8)   
    % h# j1 Y: K. k+ `4 X, K
  2. uint32_t   ADC1_Result[ADC_BUFFRER_SIZE];/ X) O+ N1 d' d4 |# a- m+ ?& v
  3. ' {% Y, ?( M0 q* O" n4 O5 k) F: M7 X
  4. ADC_HandleTypeDef hadc1;1 k* z$ h5 C; Z: s% N+ P* ?- W
  5. DMA_HandleTypeDef handle_GPDMA1_Channel1; //For ADC1
    / a+ f- e( a5 w6 V1 g5 ?+ N
  6. ' a7 r. T1 ~/ i+ T
  7.   /* USER CODE BEGIN 2 */
    # \# F& {, `8 h4 v# M

  8. 3 ^- ~. _& @7 g

  9. + G$ [4 g# ]  m' {  d6 ?  p9 j
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    : M; p9 {. L3 {( ]
  11.    
    7 |2 c" s/ D! o- g
  12.   __HAL_LINKDMA(&hadc1, DMA_Handle, handle_GPDMA1_Channel1);
    & N! o+ I& L- g/ n4 R# e; N# j

  13. ; M0 q$ w7 m# v* ~6 S
  14.   if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC1_Result,
    + n! A- S9 Z* z! d2 [, ?: x5 t- z+ O5 {
  15.                          (ADC_BUFFRER_SIZE)) S4 G; f4 {9 c3 C% h& C( l
  16.                        ) != HAL_OK)
    ) p6 j- [% f) i4 a' T  c$ |
  17.   {
    4 J% x/ Z9 n+ z3 T
  18.     Error_Handler();/ `8 z6 q# f" r# v8 b" v
  19.   }
    5 @2 h6 M! y( T8 e1 T: f
  20. * L4 K, w! _/ A3 z2 \) U2 l( R6 r
  21.    /* USER CODE END 2 */
复制代码
0 Q# {& P* ]4 K
运行结果如下图所示:【目前4个通道我是悬空的】. n! m. G4 U  h6 ?1 g7 n

+ i0 p7 C4 ~- J/ ^  M
& K( I( K  y3 i2 l1 D) W. E
微信图片_20230802163811_2.png
& i3 X3 j# o5 b8 g( G) _" c" P* I6 x% v# y' c
% n! ^- S6 e& A# s. r- J$ B
现在对ADC4基于DMA链表模式做演示,其实就一个节点。
. J1 A8 q# S3 p! v$ E" S) N: ^( T7 f; |' l5 E

2 l) v- b: H( @% ~. l8 V选择ADC4的4个内部信号通道,扫描模式,连续转换,DMA传输转换结果,并令DMA工作在外设字到内存字的循环模式。使用CubeMx进行配置。其中DMA通道使用Channel 0。对于内部信号的采样,往往有最小采样时间要求,我这里的演示随便选了个参数,具体应用时请参考数据手册及当时ADC时钟具体拟定。特此提醒!0 D3 W6 Q' s/ f$ \

) o; X4 a7 c  u( L& B1 Z$ @& y

9 c* [' k9 {8 g' a3 d 微信图片_20230802163811_1.png & z' h/ z: |. v2 c5 f: h

  X' o( c" s$ L! i& \% h

; l" b/ \, f* m( F& ~关于DMA链表模式的配置在CubeMx界面里的Utility菜单下。
1 O& A7 N2 H0 x6 y! M; z! z- r7 ?' s( i% Z
, ]. p  g- ~+ F9 X2 C* t; ~/ G
微信图片_20230802163811.png
5 N& j1 B! @. j* O6 B, `( o  i( I  M7 E( G
微信图片_20230802163812_2.png 5 w2 D2 h9 y7 S3 e" [2 x' c6 ?. c, I

, t8 r. D$ e8 y* g; d) D 微信图片_20230802163812_1.png 8 h! F& W, W( T1 `& L

; V9 G# l. J) {8 s

* y5 j- T/ P' y# A- @( j相关用户代码:& @, u4 G8 p, o$ Q1 b4 |
  1. /* Private variables ---------------------------------------------------------*/- H1 G1 l7 D" u  T( k
  2. ADC_HandleTypeDef hadc4;3 l6 {+ V4 e% W2 V+ ]0 m5 w
  3. DMA_NodeTypeDef Node_GPDMA1_Channel1;" ?$ U8 k9 [( E  U/ E
  4. DMA_QListTypeDef List_GPDMA1_Channel1;
    " f. {  s. G* ]$ }. p0 B, ?) ^8 J
  5. DMA_HandleTypeDef handle_GPDMA1_Channel0;
    / k; V# F4 v6 `! n/ I  |
  6. /* USER CODE BEGIN PV */2 E; J. b; H8 T5 K- n6 v2 c0 L
  7. ! {' k. m' ]( |9 d+ A! x
  8. /* USER CODE BEGIN 2 */# D' M( m' n# |% K) [, B
  9. . f, N' @- X8 I% f" j! r
  10. HAL_PWREx_EnableVddA(); //add it manually with lower cubeMx version
    3 O1 x: [" \% G$ O2 ]& G

  11. ; P* @4 \* S4 h& C% e3 [
  12. MX_ADC4Queue_Config();
    $ G+ u+ x& [' x  J$ M4 x8 }7 a
  13. + \- i) Z+ C4 j- D# O
  14. __HAL_LINKDMA(&hadc4, DMA_Handle, handle_GPDMA1_Channel0);
    - \( x6 \' H  F- p
  15. 0 R4 Q! H/ p7 [
  16. HAL_DMAEx_List_SetCircularMode(&ADC4Queue);3 D- L0 [# M$ m& ?7 [
  17.    
    . B0 L9 ?' S5 n2 `) j
  18. if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel0, &ADC4Queue) != HAL_OK)
    0 a; o2 o' D4 X: p6 M- Z
  19. {1 p1 C( \  ^  B  F) Q! B
  20. Error_Handler();# p' x$ e1 b9 z" s
  21. }
    0 z7 W6 E& r* u% \

  22. * l( H) F7 Z8 f! B) _
  23. if (HAL_ADC_Start_DMA(&hadc4,
    ! ~" H, I) ]% E; }0 h
  24. (uint32_t *)ADC4_Result,
    * Y' m  X3 {1 {" O8 }7 v  H
  25. (ADC_BUFFRER_SIZE)
    * N) v3 v0 `8 V% p+ s
  26. ) != HAL_OK)- [( n% M" x( X5 y2 C- ]8 J
  27. {
    $ b2 n7 c5 c5 `$ ]
  28. Error_Handler();
    7 U' p3 f, n9 E. _* V. M8 s
  29. }0 u2 @3 l: W/ K, }. P
  30. /* USER CODE BEGIN WHILE */
复制代码

( \3 e* d8 w' I结果验证【显示了2组数据】:
9 }/ @  ~* k- U4 ]6 ]( R% L* i! S# v" P

7 X$ \. i& f+ h 微信图片_20230802163812.png # h" k5 f5 {+ S9 g  T
' ^- E  H0 R+ x. f) P3 x2 U
8 {7 {1 a9 R+ \9 X
最后还提醒下,如果CubeMx版本比较低时,HAL_PWREx_EnableVddA()函数需要自己手动添加。我目前CubeMx 6.9.0版本已经不用手动添加了,创建工程时会将其自动生成于相应位置。6 V; X* ]$ x1 ]; t9 q* A
: W  U8 }. o8 D+ X% E3 J* e, A

' `* Z& i1 T$ [; N8 x' e" W0 j% W# ~7 m6 F) V( H3 K
如有侵权请联系删除: d1 D4 H8 {' ]/ i3 W/ F; m

# Y( l& E% Z/ u% ~1 i" b转载自: 茶话MCU
7 }1 ^& w6 V, e# x- B3 D, V! |$ I; H4 N; j$ L+ j9 G

/ H, a+ z" `  I- r, a* u% j. |  Y
收藏 评论1 发布时间:2023-8-2 16:42

举报

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

学习一下

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版