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

【实测教程】STM32L431之ADC实验

[复制链接]
STMCU小助手 发布时间:2023-1-13 19:00
一、开发板平台简介:# M; a( O: L; _9 |
1、开发板资源简介
: m, Z3 e% F* G( \
(1)开发板主芯片型号:STM32L431RCT6, E; i+ e# E; B+ P
(2)开发板主芯片封装:LQFP-64_10x10x05P
# I  f$ H$ X6 ?- n* j(3)开发板主芯片内核:ARM® Cortex®-M42 i4 E, |/ v8 O  k0 @; d, b6 E% ?
(4)开发板主芯片主频:80MHz0 a5 b3 S1 x! }& y" \) l
(5)开发板主芯片Flash大小:256KB
! t9 A/ g- `! x" ~; L(6)开发板主芯片RAM大小:64KB7 J& _  o; ]% ?5 G: _- i: r

% I$ {4 w9 S7 |/ N0 {7 k
bb91345227434ee7a43a34bf3fe366e6.png ( Q6 U  X3 C. j. O3 P5 U* _
5 T4 S" \- S) T) R# Z: G9 p- @; m# A
929c0cce04aa4115a8623703982bf3e1.png 2 n" `9 }# `9 p/ Y5 P
# O0 _% t8 D' `- e3 _" l
2、LED灯资源1 i$ Y1 B, t4 {( {( ^1 b7 C, r
(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
* B, s( U6 z% u" F6 C9 \  L$ e. W$ q) s% X
0f177691c5814f16a508bcfa747f87ac.png * N5 k- x+ ~- a9 `7 Y

& s1 q; v, c+ s/ _/ e) X3 x: G
3 D  _+ A& F: |& I
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
. H  h) F1 z9 k# V, E6 ?% W
  e- o5 Y( J0 y% j0 _
e923ad767b8448b7ac37c4ed693724bd.png
( m+ j9 @  o* b7 ]) I, _8 O- Y- j) Z/ }* n7 m0 S* o! A
​3、串口printf打印工作原理
6 t, M& u# D- }) D4 u* n 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。+ e* D- E2 y. z; c/ _# d' X( C* l
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。* K2 o! Z# ~, a! g
* N2 `$ c( ?3 W5 Z& a$ S5 w
     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。' B# M0 {( Q- g
) W. I* H7 P1 T) ?6 w8 `' f
TTL转CH340串口,硬件原理图如下所示:
- J! z/ p* H1 q
4 ~1 q7 r. h  j9 v
4df1b489cb944c26b55013001061675d.png 9 T: F2 N) @/ b+ Q

8 z1 R$ {4 |% J- I* l

, U) j, y- c' J7 |" [- Z7 \4、ADC简介:5 d3 v& o5 w$ I% O' m% e8 |4 Z
ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。
4 h1 a6 H0 s+ a4 e, _
$ y/ C" T$ n0 ]STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。: ?/ `  D' H7 {& v# R* X( A6 {
$ Y' n% Z1 X+ K3 A  h; g
STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。. C: b% x) L0 a7 j
4 X& r; ^* V# J5 B/ f
3 i3 h8 |$ Z( B4 y  u! s, M6 m& b1 v
  二、ADC实验过程* W& E( q5 e2 Q8 P  O
1、新建STM32CubeMX基础工程

( H! e2 X* l2 u3 p(1)打开STM32CubeMX,点击“File”-->"New Project"
* W: V- b' m" x/ {
, K( i% I5 i/ b+ ~8 D
2399170347904e959c855fefd5877f84.png # s. u1 L' M" U. W; d+ ^+ `0 y' C

6 u2 B" v+ _& |  N% k, A(2)等待打开主芯片选项界面(大约1分钟时间)。$ N% B  q: F4 i1 Y
8 ~' X& R% V& W; a* o- L6 m
d74d2fdc60c9440483e2b7cf8d928e7f.png
) g- T3 g7 u% Z& r! B/ c; c8 h, B- h* N7 u  a
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
! D8 n( v' D5 ~0 y
1 ^. s0 {& X- S3 J4 b! u/ \
7b80345238d74bea82ce70e1a348f7b4.png 4 R! x6 X4 t9 L* Q% O

9 g# Z: g7 `0 U( y3 [* g(4)选择时钟源。) q$ R( a' ]! [2 k, F% y
(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
# a( I* E3 g# u9 S6 i% j$ M4 S, N$ U( x8 m
3f65707eca104663a3dede6d25dfa961.png
3 q0 \( q' t4 f8 D$ ?
2 r. [9 {. Q0 j+ }* I  H+ `$ C4 y
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
2 G. p) U# @% C
' W) ?( j' ^  y1 q
72119b971f62410fa8344f7f9fb9f389.png 7 M' P3 q' R1 o' e

! B- `0 ^: I# m+ `3 R2、配置GPIO控制LED
, a1 K. F* C) p+ g$ j2 b+ |(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:# `2 b6 Y. A* x+ k  P( w+ S
LED1——PC0
: B* F- e4 {: XLED2——PC1
* M7 q: N$ E4 i% NLED3——PC2$ ^" l; C, ?# r( d( Q
LED4——PC3
" v, z: x# g/ l' k3 H$ j& t% J7 h( w6 h! N9 B
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
5 l$ W( @. f1 c1 p( z鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。4 U# r8 W8 U4 D3 G1 Q
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。0 R" ]8 `  D1 P
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式; V' f7 }- T' h* Z: Q1 ~$ ~
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
" b9 c7 i, W! H6 y( R3 A( {! v# S' }8 R- ^
492907c1e71149819adbaee4516a2af4.png + P- g. n( T% i- \
6 m% B; o6 G# \  w6 A" M0 I- Z
c75d3f10ba2e427d9c1a10fad9bf5471.png 5 P% \& I9 T9 ~1 S
' l  N4 Q2 }- g! o
(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。/ q9 K( }% C0 }) ?0 E( o

; H" P1 N; N! w# [
38ff4b80e1c5495ba3076a5158fd91fa.png
$ h; Z% D! G7 p" A! O# \: j) D3 u5 f/ A  Q% B1 T) ^0 J0 O
​​3、配置PA9、PA10为串口- G; E! ~8 m" k/ Y
查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:6 a& F6 @5 l0 N+ ~7 f4 ]$ p4 f) g

# h' s8 K( z* P8 S5 L& M* N( V
497b8ee0243e446784e64a3c31e8a26f.png 9 T; T' {  h- h/ k* x; a3 P2 j/ x' ?5 w, f

4 r" [  O" A" x# `' z: b1 Z8 N

% H7 ]8 }' j4 `$ E- } (1)序号1用来设置串口收发引脚的选择。$ P9 `: F/ h, t
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
5 E, ?. q1 i9 Q( H# L2 P3 b7 ~, {7 F
4、配置ADC(单次转换模式)
* S2 @( U' K6 ]3 f$ H! p(1)ADC简介:
& O  P) G8 O6 V8 `2 R0 t# w, E☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。
5 R# r5 \5 k* R( R) d/ V& q
0 M: M- H# d4 ~8 y& Q☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
: Z4 N6 f& _# a
$ k* ~! y# V4 X' u+ W
☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。
9 o: p5 }/ i. ~9 D& w

2 |/ \- A8 R. r' m; L; z5 \0 I(2)首先选择ADC1,开启通道9
# _6 k& g" _' i+ I0 q! ~  d
9 s" D0 E% [% Z- P4 f
f31d2998798b4294a5efa1cda1de7c31.png
) N; d# K# b. V# z* O9 o5 P
% p4 c% N+ K7 ]3 k& f; @2 N4 H/ g" W
(3) 进行ADC配置,这里保持默认即可。: G: u: E9 e! U- q9 X, D; Q( u2 c

/ b( p8 E' `% g3 E. ]! }5 D
01e7319ac29443dda07463a86cb4343e.png ( z- J% e- E2 j0 G

* h0 b, t, i3 U+ z7 L(4) 配置ADC的转换规则,选择channel9
1 }4 r6 @/ k+ x1 X/ J! I# E1 x& d# R+ [6 h$ |

5 {, e; X2 [$ h2 p- j) B% T3 @; ^' K. n$ S1 ?; |
5、配置项目工程参数. e: s0 s% Z3 f& V% ^2 K
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。: T0 x  ?: D- w/ B' L& n

: @2 X4 S4 v. n6 ?7 _/ _
f3ecedd9323f4463b69539906b3c1199.png
! E" o( }8 F6 p$ x. m

. x  L* {( i0 ^# X( a: v5 W(2)完成配置工程。
  o, ~+ Y3 k7 v备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)* [5 N0 {+ ]! C5 ?

* m7 n( ^* s4 ]
efdb616174f54925b6eac31109f227b5.png
0 t0 r3 W- R- S* ^​​8 g$ o6 z& L% J
41c3f2716e4e4eda8f62fa3a1d871322.png 5 W- ?1 v/ Y; d  R% O+ c* A& T' {- g
(3)生成代码。
0 C6 Y$ W) h: ]# S4 m: d5 t6 [备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
9 m8 g. c$ k& l. U; t* K5 t2 L3 ]3 `1 Y- _3 r: v* i  \! A
8eaa7d0babea40ee93f158481a6ee471.png & v/ w# i! h' U& D6 ~
% ~' O4 j, E; h6 {' j
(4)工程代码生成成功。
; R' y/ M: W& ]1 o6 o2 W" A  N- i4 L
e8f46d59a1fb4af589feb613fdff17b4.png ; F7 |3 \; v# W& C2 O
2 n6 `" j5 ]6 r: ?' `2 |. s

" v4 V: ~+ G# ]* c 三、在KEIL 5中编写代码- k. q& C8 m# C$ p( k- Z
1、使用KEIL 5(MDK)打开项目工程文件
. R% I- E9 Z% S! d源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
) F9 b* l. c6 Y6 G0 Y' h! \( @  {(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
) W8 h% O$ ~4 U7 [! S+ J- d: f+ }3 ?: @; m
048bd5008312422bab9ef3bfe37d762e.png
- A( X3 S! B, W

5 d' L# n1 e/ B' k' y2、添加ADC获取验证程序; m1 Z* d, L( Y  {' s( m
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。- j% q! K' `. F* d: y  Z0 n, m8 |8 Q

' D1 I9 H, K2 s+ s备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。; v6 q2 L. U5 b

8 ^1 [9 z( Y5 B8 i
d1194af353cd4b0b88cd9208b1ac7db1.png
$ G0 U' b3 l' {0 Q* K: R3 m+ u# C; A
178a631ceb1b40769861cfa141087495.png
9 m+ ?: a0 d: {- j
+ E* G7 T, P  v& K(2)在main.c 文件中添加ADC获取以及打印代码,如下所示:$ e6 E  L7 N2 g

: F8 E# \1 l! U3 d: k8 ~" A
76308de291b64abbb6c092cd71e77e49.png
# c$ X# S* a4 [! \5 {$ o9 v8 A. {( }+ m  \. d7 D- f
  1. int main(void)
    8 y; C' }3 _) r( G" R  ?
  2. {
    0 v. q+ h/ w3 e" {
  3.     /* USER CODE BEGIN 1 */3 F7 U' E2 [. z! D, {4 N4 \
  4.     uint32_t ad_value=0;                    //初始化ADC获取值
    ; [/ ~; Z/ u! u) h$ \: n) S1 i
  5.     /* USER CODE END 1 */1 e% y$ k) A# S9 v
  6. # q' d+ }7 H" o+ |9 c' t/ ?5 ]7 i) M
  7.     /* MCU Configuration--------------------------------------------------------*/& e3 V& E" S' S7 n" s+ h/ i3 {

  8. " o+ w" g# d) r' L4 q
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */" K( |1 Y4 Z7 i: e8 X5 H2 C' {
  10.     HAL_Init();0 F. Z4 w/ w/ B( t" p' z3 d

  11. 4 e1 H, t' U- w+ q" a
  12.     /* USER CODE BEGIN Init */& V# o: |/ s4 S/ A

  13. 1 w7 T* O9 o/ e. t: w! [2 Y
  14.     /* USER CODE END Init */
    1 D' C; L; X3 F2 g& a/ H$ ~0 i
  15. 6 T% v6 c- b2 h
  16.     /* Configure the system clock */2 U! V) H7 |- B, w( V# ^
  17.     SystemClock_Config();+ z7 d6 D  f8 \) @6 [' H+ W1 [

  18. ( `+ E9 G0 d4 P, _1 }
  19.     /* USER CODE BEGIN SysInit */
    5 m& X" F# |- D% w# b* @9 y
  20. , J: u7 S5 G  U* C
  21.     /* USER CODE END SysInit */
    % j# V$ ^" f* y# ]9 P. \0 E
  22. 7 O) n" P# i* S8 N$ ?4 ^) A
  23.     /* Initialize all configured peripherals */
    6 D+ b$ ]2 Q& y
  24.     MX_GPIO_Init();" W$ @) q# S5 i, i
  25.     MX_USART1_UART_Init();
    # D0 p$ f3 V% L
  26.     MX_ADC1_Init();2 }  ]7 B$ V9 \& [! q9 v
  27.     /* USER CODE BEGIN 2 */
    # D2 K1 R' e' G) o9 b3 H# S/ e9 k  `
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);        //初始化默认点亮LED' M8 J# l& x& q, ?2 y
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);        //初始化默认点亮LED7 f; I# S( C' V% T
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);        //初始化默认点亮LED8 o3 {0 o9 V: e. V9 k+ {0 @
  31.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);        //初始化默认点亮LED
    % G3 T9 M9 o1 V# I# R( C
  32.     /* USER CODE END 2 */
      f* }. v; x' n+ H2 D' |
  33. / D4 A/ Q0 @, U+ m' x: P+ n
  34.     /* Infinite loop */8 m7 {0 t. P5 Z  o; d+ {5 y0 P' P
  35.     /* USER CODE BEGIN WHILE *// C, m9 H0 }/ |
  36.     while (1)
    5 f+ E2 {+ N2 w! A- P/ B4 {
  37.     {
    * g) p  b% u+ s: B
  38.         /* USER CODE END WHILE */8 \. N  ~9 W* Z- c/ N# [

  39. ) }5 |7 T" w2 M- P( ?
  40.         /* USER CODE BEGIN 3 */
    9 @  D. J6 x7 V) z0 {, X
  41.         HAL_Delay(500);
    - X; U6 B0 @7 {; v0 ?/ |
  42.         HAL_ADC_Start(&hadc1);                      //启动ADC转换
    . G7 n" ?& t* l
  43.         HAL_ADC_PollForConversion(&hadc1,0x10);     //等待转换完成
    . [9 U: b' q6 E2 r' V; J' w, [, e
  44.         ad_value = HAL_ADC_GetValue(&hadc1);            //获取转换值* ?$ i; S- g4 P' L! Y3 C$ ^9 `* t
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //反转LED灯  X3 s. i5 _8 L4 F; d( a
  46.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                //反转LED灯* F" B% b$ U5 G# U* k5 L
  47.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                //反转LED灯; O& j8 R% K0 P3 E
  48.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                //反转LED灯, A- @* s/ ~9 S1 W
  49.         printf("hello world,this is adc value==%d\r\n",ad_value);   //printf ADC获取值) u8 I2 l% y" A# x0 n# t0 a% ~
  50.     }
    * I6 M8 C2 W8 S9 t3 L
  51.     /* USER CODE END 3 */
    . h$ Z2 X8 ?0 v* j5 v+ u9 F
  52. }
复制代码

  k, i+ c6 c9 \! y& \& F3、设置编程仿真下载模式2 h$ f& [) X8 W2 A: B
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
) I) _2 r6 c6 U' [- W1 m+ A5 z
. ]4 |9 T/ |5 H; G. U1 B
edefb6b9a2a14be3b1221ad6d5c7a8a2.png ) m0 n% ]1 \5 r0 c; I+ E3 _
​​4 l2 N5 t. |  }/ f" t* ]
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。# G  n1 F, f. X6 R; I8 J' M% `
- I, T- A6 F# k) J0 |0 C' s( b$ Q
e0b7e3e353b345a7987fe5f821de2dda.png 8 l7 q5 i. }+ R  m) q3 o
​​" Z$ }2 a+ [$ i  Q# N
(3)点击Download(或者快捷键F8),即可下载程序。! R( }; I1 d1 d8 R

) ]$ c, X. f! y8 w3 E0 O
eb3f250f19e44862a7df80c2492fcd01.png ! d  f; k5 W. j: R2 C
​​
$ Y6 }- `" T. R  j+ b(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
6 v/ y, |" g& r: |; C5 ?* R/ ^) \; O) \+ P
9f8aa1a4e8f04041bcf5cb183facd100.png
9 u, b% V! M2 A) N  H ​​& U6 E/ s  J" g, Z; {
4、ADC实验效果展示
1 L! [( N# D- p4 z8 \        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。4 _6 @* ], P- J* F7 V  g( B
8 B5 N' C/ a% |0 l0 m
当PA4通过杜邦线短接到3.3V时,value约为4032,当PA4通过杜邦线短接到GND时,value值为0。# }$ o+ t1 w! T3 ~

  o  ?+ b# e2 L: @+ N8 D 0a4dbb1de86343a2bfd95b1ee2180da1.png ! s& \) ^1 v% f( e) I8 R8 c
4 }9 e2 x9 V$ g& I; E% t& a# b
————————————————
  d( i; C: S$ ?* p5 ~1 j9 ], B版权声明:智能小屋ZYXC: d) X0 G5 C2 j" y' o
5 H- I7 f; P) Y4 c8 M' g
0 W; D' l0 T- B$ U9 Z* s4 G4 _
5092b6c6ba3644239c3805164afda05b.png
收藏 评论0 发布时间:2023-1-13 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

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