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

【实测教程】STM32L431之ADC实验

[复制链接]
STMCU小助手 发布时间:2023-1-13 19:00
一、开发板平台简介:
" d+ B4 s' ~+ M* l) e1、开发板资源简介

; S2 m0 Z+ D+ l; |$ O(1)开发板主芯片型号:STM32L431RCT6
3 D* ~. v" W& T7 j8 C: f9 v: @% ~(2)开发板主芯片封装:LQFP-64_10x10x05P* |3 L8 L# f" T' d- v
(3)开发板主芯片内核:ARM® Cortex®-M4
1 L' d  ^( {" J8 }6 u! |3 n(4)开发板主芯片主频:80MHz
/ c/ E  g0 p; F3 {- d(5)开发板主芯片Flash大小:256KB
" K  F  @& ^& R(6)开发板主芯片RAM大小:64KB
7 @3 z3 f- O* h% T6 u, O/ v- o9 ~& C9 M5 u
bb91345227434ee7a43a34bf3fe366e6.png ) u1 ]! A0 [% J

* t0 t6 z- _5 U% m" Y% d: i
929c0cce04aa4115a8623703982bf3e1.png
( O* x, ]7 ]* h. v( X
$ F) j/ }' s" g
2、LED灯资源
+ U& z3 x8 P6 [4 t6 L(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
9 `% ^# E# q& P) B( l3 }$ A" i; v2 c4 O+ q
0f177691c5814f16a508bcfa747f87ac.png
' p; e% d" d+ b( y2 L; O0 e
* d& h0 g: V4 M( Z; I3 b+ w/ K

& y1 }- A, c9 f, S* ?3 X) M(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
2 ~0 a: x  t' j% F/ i$ H
( F  O# W% q: r
e923ad767b8448b7ac37c4ed693724bd.png
& M9 X% I$ _1 h4 [8 N4 A3 D: d8 M) T$ J: b" ?3 z
​3、串口printf打印工作原理
8 ~* A4 H' P" Y# G- C# T+ H 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。
& v3 ^* i$ D& }$ x     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。/ r1 x" {1 J* P" c5 r
% f3 G1 a3 j$ b' R
     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。
9 a/ F9 A. [) h
+ w9 B. u# a6 X
TTL转CH340串口,硬件原理图如下所示:
" d/ }/ T1 U( l0 c: f6 T4 l
+ q, Z1 ^8 |2 a' \7 Z. X2 Q
4df1b489cb944c26b55013001061675d.png
8 \+ r7 D8 q9 I  ]1 X. N8 Z0 \' j& }/ Z4 H; V9 d9 {

6 O  w& X7 u8 A' q: N& h. k, t4、ADC简介:/ C* R9 c! e% p7 U4 G$ k
ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。- R9 U0 S+ W. b( M
0 |9 ~- K7 E# M! y7 E4 Y/ B
STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
1 o, s/ j( Z3 W; W( e
/ h! ?$ I) x/ Z! o/ JSTM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。9 ~+ f# |! a: w& u7 W2 G
; D* {/ N6 C' L+ b0 S  L; y& e
' F# \$ R3 C2 @7 J+ j
  二、ADC实验过程
6 D! V! f/ a# }1 ~1、新建STM32CubeMX基础工程
( @0 b$ I0 E1 ]$ g  R3 I+ N
(1)打开STM32CubeMX,点击“File”-->"New Project"3 w9 j( d  W" [& C2 D6 \2 U7 _

! _) F; n* K3 c3 z$ p3 X
2399170347904e959c855fefd5877f84.png
, F( \" `* m" `' Q% z+ C* S) h- s4 S/ M# ^8 M( H
(2)等待打开主芯片选项界面(大约1分钟时间)。2 Y* Q. e9 I. i$ l# Y
2 L6 p5 m( _: z1 G5 Q2 ^
d74d2fdc60c9440483e2b7cf8d928e7f.png & I/ X7 o2 Z, D0 I
: p0 [, a  g( z1 Q6 ~! K1 I7 A% }
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
( x+ U0 `1 q9 r2 Y+ u7 ?: Z) l. n7 `% G1 R, \
7b80345238d74bea82ce70e1a348f7b4.png . K! |6 B0 h% I, T! n
2 P. Q. y. U8 k: a! b5 l
(4)选择时钟源。
; Q  Q3 y8 ?! Z$ ^1 C" O/ O(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。% X& Z/ z3 e+ D+ c, |* m
# Q9 l9 J+ q) o# J, L4 t3 g' }
3f65707eca104663a3dede6d25dfa961.png
/ f+ C. c9 K* _8 y7 A5 Y( Q
$ Q1 _. G1 z6 `
(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。( A' J0 s# N. H# Y4 A

$ {4 x$ R- W! F+ I
72119b971f62410fa8344f7f9fb9f389.png
1 ?. u  x. |1 ?' N
4 ~7 U3 e( I7 N2、配置GPIO控制LED
: P# Q  f3 L# x(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
4 C% l1 \/ J8 Q; ]; P" HLED1——PC0
& T% y, u' A% yLED2——PC1
9 N# C8 a; X- x$ b3 R. V1 aLED3——PC27 z) r, k/ B5 @8 R
LED4——PC3% B4 p: T, J% O2 H2 f
" @+ ^* ~1 X6 |6 X2 q" J( _# t
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。& ~) x( q3 A  U: g
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
9 _* J% G; w9 f$ F, c2 v% y鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
$ b5 h* Y! y  J( ?( p" H鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式0 Q1 P: E  m: r6 n7 Z7 H7 M- ^& E* @$ L
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
+ c4 D" Q% I' ]7 V# \
7 J' I* P- q% x2 P
492907c1e71149819adbaee4516a2af4.png
( P' x( I9 I5 q
) ?! U6 B& E1 O
c75d3f10ba2e427d9c1a10fad9bf5471.png
7 z5 F# o/ c1 K" r. I8 s

5 {2 `# R9 b5 H% m(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。& o, ~1 A( G; D" K

* ^1 ?! T$ t( S
38ff4b80e1c5495ba3076a5158fd91fa.png
0 }' P$ ^& A2 u$ L
  d! Y) W& {1 @: ]* i( S4 x/ O​​3、配置PA9、PA10为串口
( w7 B% s- z$ J查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:
5 }2 U7 F5 j% \2 i: R4 k; d
+ F% r( J: g+ j8 r$ s4 r5 ~; ]
497b8ee0243e446784e64a3c31e8a26f.png 7 n7 K& h, l9 m9 r( N7 S8 {

) q, f: O9 T( k7 r' ~' l
/ \4 |. r5 @5 w: w
(1)序号1用来设置串口收发引脚的选择。% q: g' G9 m; j" n
(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
* G2 V) D. U& w/ s9 Y$ x& z/ U, Q& b$ o: I* R( P0 O. @" V2 x# j: Q3 y5 p
4、配置ADC(单次转换模式)5 T8 N: e" ^8 J2 B+ b9 ^; @; C
(1)ADC简介:! F! e% o. R# Z0 q. d+ f
☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。& Y; y5 T4 A6 ]" ~5 {0 e. C
: `' ~& L' A/ g5 i2 ?7 i( T
☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。/ T( E: |; I! `
1 G7 |/ W1 S( i
☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。
9 r( Y: Z  h3 I
: V% h% s  V: ?
(2)首先选择ADC1,开启通道9
6 O2 R/ w2 M! ]' P8 ~3 X: k4 L( T% K( F
f31d2998798b4294a5efa1cda1de7c31.png
+ h/ X& Y/ \, L- u" J
+ [/ k( L3 |$ S/ n
(3) 进行ADC配置,这里保持默认即可。
' B  H- y  u8 \( E$ }4 ^5 V! ?! `! y' e: a
01e7319ac29443dda07463a86cb4343e.png
+ w; W" l9 [' e7 P6 ?; L3 U) r7 w& Y# S" E% D6 l$ ]
(4) 配置ADC的转换规则,选择channel9
) U' W( ?1 y7 |+ D1 R' C" i$ Q- F9 X& @# V( `9 W

1 g( u) H% O5 C6 ~) @( c
/ A; W' J! i5 T& R5、配置项目工程参数8 b! \8 a0 @9 j  R* ?: \
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。- f$ Y0 m4 a* h- K

9 S( g6 \5 d. a1 c. l' r
f3ecedd9323f4463b69539906b3c1199.png " R( T: w5 b4 F3 A# Y
% M: Y# A8 N2 _: p6 ?
(2)完成配置工程。& e9 A, q" _& e& \; L
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)0 A+ z- e' d8 ~: K

. v) E; l) i- |0 ~9 _2 U; g9 r
efdb616174f54925b6eac31109f227b5.png 5 c3 g7 ?" D9 h( B$ G: u* K" U3 C
​​: ]+ {$ c- `* g( D! j' M
41c3f2716e4e4eda8f62fa3a1d871322.png
3 r+ i9 e+ P9 W' w7 A" x& n(3)生成代码。
7 W2 l7 W, E) d; ^备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
) [) J0 V0 j* F; k) d
8 F) i7 g0 B" O0 ?" J2 n) q: i
8eaa7d0babea40ee93f158481a6ee471.png ! n8 _' o1 d7 ~; O$ B" Q1 n& D
; ^: V  d$ M. ?, v; J* z  Z
(4)工程代码生成成功。
3 q/ h: X  {- ?6 s1 s0 l/ L! ?" ]; J6 L1 |7 p1 U, @- M$ j6 I6 C* ]  ^8 B! b
e8f46d59a1fb4af589feb613fdff17b4.png   C" t4 y1 E, ^4 q% |. B

6 Y* M, _; i( D
! N, t8 e/ |5 Y0 }# b 三、在KEIL 5中编写代码* R. k4 D* ~0 a, N+ n- m/ p
1、使用KEIL 5(MDK)打开项目工程文件
4 i  m8 O7 a& ^, r源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。& V' D% W# `0 W, _) [, m5 e1 B
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
& A1 G6 i  D- s8 E( G2 K/ I* ?- {9 I5 H" u! s/ E0 [
048bd5008312422bab9ef3bfe37d762e.png 2 }1 Z" O8 U. Q
* v8 d$ y. n& f5 k& o! h# C
2、添加ADC获取验证程序; {" t  W: W8 t; a& @) _& u
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。
- S: e2 G6 k3 @, K
/ m6 l  n- P8 T! l备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
  Z+ ?8 G, l6 o$ {, V" H
0 @2 r" v& r2 p( m- D7 g
d1194af353cd4b0b88cd9208b1ac7db1.png 6 W# k- S" @! N$ t- s/ M* [

, j! F: k4 u8 T  F2 w. [ 178a631ceb1b40769861cfa141087495.png 4 ?# w9 D9 h- ^  T
+ ]4 g! f8 ]2 j2 `! V: t6 x( ]
(2)在main.c 文件中添加ADC获取以及打印代码,如下所示:
- C% X3 M& z& L9 \. h! w# ]- A+ h
: N, E3 v8 B# ]8 Q3 _; ]
76308de291b64abbb6c092cd71e77e49.png
! R, _9 n( J4 c' `; }, v: l  h, w0 i. L+ g
  1. int main(void)
    ' J' M! @. [( h* D
  2. {$ r: b# C) m2 O- a1 b3 C& v6 X
  3.     /* USER CODE BEGIN 1 */1 n+ J, _1 J4 Z5 P: Z/ L
  4.     uint32_t ad_value=0;                    //初始化ADC获取值4 h0 J0 B6 q1 X2 T5 }' x
  5.     /* USER CODE END 1 */
      M9 U' J+ i) x* w! k3 d, w: u

  6. 5 Q8 p# O% c0 E& ?) d' ]5 L
  7.     /* MCU Configuration--------------------------------------------------------*/
    / z4 s- ?1 Q. ?/ c8 D  a
  8. % [8 \5 L, t9 ]% a9 X8 g
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */. H' U+ w1 o* T7 \; H) i3 y- ^
  10.     HAL_Init();
    6 N' f; S9 R& Z  {0 C4 }
  11. 3 G7 X$ H! F# q' I6 Z  u7 N
  12.     /* USER CODE BEGIN Init */
    3 R2 V+ p" \4 p* T! ?% X
  13.   K9 w7 Z% Z* P8 o/ r
  14.     /* USER CODE END Init */
    ' |/ ]- g7 m+ p8 B

  15. 9 W7 A  k+ n5 c$ F: U* g
  16.     /* Configure the system clock */
    ! L$ }, Y% @  r% u0 ]
  17.     SystemClock_Config();
    ) U- H' f8 |6 o; q# K# P: b
  18. 0 Y/ W7 S$ G9 X6 e
  19.     /* USER CODE BEGIN SysInit */
    . k  P) O0 X8 I  f
  20. $ L4 c$ G6 e* b- e5 H7 E6 Q
  21.     /* USER CODE END SysInit */
    + p% x/ P0 x6 y

  22.   _, s8 K  q' M2 h) _4 A4 d
  23.     /* Initialize all configured peripherals */- v/ H$ I% v' F
  24.     MX_GPIO_Init();
    0 E" ?/ o: z- D" s* M
  25.     MX_USART1_UART_Init();
    " b3 z+ L2 K& q+ M
  26.     MX_ADC1_Init();
    0 z9 T- F1 y. d
  27.     /* USER CODE BEGIN 2 */
    , z0 }/ V% B9 g+ e' _+ u
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);        //初始化默认点亮LED
    ! L3 U5 k/ t- ]3 @1 y7 A0 ^; |6 @
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);        //初始化默认点亮LED6 g: L3 h+ w: T" y" {! Q0 R
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);        //初始化默认点亮LED8 J. U. J8 _  _* L
  31.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);        //初始化默认点亮LED1 U/ S0 b+ T/ X$ g7 q( M
  32.     /* USER CODE END 2 */
    - A3 {; H! n8 [. o9 S
  33. + j+ Y& G) M0 x+ ~/ a
  34.     /* Infinite loop */
    2 Q  f+ c  k3 X9 [6 x$ ~
  35.     /* USER CODE BEGIN WHILE */9 [: {( {6 F% W, y3 {5 K
  36.     while (1)
    8 R8 P1 l0 _/ p  b  R) W
  37.     {
    ; ?, n! w& O" }# E8 a% Q% w0 L6 d" n, |
  38.         /* USER CODE END WHILE */
      {8 N. O, g  T: k$ q, v) D  x

  39. 0 y& s1 g* d" F7 w
  40.         /* USER CODE BEGIN 3 */
    7 v" a, c4 a' X/ V. Y9 @
  41.         HAL_Delay(500);
    $ c" }: r8 U: D
  42.         HAL_ADC_Start(&hadc1);                      //启动ADC转换+ `$ ~# A6 ?% J% o$ P
  43.         HAL_ADC_PollForConversion(&hadc1,0x10);     //等待转换完成; G" Q( @1 K& R7 _
  44.         ad_value = HAL_ADC_GetValue(&hadc1);            //获取转换值0 {! R+ I3 I; Y3 q* e' m
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //反转LED灯
    9 G9 b7 \* X" {2 G+ D$ ~6 j
  46.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                //反转LED灯
    4 E( O1 y5 u6 g3 f8 N" y
  47.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                //反转LED灯. X/ k9 q. \7 @) Q: l
  48.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                //反转LED灯7 A& r# }1 M$ W4 {
  49.         printf("hello world,this is adc value==%d\r\n",ad_value);   //printf ADC获取值
    ' }, G5 i. b$ v% f
  50.     }
    " M9 B: b8 G& ?+ P; a
  51.     /* USER CODE END 3 */5 O; G  Q: _3 R9 {1 r- o
  52. }
复制代码

6 X- w: G9 [; p3 O3、设置编程仿真下载模式6 j- e) R6 F% `3 |; U/ k" a
(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
' X7 z4 |. r1 {3 I. g# ~
; d+ {; z  |! S3 l7 s
edefb6b9a2a14be3b1221ad6d5c7a8a2.png ( P( W4 a! c$ Y) N( H4 [7 d/ S
​​9 s$ k; i8 ?3 E- k
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。
. R, w. {6 N" u+ ^- ?4 t' C+ j% E0 ?4 m* }3 \' K# i8 c
e0b7e3e353b345a7987fe5f821de2dda.png " i, I2 G% T1 [6 v) c
​​
/ N" p- K1 Z7 e1 q' d5 [(3)点击Download(或者快捷键F8),即可下载程序。. O- E% n$ E" T# ^
4 [' a7 ]* M+ W2 q$ |% H
eb3f250f19e44862a7df80c2492fcd01.png 1 `2 ^+ g1 \) j: ?6 O8 x
​​
4 g" q" |, |9 i; s! \6 X(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
. T  v% m1 |, ?( H* c3 \* f4 {8 j8 g! T. l. H& L! U
9f8aa1a4e8f04041bcf5cb183facd100.png
0 T; w, h& U* b& m7 Q5 s ​​
% Q) b' _- R. q7 ?3 D: u+ ^' W4、ADC实验效果展示- X) w6 [5 R! ?; f) @, `6 d6 [
        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。5 R1 Y# Q2 U6 T3 J

- s2 G& `" Y8 M6 h+ n- q当PA4通过杜邦线短接到3.3V时,value约为4032,当PA4通过杜邦线短接到GND时,value值为0。
, V$ H' a$ _$ ]4 A9 w5 a1 V5 @1 D( o/ b0 }8 J, g0 U: d
0a4dbb1de86343a2bfd95b1ee2180da1.png
) V' j9 K$ m! n# j# S5 g4 F/ v8 q: P! p: G- z7 u. Y# Z8 @. n( U
————————————————
3 o  }5 X2 Y" d& P/ `版权声明:智能小屋ZYXC- M, n) I1 z. q; |- {+ d; Z# f
& q- ^* s* S3 L; u
9 H. v7 [5 ?4 |+ A; }5 w. n# I
5092b6c6ba3644239c3805164afda05b.png
收藏 评论0 发布时间:2023-1-13 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

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