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

STM32CUBEMX开发GD32F303----ADC在DMA模式下扫描多个通道

[复制链接]
STMCU小助手 发布时间:2022-9-5 21:00
概述
- x. k7 j, w% n6 g0 T4 {; A; g本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。
; X" {8 i4 ]; I6 W% r. L8 P需要GD样片的可以加Q_QUN申请:6_15061293。
9 H2 K- W% w7 ?8 b本章主要配置,双ADC轮询模式扫描多个通道,通过串口进行打印。
) X! C  \% Z* X8 K4 G- K, y+ n查阅手册可以得知,PA9、PA10为串口0的输出和输入口。
4 B0 q6 ?& J" q* D) o" v- q# `2 }+ \' \1 {3 M
0a398431e6b94d6896fddd0c4da2b142.png / w$ |8 a3 y8 W8 ~, {/ ]

" o# j- H+ O! @. x4 _# l- g
, c, X6 ]+ H3 ?  C, E, R3 GADC通道配置2 y+ F( H% ]$ e# {* S! `- a0 u
ADC1        IN0(PA0)        IN1(PA3)        IN4(PA4)' l" T/ o; T3 y- q5 W
生成例程
4 Y9 N" s5 ~" Z1 i这里准备了GD32303C_START开发板进行验证。
3 s! M3 _& e* f9 t% O7 ]8 j7 i* F  |, m' Z5 s# L2 [; _; ]
edc4150f9a0d4b2fad612de25ac8ac74.png
$ a( w# h0 O# I; [+ s9 M: a2 j& e) T/ f- M/ k8 U  H! ?* H. J
STM32CUBEMX配置
; ^9 Y: v. y. S% L3 C3 v8 b$ u1 W) P; ]1 g( J/ _' |, O* L, ~
87bccfad45a544d0946626e660b72715.png
" v5 S5 G5 t' Z/ W6 A8 M, q0 S3 t3 m% [# m/ ?8 g; ~
勾选中断。
" S1 y- T5 _' ]/ Q' q8 O7 ^" U% O/ L" h7 I( Y2 m& ]0 B
838f2d392e9948d998372216c86e4d60.png 2 t: J2 A0 w1 K: S
+ y* F9 V& w$ a6 O$ q7 }7 K7 Y
ADC1配置。
4 }; Y9 R0 q& D5 q4 A3 T/ K+ k3 h7 n; B
7aa40eb5b8cd4b8e9f07b37b6b606361.png ) f; @$ _. W; Z" M5 s# B1 _
/ D, T6 b: |0 Q( ~% e- Y
ADCs_Common_Settings:! a2 W: o5 k0 F$ ~- l& J
Mode:Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选,具体配置 ADC_CR1UALMOD 位。
" J. c# @2 B% }1 Z  m% {- s
; G6 h  m. J! Y2 e; X4 SADC_Settings:
; ^1 C  G+ j- Q8 ~. ]Data Alignment:" O9 }. `6 o& _' q
Right alignment 转换结果数据右对齐,一般我们选择右对齐模式。( U; ^" x+ l; |2 f  r; B
Left alignment 转换结果数据左对齐。
' R" s1 O- i4 h; C5 j  nScan Conversion Mode:$ ^" }# n6 ^! e9 o
Disabled 禁止扫描模式。如果是单通道 AD 转换使用 DISABLE。
% i/ z; E8 [" d$ q8 |+ [. v5 g5 D( w+ }Enabled 开启扫描模式。如果是多通道 AD 转换使用 ENABLE。
: n. a; P2 T/ g6 t) eContinuous Conversion Mode:$ F. Z) i4 O% t
Disabled 单次转换。转换一次后停止需要手动控制才重新启动转换。0 ]; ?/ Z8 |2 u/ g9 ~; c
Enabled 自动连续转换。
: t0 E3 Y) P% |8 Z1 H3 b4 pDiscontinuousConvMode:! a2 ?, x0 e0 H/ j0 v4 |- j
Disabled 禁止间断模式。这个在需要考虑功耗问题的产品中很有必要,也就是在某个事件触发下,开启转换。& P; i/ `9 i; X" O
Enabled 开启间断模式。
2 C* a0 e0 n7 w$ M* {, Y$ w( g. e6 _. w9 y; b. |
ADC_Regular_ConversionMode:
2 V0 D6 c& y2 p! z; r5 LEnable Regular Conversions 是否使能规则转换。1 L: A( g! c, ]8 n) n
Number Of Conversion ADC转换通道数目,有几个写几个就行。' l( r0 g0 w, S$ G
External Trigger Conversion Source 外部触发选择。这个有多个选择,一般采用软件触发方式。5 O$ ~3 v9 L1 ]9 x+ u, d! J$ K4 J
/ e; E( H! h; u# Y) _6 W8 ?# i; ]
Rank:
. e! c6 C8 B0 @: a: z+ t" PChannel ADC转换通道
# w$ I# {' n- b( dSampling Time 采样周期选择,采样周期越短,ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。) ?9 ~+ \& S! M* F+ W3 E9 |
7 V8 _& V6 g7 d8 F( V9 \6 w
ADC_Injected_ConversionMode:
/ \0 N/ [4 C" ]Enable Injected Conversions 是否使能注入转换。注入通道只有在规则通道存在时才会出现。
1 m  _: |6 L6 C  _& @' I" }WatchDog:# M- y- @5 B5 \0 V; j3 H
Enable Analog WatchDog Mode 是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。: M% M9 l2 |! c5 f8 o8 @6 |! W  y

3 ~, D+ b! ~; R" l( GDMA开启。3 O3 l# c, G& d5 d' i3 q! S

" w( Z, ^+ F/ J# k; l0 L 7873febcebec418096df0d3e34529806.png 1 g1 n/ z5 X; h% d& j$ m* h! W+ m# U
' T+ ^/ A" K+ g& w/ ]
生成独立的文件。
) U- C2 e/ R- k4 H. ^' t
! i2 `0 j0 Y' h* y* v9 V6 r) { 0ab2e1efc82b436ab05e6330529c444c.png 5 g& d9 I( g  j# Y* v1 ]3 F
4 t6 l5 M- Z7 c% \
keil配置
: q: f- m' t& @: P5 kmicrolib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。
4 X1 m, E# \- f7 P3 {& G( S
; r) X( F" [0 Z+ E6 _6 [( M. b  @! V fe23b1a0759a4cb8843ac02dfe30f893.png ) m, `/ P6 c+ D/ q. w

7 {5 @! t2 ~4 L# Y" B代码: x2 _- `) [, G# j  V/ d) a
在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。
# F7 R" g8 I$ s$ U& C4 q
  N9 d7 Z4 B8 i- o: ]
  1. /* USER CODE BEGIN Includes */2 h3 J- q7 j& w
  2. #include "stdio.h": l7 H5 [9 k4 \* \( b( @' C
  3. /* USER CODE END Includes */
复制代码
8 N" k7 ]7 N. e1 O
函数声明和串口重定向:, ^+ L( p8 {3 o8 T, W3 |: A

1 i+ N% y' l& G- ]% x" b
  1. /* USER CODE BEGIN PFP */
    8 E4 d. U3 ?! c, s( U  a$ ]7 C0 O
  2. int fputc(int ch, FILE *f){
    6 u- o) E- n& z! _0 m2 e
  3.         HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);$ h+ H& z% L5 e# ?- F
  4.         return ch;
    $ c* `) u& T7 W5 r, @7 E6 k% r: O
  5. }; W6 b* o. z8 S/ A+ q

  6. $ e% @4 Q' R2 m/ Q& }
  7. /* USER CODE END PFP */
复制代码
: T) C! R1 ~0 Z0 D
定义变量,存放采集到的数据。4 `' y- U. j* N) s
. s  o. x$ L1 r! i3 R: E
  1. /* USER CODE BEGIN 0 */
    . }- x$ q) e# r# d9 Z& @
  2. uint32_t ADC1_1, ADC1_2,ADC1_3;//采集的三个通道的ADC
    4 V: M. @( F8 ^/ f- N
  3. uint32_t ADC1_Value[30];//DMA存放数组6 z1 z' y1 v) C1 L' Y
  4. uint8_t i;
    # i" t$ W+ I! }3 `' d
  5. uint8_t ADC1_Flag;//dma采集完毕中断- o! m9 m- B' Q. h2 h
  6.   c  c( t/ s# U
  7. /* USER CODE END 0 */
复制代码

" B  S. \' Z; w- ]( n+ |使能ADC传输。# j) f* y' z# Z6 ?3 H- ~7 ]
9 Z; c0 I3 L' z. y" E9 a
  1.   /* USER CODE BEGIN 2 */% H  `/ I2 l' J0 L: j
  2.   HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC1_Value,30);    //使用DMA传输7 X- Z; l# ]$ T+ \
  3.   /* USER CODE END 2 */
复制代码

1 L9 U, Y  C8 K+ L" K主循环。
2 E) S9 i5 D; c1 F# O- i
+ L, Z1 k( v" p: H" m) \/ [$ O
  1.   /* USER CODE BEGIN WHILE */
    : ?! m  j* H( H! O; Y' c" g$ a
  2.   while (1)
    " [- q  }1 p4 A% p" f# ?$ G
  3.   {
    , ?* Y) Z% h8 Q0 J& a
  4.     /* USER CODE END WHILE */
    6 X, ~- L7 K5 g! [: `

  5. + n5 U+ Q" b$ k0 l
  6.     /* USER CODE BEGIN 3 */
    $ ^/ A! R  R9 O3 p( ?" T- W; m! l; u& n
  7.           if(ADC1_Flag==1)
    0 X- v+ R- t8 X  w$ c% w! n* C
  8.           {
    7 p  w1 M3 b5 O+ M+ ]( j5 x+ O
  9.                   ADC1_Flag=0;& W% {6 C- o3 B+ R
  10.                   ADC1_1=0;
    6 s2 K8 h6 I3 ?2 o7 A- z1 H$ {
  11.                   ADC1_2=0;$ T9 z* L% V; e
  12.                   ADC1_3=0;
    7 M5 B' d: N. Q) A' R
  13.                   for(i=0;i<30;)
    1 {, P, ^6 p3 Q
  14.                   {
    / p% M, n* S; F. ]% p2 n
  15.                           ADC1_1+=ADC1_Value[i++];
    ) `/ {7 b. \. @- K2 ?2 _
  16.                           ADC1_2+=ADC1_Value[i++];
    7 ]9 @" A; \5 Z" [" D$ v% m
  17.                           ADC1_3+=ADC1_Value[i++];
    6 Y* r9 A3 m: E5 X3 i
  18.                   }1 O" s$ D' |/ v2 P# v
  19.                   printf("\n");
    ; ?$ m4 z. i8 F" t( W$ `! C! }- o9 R6 {
  20.                   printf("adc1_IN0(PA0)=%4.0d,ADC_IN0=%1.4f\r\n",ADC1_1/10,ADC1_1/10*3.3f/4096);; v1 z- r! k3 i5 I2 _& J5 R+ s; i
  21.                   printf("adc1_IN3(PA3)=%4.0d,ADC_IN3=%1.4f\r\n",ADC1_2/10,ADC1_2/10*3.3f/4096);
    ' L$ |9 E4 j- ^6 b8 Y" e% d! H% P
  22.                   printf("adc1_IN4(PA4)=%4.0d,ADC_IN4=%1.4f\r\n",ADC1_3/10,ADC1_3/10*3.3f/4096);, \$ S( F. V' ~/ j. ~
  23.                   HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC1_Value,30);    //使用DMA传输
    2 n. [: T1 e' N2 a* ]! I0 k
  24.           }5 e6 `! c7 v6 X) J
  25.                 HAL_Delay(1000);7 [. y, P  W' h2 _; }
  26.   }
    6 E! h+ l! `( z2 }) f
  27.   /* USER CODE END 3 */
复制代码
; k/ i- k* W3 G& V/ }+ y
ADC回调函数。
* V( j7 f+ |; r# Y+ y( q, t. KDMA传输的时候如果读取内存片段,会有仲裁器的问题,加了一句关闭DMA的语句HAL_ADC_Stop_DMA(&hadc1);
' _8 `8 i/ m' k
6 F: l9 ~6 d. |* n
  1. ; _' G6 k- d9 L- z/ }
  2. /* USER CODE BEGIN 4 */
    0 J, \* D1 Y  a. n; d, C
  3. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)' W" r8 a- B) H6 |2 A- D9 e7 u
  4. {% ~1 d  ?8 }! C6 X
  5.         if(hadc->Instance == ADC1){  H, o7 H* q; a$ b. Y8 N- i
  6.                 ADC1_Flag=1;
    ! D8 Y/ H6 @5 O* G
  7.                 /*3 V& S5 d9 n! b! [( P& S/ |8 c
  8.                  * DMA传输的时候如果读取内存片段,会有仲裁器的问题,加了一句关闭DMA的语) w* I8 H% Z& P( F- _

  9. # Q- ]7 _( t% x; H) y& W6 v
  10.                  */6 _" l1 {! d& x: q: A
  11.                 HAL_ADC_Stop_DMA(&hadc1);9 B8 v7 J8 W) T2 a4 B6 I  [1 v
  12.         }
    0 ^6 {- t" i4 l- Y9 `, k1 i4 C
  13. }2 K4 L( m. A) ?% W. H
  14. /* USER CODE END 4 */
复制代码

7 V" w; w! |9 r5 Q5 ^————————————————4 A6 Z7 ?+ J3 Q8 Q: Z3 C
版权声明:记帖
% L3 r2 k/ w2 u0 z" U5 o4 X, B# _. B
' s* z$ T+ g' g6 m) P( f0 J* P" U) P% d- Y3 C4 z
赞 收藏 评论0 发布时间:2022-9-5 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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