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

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

[复制链接]
STMCU小助手 发布时间:2022-8-16 23:49
概述
( o: g) _1 S+ j本章STM32CUBEMX配置STM32F103,并且在GD32F303中进行开发,同时通过GD32303C_START开发板内进行验证。
! G; l5 `% F  C4 F需要GD样片的可以加Q_QUN申请:6_15061293。
. ^- @7 ?0 g# z  `本章主要配置,双ADC轮询模式扫描多个通道,通过串口进行打印。2 Q6 y% L. k- n+ ~. X+ r
查阅手册可以得知,PA9、PA10为串口0的输出和输入口。
) L9 z5 U  E7 W 0a398431e6b94d6896fddd0c4da2b142.png
# t% F8 a, g# q6 ~3 p+ c0 X- I9 O! a+ S
6 ?+ y1 D" \% ?
生成例程# R+ O3 _% }, F
这里准备了GD32303C_START开发板进行验证。/ |& B9 c' o5 R% y% c: n" N

$ x7 z& t$ |* {. x- |" G3 e9 r, ^0 p7 X edc4150f9a0d4b2fad612de25ac8ac74.png 7 _* I8 S& J7 b4 \1 z- \

: b5 d1 _3 \8 D& Q+ u8 NSTM32CUBEMX配置1 t, ^* k* L2 s. i" o

- K+ ?- f. m+ n 87bccfad45a544d0946626e660b72715.png 0 R/ [! v: q3 r% g5 o. a

3 [2 [- K2 {% V0 k5 x勾选中断。& B) t5 F' T9 [5 H, W9 g
, C! ^  w7 z4 D2 O- o6 a6 j9 T
838f2d392e9948d998372216c86e4d60.png
# E$ m& [* x0 `
! N5 d" e' y+ rADC1配置。$ ^5 Q) z' S+ a1 G4 K

( r: q& [! d4 p5 d2 m8 S3 [% S 7aa40eb5b8cd4b8e9f07b37b6b606361.png
$ Z2 s2 P$ ]4 ?/ \  O* j6 Z. e* l6 G* u# d; ~9 g
ADCs_Common_Settings:/ J" w+ o% R% k( b( @3 P+ y' h
Mode:Independent mod 独立 ADC 模式,当使用一个 ADC 时是独立模式,使用两个 ADC 时是双模式,在双模式下还有很多细分模式可选,具体配置 ADC_CR1UALMOD 位。" }8 \1 D2 `+ F; h! B! B1 T
9 f/ o" B' W8 \: P0 n
ADC_Settings:% y6 ~  l% n5 ~8 v& K
Data Alignment:9 |; N4 z  Q& }
Right alignment 转换结果数据右对齐,一般我们选择右对齐模式。1 Q6 x) ~. W% |! r
Left alignment 转换结果数据左对齐。6 c8 R+ p! _: ?+ g$ K0 G, v
Scan Conversion Mode:' {! S: r/ C0 C0 f# `
Disabled 禁止扫描模式。如果是单通道 AD 转换使用 DISABLE。
/ y' [9 n+ j8 i& c1 n4 MEnabled 开启扫描模式。如果是多通道 AD 转换使用 ENABLE。
" _: F' k2 ~4 L* r8 wContinuous Conversion Mode:: S" B! `9 j' {% r3 A: i  ~
Disabled 单次转换。转换一次后停止需要手动控制才重新启动转换。
7 ~, {% z# G8 T3 C9 ]0 U+ n& w$ I/ gEnabled 自动连续转换。
2 p" Y0 S% ?" \; ]( |DiscontinuousConvMode:  ~5 {+ k* X; Z) L/ M# S; V; A
Disabled 禁止间断模式。这个在需要考虑功耗问题的产品中很有必要,也就是在某个事件触发下,开启转换。
) c8 V' @  v% x. R9 ^& ^  REnabled 开启间断模式。3 M7 E; G+ C. k; h1 |! J

+ w5 Z8 P! j" T" i, I; {ADC_Regular_ConversionMode:% Q1 t( m% c; ^/ M: t# i1 \
Enable Regular Conversions 是否使能规则转换。
9 j; k/ P( x7 {) C. {+ [Number Of Conversion ADC转换通道数目,有几个写几个就行。
# ~) }- e- n% I6 W% m3 LExternal Trigger Conversion Source 外部触发选择。这个有多个选择,一般采用软件触发方式。6 w# D, w7 l0 l' J' {1 s
2 m+ o3 u* l  H; O
Rank:
0 _( F6 r) X0 `Channel ADC转换通道2 d. E" J- @8 O7 x1 A
Sampling Time 采样周期选择,采样周期越短,ADC 转换数据输出周期就越短但数据精度也越低,采样周期越长,ADC 转换数据输出周期就越长同时数据精度越高。; G  J/ p4 Y7 P; K3 M1 D3 W
) J+ {1 E; z9 n5 ~* R, j9 E5 m& |+ j
ADC_Injected_ConversionMode:7 Q: p, K% X# N8 c' _4 Z  u
Enable Injected Conversions 是否使能注入转换。注入通道只有在规则通道存在时才会出现。% L% w& n8 x6 A3 V3 k# K- Q
% o$ }8 p) }4 p( o# ]- X! h. G
WatchDog:
0 M/ ]- Y9 Q2 m8 l* \Enable Analog WatchDog Mode 是否使能模拟看门狗中断。当被 ADC 转换的模拟电压低于低阈值或者高于高阈值时,就会产生中断。
" P( O( I$ h0 ~$ E) yDMA开启。
2 K2 z1 C/ s' ~& m$ b; E
( @  C0 o5 ?; q/ z6 v8 r$ Y  g 7873febcebec418096df0d3e34529806.png # `: g6 O2 d- s. A
+ t5 N! }+ I* j7 g! x* Q
生成独立的文件。$ q+ `* r; W4 C0 [( J

7 i2 I! n8 A. f) H8 I 0ab2e1efc82b436ab05e6330529c444c.png ! B# k% ?3 [; x! [9 ^/ E) E( d
6 A3 \6 V' Y# a( T. f% L. b
keil配置
. v" U# z2 `5 m, n8 A6 {3 x. Fmicrolib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,如果要使用printf(),必须开启。
3 k( R7 W" V. P3 d+ ^6 F/ n) e+ r5 a" n$ `* z8 r
fe23b1a0759a4cb8843ac02dfe30f893.png   v, ~2 p  T0 a$ U
9 P. Y* G4 d8 v' K' _
代码6 N8 n' c2 H& b' s
在main.c中,添加头文件,若不添加会出现 identifier “FILE” is undefined报错。
  1. /* USER CODE BEGIN Includes */; [, ?  e  m0 V) J& j; N+ y
  2. #include "stdio.h". F4 s6 o" I1 F/ `* p
  3. /* USER CODE END Includes */
复制代码

/ q9 @) X3 G, f! W7 l. m函数声明和串口重定向:! b% B2 M) M6 G1 w$ j: c$ a3 d

2 k6 R4 B0 {, s2 x* Z1 Q8 \
  1. /* USER CODE BEGIN PFP */0 I# T" Y% L; P( r. V
  2. int fputc(int ch, FILE *f){) l' x0 e# W1 `2 R
  3.         HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    , H+ i& t, K# b
  4.         return ch;
    3 h9 J6 @6 d+ s
  5. }
    " i: n; ^5 A8 ~+ P4 L/ M# n
  6. . a1 B  [$ d. Q' \
  7. /* USER CODE END PFP */
复制代码
4 x$ [2 ?5 K% V
定义变量,存放采集到的数据。3 G$ A$ _! ?# R0 H- i; r

* J9 @  i% u( t# N5 C+ c8 k; y7 M
  1. /* USER CODE BEGIN 0 */
    & s6 `* s5 }" c  c5 [
  2. uint32_t ADC1_1, ADC1_2,ADC1_3;//采集的三个通道的ADC
    6 f: `+ p8 y  h( J1 T& m
  3. uint32_t ADC1_Value[30];//DMA存放数组
    % ^2 M; F; Z% H, C
  4. uint8_t i;. g  l$ O$ z; f5 c
  5. uint8_t ADC1_Flag;//dma采集完毕中断0 D& O5 @! z! Z9 m
  6. % x. m5 y9 {" s) |5 @
  7. /* USER CODE END 0 */
复制代码

8 l% c5 r* }- }+ e* W6 i; d使能ADC传输。
  1.   /* USER CODE BEGIN 2 */
    ) X' {8 k# ~5 O. V1 A
  2.   HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC1_Value,30);    //使用DMA传输  d7 S4 u& ^, M
  3.   /* USER CODE END 2 */
复制代码

: m- ~5 j/ ]- g主循环。
# p" q# X' Y) o% G
  1. ! \: |$ r4 R& O0 v* r7 f# C/ h' [& b
  2.   /* USER CODE BEGIN WHILE */* d# M2 ~5 H3 s" k8 C! D) i9 D
  3.   while (1)8 W0 S# [7 q+ _' J2 H0 d
  4.   {9 i, y2 h6 {; L) o  t+ [
  5.     /* USER CODE END WHILE */
    * \. a) D$ a3 K7 f

  6. 7 r) W+ [' E8 w* @7 @8 A( M. h
  7.     /* USER CODE BEGIN 3 */
    3 I0 q, ^7 p( \+ M, M
  8.           if(ADC1_Flag==1)( r% ?5 K; q6 _5 n# s. w
  9.           {% I5 R/ D9 ]2 V9 n1 t
  10.                   ADC1_Flag=0;* t; U% c9 j( _+ v! z( l$ z( _5 a
  11.                   ADC1_1=0;
    # D* J: F2 i& e" x+ E+ t4 [  W
  12.                   ADC1_2=0;
    % f& W0 f: N$ s; y
  13.                   ADC1_3=0;" s) S0 X/ ]! ^/ ^3 g4 ]1 E
  14.                   for(i=0;i<30;), `/ J% \. n4 D5 a+ Z
  15.                   {5 ], K& s, J6 }) I: z- I/ C
  16.                           ADC1_1+=ADC1_Value[i++];
    9 N( N3 `% R" o! P2 Q8 o( J
  17.                           ADC1_2+=ADC1_Value[i++];! V9 F; U1 g9 s
  18.                           ADC1_3+=ADC1_Value[i++];
    - M9 O# F6 c4 N8 Y0 m" F
  19.                   }
    9 M, ~3 r- T& s
  20.                   printf("\n");4 M. s) ]$ J! Z1 T  U4 y
  21.                   printf("adc1_IN0(PA0)=%4.0d,ADC_IN0=%1.4f\r\n",ADC1_1/10,ADC1_1/10*3.3f/4096);9 z- F8 E4 S/ D4 F+ w
  22.                   printf("adc1_IN3(PA3)=%4.0d,ADC_IN3=%1.4f\r\n",ADC1_2/10,ADC1_2/10*3.3f/4096);+ m2 F8 V4 l- y  m8 L
  23.                   printf("adc1_IN4(PA4)=%4.0d,ADC_IN4=%1.4f\r\n",ADC1_3/10,ADC1_3/10*3.3f/4096);
    + E1 S3 b/ i8 v  r; I
  24.                   HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC1_Value,30);    //使用DMA传输7 ~  l6 J* W) U/ O0 ?; G
  25.           }9 Z; b- W+ a( x! i% i# w
  26.                 HAL_Delay(1000);
    " T" b4 L- N8 C$ r& c  H3 h
  27.   }( v! G9 k: W  B7 v8 k
  28.   /* USER CODE END 3 */
复制代码
7 v8 b$ B/ N  m* Q
ADC回调函数。0 @1 q+ b, P/ p  l5 b( t: s
DMA传输的时候如果读取内存片段,会有仲裁器的问题,加了一句关闭DMA的语句HAL_ADC_Stop_DMA(&hadc1);
1 z/ \( Q* S9 c4 P2 U7 ]' T5 Z/ [5 {
  1. 0 Q: n# d; q9 K) b: j8 U# T

  2. 4 A# m' X4 v# V5 ?* U
  3. /* USER CODE BEGIN 4 */, J2 X8 K& y/ J0 y7 s
  4. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
    2 t  `" R- H6 g. V. d5 Z( I
  5. {
    3 k2 J( T2 n9 Q( u" ?$ d% s7 N0 K
  6.         if(hadc->Instance == ADC1){
    . s/ R, C  E. S3 i$ O
  7.                 ADC1_Flag=1;+ T" J$ _; d9 b- b, d& {% c
  8.                 /*2 j6 L& X. x8 O+ f% X
  9.                  * DMA传输的时候如果读取内存片段,会有仲裁器的问题,加了一句关闭DMA的语" L, A  u9 f: r0 \* k

  10. - W) n1 j* _- z$ F9 [0 ]
  11.                  */1 ^8 p. M2 J0 [/ ~1 F
  12.                 HAL_ADC_Stop_DMA(&hadc1);* ]) f7 S. W4 A" }' ?% [+ B# A4 X. M
  13.         }# v! p2 I% p9 n  z
  14. }
    0 W7 W5 a/ E7 F5 W: X
  15. /* USER CODE END 4 */
      p. L; _- ], x2 U. A* m+ C
  16. 1 k1 `- l" @( [$ h% p
复制代码
* v9 _- m" D, g8 B8 D

9 I. Q& O! P7 }
赞 收藏 评论0 发布时间:2022-8-16 23:49

举报

0个回答

所属标签

相似技术帖

官网相关资源

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