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

【实测教程】STM32L431之ADC实验

[复制链接]
STMCU小助手 发布时间:2023-1-13 19:00
一、开发板平台简介:
% r% c$ O2 _& y! d* m1、开发板资源简介

# a0 I/ U2 S+ E* ?(1)开发板主芯片型号:STM32L431RCT6
! s) Z+ e1 o9 T+ ^(2)开发板主芯片封装:LQFP-64_10x10x05P
- Z1 \) a7 t2 l9 d- z- Y(3)开发板主芯片内核:ARM® Cortex®-M4( i# T3 J( m! M- ^
(4)开发板主芯片主频:80MHz1 H% S; k: b1 o1 R5 Y, J: R
(5)开发板主芯片Flash大小:256KB; R; f- i' L" x0 k; n6 h
(6)开发板主芯片RAM大小:64KB- J3 I' A: n, ?/ r1 ~

' U: U6 x+ w6 d, y9 p% @+ D3 F
bb91345227434ee7a43a34bf3fe366e6.png
- M$ ^) t9 w: @+ f9 o
# h, P2 U- @: e0 y6 m) Y
929c0cce04aa4115a8623703982bf3e1.png 6 p- ?! q8 `5 e" S6 z

% x' c6 Z- G' V: o1 N2、LED灯资源
; \3 p( Z3 l$ e. D* s0 w(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
8 g/ E  t3 X; d: F' t# S: c8 [) P3 I! I1 P/ G  U% e
0f177691c5814f16a508bcfa747f87ac.png
( f* s; C8 ~8 T% q6 G
; C1 {3 ]# S7 |& S  W; y+ C* @* G. |' L9 K

, I* N$ b. [2 S' X. m- j7 H(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
. ]7 t6 p0 P2 P; z8 T/ m5 G8 R7 S$ k% h3 f* }; B9 Z6 L% Q
e923ad767b8448b7ac37c4ed693724bd.png
. J3 c3 |" G% J. u$ j  V( _+ h& o; y0 @6 S1 y/ d
​3、串口printf打印工作原理
% ~! I& N% D) _2 O5 x 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。  m* u& _& P6 G- j
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。9 G8 v& J, m3 D6 v) Y

, A% l& D2 p$ m' A4 T( Z     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
+ X& E- ^7 s! A/ ~% p) m
8 k2 G" R5 c. k! z0 h; I
TTL转CH340串口,硬件原理图如下所示:
" Z0 f! i8 d! E2 X
! g, e$ c( P* N5 w
4df1b489cb944c26b55013001061675d.png
. ^- e8 @0 t7 I* P! Q3 D" V
& f5 b8 L+ |* V

/ i1 b# Q6 x+ _; ^& W4、ADC简介:
; `( B2 e( ]# c7 GADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。; y" J8 [* S, F
: t, U" I# A. h- _  F
STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
/ V2 m! w) D. ^4 a- F  L- w3 w& B* H: X
STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。$ C! _: ~) U9 I7 y- t, b( I1 C+ D

: g! O% [) v" J$ j% w; ?/ G
9 W0 a9 e% e- S
  二、ADC实验过程1 H2 Q/ `+ V$ V* U, U
1、新建STM32CubeMX基础工程

8 ]+ V  T( M2 J(1)打开STM32CubeMX,点击“File”-->"New Project". y  a& @/ N( p/ o/ `" _5 A# O7 z* x

1 V7 o. E1 l# o# N7 s& @8 X0 e
2399170347904e959c855fefd5877f84.png
* y: Q8 {4 \! ~1 u# e
+ }2 F8 k! `4 K7 o  k( k(2)等待打开主芯片选项界面(大约1分钟时间)。6 ^% g& F7 {+ ^, c3 o) v. ^3 n8 k# G

8 [. K% s' J0 ]9 U5 B! _0 B
d74d2fdc60c9440483e2b7cf8d928e7f.png / F+ I5 k" t+ l

; Z- O5 c2 A2 g9 w(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。0 j) d& E7 a( D. b
- M4 N( w! B# r' X( F' K* m
7b80345238d74bea82ce70e1a348f7b4.png
# Q7 ]- _# u9 k7 Z. X" Y
: k/ a3 X) I- v  _! @" x(4)选择时钟源。/ A5 S' U* s& V' c/ `; e
(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。8 V9 W+ g2 f5 A+ T8 x

6 P! V  `- z  f7 I  V$ H) n
3f65707eca104663a3dede6d25dfa961.png
3 f) K$ L, x& ]7 A

4 }0 R# k) [- S! ~  S; A) G(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
( K! |8 }" Y( Q  ^6 ^( S0 h
3 P* T2 i) K: G  h3 Y
72119b971f62410fa8344f7f9fb9f389.png * ?; g8 M# E+ Q2 J
+ ~4 b3 A. Z( z# t& J# @( a
2、配置GPIO控制LED
/ l" j+ x+ K  i$ J' c(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
" Z2 }: p3 i; C. rLED1——PC0
: W$ Z3 i4 F: L0 M* x  f' ~  `LED2——PC1
* g, m! ~' l6 l7 K! X) FLED3——PC2
9 d" `0 j/ W* ^2 a0 S: |LED4——PC3" |  Z6 M5 B7 u9 B6 D

' a3 Y. u" d: v(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
" ^3 x) f0 U5 }2 ~鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
, x3 S3 t" w6 `鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。. Q) |4 C- h( _
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式
, l& g* R% d! F5 j0 l- c' Q鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。) \$ {# z5 T  u0 Z1 h2 F. T" q

8 Z( L: V$ S4 m0 s$ l. H$ R* d
492907c1e71149819adbaee4516a2af4.png
% v* V7 Y& E# ?4 h( g/ O. J
* E3 f, D3 X5 o- }
c75d3f10ba2e427d9c1a10fad9bf5471.png 1 m4 g& ]# Y5 R% \

/ y1 q2 N. b/ t% D9 i7 ?(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。$ c1 o* M0 {9 K  G

4 H: S/ ^7 O$ u
38ff4b80e1c5495ba3076a5158fd91fa.png ) u- `; F3 }1 F: `4 F: d9 z6 X
, z' z% u' b7 x% B, k
​​3、配置PA9、PA10为串口5 J& J. i) k4 V, r$ m. d( W! ]" Y- I
查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:7 H7 s* y. d8 W! b. f$ M! x
. h8 h. N6 f7 J' z
497b8ee0243e446784e64a3c31e8a26f.png
, i7 w  A; e6 D' Y0 M2 p  R, @* t1 ^3 T- z2 d) ^
4 E9 m1 o+ b4 Q4 I3 ~' H
(1)序号1用来设置串口收发引脚的选择。% q1 [7 e' W5 W& d* C) }
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。# K' X4 D4 y; m0 m8 M

  T( U3 y3 a' ^! F8 B 4、配置ADC(单次转换模式)
. H/ U' E; H% n2 F+ k) y0 e& }(1)ADC简介:( D3 q& J2 I8 |: A" x' `
☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。
0 U* K0 B5 p/ w- m! E  L, ~/ l# ]. W+ I
☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
7 O6 g$ b% m2 l9 h! M! a+ p. L

$ a& @* G( x7 s☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。
/ [7 T$ F- G. f: l

/ J' \+ R3 X! D1 ](2)首先选择ADC1,开启通道99 E/ R" q5 e& F* k  ^: y# C' \: H
3 K- S1 S5 Z+ \0 k' r0 p. ^
f31d2998798b4294a5efa1cda1de7c31.png , |8 s8 c  Q! [( f7 b1 N
! H& F3 T9 |3 X* g7 q8 p8 [: t
(3) 进行ADC配置,这里保持默认即可。% U; b! b: T4 U0 a

$ |' m% a4 n6 |
01e7319ac29443dda07463a86cb4343e.png
* \* ?# |7 _$ f. W; p/ j9 p( |: r# V
(4) 配置ADC的转换规则,选择channel9
+ P) g: P* r& T2 J( C5 l  V3 i# Q3 C9 O3 ^* C' O) S8 J# J+ ]
7 Q  R7 C  H, c- k

# |% F' V  o& R( N9 @3 p' S& w% j3 {5、配置项目工程参数
  k7 D/ i$ w2 ~& S(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
& g# H0 [- s. o5 \% B. O6 q: g' a0 Z: G; G7 _/ l4 g& Z( R6 j
f3ecedd9323f4463b69539906b3c1199.png
0 r7 I- U2 `; g7 D+ T" R

5 q: f7 W6 G+ n) e& [2 ^(2)完成配置工程。5 i0 b- M- d" a/ ?6 b
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)& r2 f' v0 M" C2 p8 |  ^" c
/ F; R9 a1 X0 w  Z7 c* ^8 k9 m" ]
efdb616174f54925b6eac31109f227b5.png ( N7 E2 y3 Z- e4 [9 w6 t
​​
  A4 ]" ]( U8 t% v, d- V- z 41c3f2716e4e4eda8f62fa3a1d871322.png
8 p% n9 X, v+ r* R! c, Z(3)生成代码。
4 k0 f% O, w/ P+ G备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
  t, w6 s* P% N' Z
1 A2 ], M( I; K
8eaa7d0babea40ee93f158481a6ee471.png ( M6 h5 B4 R% H7 @. `& ~
7 ?, Y% \! a6 Z
(4)工程代码生成成功。
5 F* N" z4 K3 Z0 _' a0 O1 Y$ S. \; V8 J: n6 @
e8f46d59a1fb4af589feb613fdff17b4.png
& e4 A/ a, A! t7 n+ @/ ?0 V$ V, ~2 k9 U& r; m# L

; r1 H1 ]0 t6 K' j 三、在KEIL 5中编写代码
8 ~+ f/ i0 q6 ]: W" t% ^1、使用KEIL 5(MDK)打开项目工程文件+ Y1 l; k! S3 C( O/ ?# K+ s" G
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
2 ^4 F7 n+ |% U# v/ F(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
" B- N+ t- b' T! U$ q* K" z3 @7 c+ w/ S5 x
048bd5008312422bab9ef3bfe37d762e.png % A+ ], I' m% ]  B  M* ^' `

0 T0 T8 j+ J- J% E$ D2、添加ADC获取验证程序
& B# a! @: q/ _  s(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。" `9 a( Q; m1 f; n. L$ o
  u+ P' c' F* V4 c; l: a( \* }. z4 Q
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。1 z. Y3 h" B3 l$ Q1 g
5 \3 A5 o; f  D8 M& d
d1194af353cd4b0b88cd9208b1ac7db1.png
/ ^& o! f$ M6 o; H
1 i* z3 a! z% {% y; j  d 178a631ceb1b40769861cfa141087495.png ! ?" z( T3 Q& g
7 b1 l! Q( W. o$ R4 i% T
(2)在main.c 文件中添加ADC获取以及打印代码,如下所示:/ L. a0 M3 q4 o2 d; R- q

3 l# }$ Z, U- h  \3 R8 [
76308de291b64abbb6c092cd71e77e49.png
% _# U, x+ f( w$ Z6 k+ M8 d) j
( V+ M& T6 Q1 X$ ^5 ]2 B) I
  1. int main(void)
    & p9 l) M6 n; m$ g1 x
  2. {
    9 M: l9 Z4 k/ F6 U2 r
  3.     /* USER CODE BEGIN 1 */
    ; n. p% P) ]6 M  f6 w$ i: M
  4.     uint32_t ad_value=0;                    //初始化ADC获取值& h" a# g, b& N
  5.     /* USER CODE END 1 */8 y; K# J) p0 h! O9 X% ], G

  6. 8 z8 |- f/ q  H& k  `- h
  7.     /* MCU Configuration--------------------------------------------------------*/2 N7 Q1 H; U2 A5 p$ w9 {( c0 n* ~

  8. * a/ o% {) n* _- s$ ?( e
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    * s2 E1 ?* @: v+ P( R
  10.     HAL_Init();
    , k+ h7 F1 }* I, @3 s
  11. 3 o" H9 T; D5 f2 ]
  12.     /* USER CODE BEGIN Init */  r# l3 E8 R! v3 P6 D- j9 W

  13. ! ?, J1 E7 x% X' S! S# K/ O
  14.     /* USER CODE END Init */
    6 H- ~/ N% w, H( u! D, M& X! W
  15. 6 z- @8 j3 X1 u: Y" T4 r$ D
  16.     /* Configure the system clock */
      w; l2 d2 s3 |3 R( `) p2 {
  17.     SystemClock_Config();
    + c( i8 H. q6 B7 e" X! ]
  18. 0 C. Q+ q( ?: q* g% ?
  19.     /* USER CODE BEGIN SysInit */
    ; n! \' R# ^# i/ z$ I. }& {4 j

  20. - c' M+ ^- t+ B' `
  21.     /* USER CODE END SysInit */
    ! m, z2 d" M: E; P0 p( B
  22. % O% s  D8 z& t9 q
  23.     /* Initialize all configured peripherals */
    1 ~6 D- V' e6 c
  24.     MX_GPIO_Init();4 j0 @1 p) s2 k2 D9 O4 n
  25.     MX_USART1_UART_Init();
    : n6 ^8 C! h+ O2 t! w% ~
  26.     MX_ADC1_Init();7 w1 S) u4 c$ |! r
  27.     /* USER CODE BEGIN 2 */
    4 {( N4 d% ?; K4 B9 W* e
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);        //初始化默认点亮LED/ |! o3 e$ ?+ c1 z" A6 Y+ S0 T
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);        //初始化默认点亮LED6 U3 ~# i  \/ m8 m
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);        //初始化默认点亮LED
    + ^+ h* G9 \! ~- s7 G
  31.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);        //初始化默认点亮LED+ l* k6 B* {! J# O! [
  32.     /* USER CODE END 2 */8 r+ A4 Q& R3 f: \/ |" A: T: l& }

  33. 1 x5 H2 p- l5 T8 V
  34.     /* Infinite loop */. Y9 Z( F) c* N1 I$ w
  35.     /* USER CODE BEGIN WHILE */
    + F8 }( N  R2 C: b" Z
  36.     while (1)
    3 ~0 v3 t7 m* ^' \& R& ~
  37.     {
    . J/ P5 H! y0 C; U# X+ J9 n
  38.         /* USER CODE END WHILE */8 ]9 x3 U( u. \2 I. `8 o

  39. * P: C6 A+ |+ i  \' |% _% K/ P
  40.         /* USER CODE BEGIN 3 */
    ' t9 g6 Z2 G7 z6 L; j  |
  41.         HAL_Delay(500);: x* q) ~: g; u3 d2 ^3 G& n
  42.         HAL_ADC_Start(&hadc1);                      //启动ADC转换
    & s# w: S5 D, f# j# |
  43.         HAL_ADC_PollForConversion(&hadc1,0x10);     //等待转换完成
    0 G5 A) [3 y6 {
  44.         ad_value = HAL_ADC_GetValue(&hadc1);            //获取转换值. o! A  s# K( A( A5 m
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //反转LED灯
    5 s  ?# [  C; D( I9 m6 M
  46.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                //反转LED灯$ ]" T6 Y3 K, G+ Q
  47.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                //反转LED灯- }; w! j: ^9 ?* U% m+ F1 \
  48.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                //反转LED灯
    & R8 \3 S5 o- n& [7 [- w0 I
  49.         printf("hello world,this is adc value==%d\r\n",ad_value);   //printf ADC获取值
    0 T8 p2 h8 b4 R
  50.     }
    0 F& o! e6 x% I# ]- n# v1 A) Z
  51.     /* USER CODE END 3 */) t% I) Q; f. J) L
  52. }
复制代码
* p; l4 `6 G5 v4 A
3、设置编程仿真下载模式
, h, W) J- S9 Q' E1 E& n7 N(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。: A; X# b) g& D# ?2 B# L

/ t% j- E2 h6 V/ P+ [: h  ?' m
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
* z1 n0 a1 v6 S3 s& x9 I% P​​
$ N8 [  J; @# H% d" v: G(2)点击编译,完成后提示“0 error(s),0 warning(s)”。
% N( @! q: ^0 _2 ]. z- M1 ~! O# Z/ X! g6 m" b
e0b7e3e353b345a7987fe5f821de2dda.png 5 u! k! ~0 u% A4 W5 N  @6 F
​​
3 z# I1 g& h! r8 Z8 U: J; S(3)点击Download(或者快捷键F8),即可下载程序。2 C7 d/ \: H/ Z  [7 J

5 e2 t7 y; O; j- g3 M
eb3f250f19e44862a7df80c2492fcd01.png
  ?  q9 _) }- P# x6 L; j# G​​; r9 O  w* z5 Z
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。- J# m) G8 s7 C7 j% S% A/ ?/ s

8 a4 b8 C8 u+ z, g2 x3 b* n
9f8aa1a4e8f04041bcf5cb183facd100.png 7 v# ?3 [- Q7 z3 m  ?& b
​​0 i* U1 V0 d- U9 G' {5 f+ g$ F) \
4、ADC实验效果展示
6 |1 ]. ^! E# j; d        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。$ z% a& f" a. V/ Y. y0 h3 s  D- {9 `- a# A

# n; [1 v5 W: u5 W. j. u! k当PA4通过杜邦线短接到3.3V时,value约为4032,当PA4通过杜邦线短接到GND时,value值为0。  g# v- }8 `9 J' u% C5 i
3 S' z; F: a; F6 Y' `
0a4dbb1de86343a2bfd95b1ee2180da1.png
) r/ L# V9 j( x$ x. ^$ }
* ~: b% w2 x  `————————————————6 J. ~$ J8 A* L" @
版权声明:智能小屋ZYXC7 j- a7 A. ^  e0 S, ~6 c* s/ P3 c, B

. ~% p# m2 f) E- \1 O
" T9 l( L+ ^' x1 j9 m
5092b6c6ba3644239c3805164afda05b.png
收藏 评论0 发布时间:2023-1-13 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版