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

【实测教程】STM32L431之ADC实验

[复制链接]
STMCU小助手 发布时间:2023-1-13 19:00
一、开发板平台简介:1 C$ C* Q. |5 _+ y3 L3 G. t4 H, r
1、开发板资源简介
" {# z8 n" L- E/ z9 _. N* |: O
(1)开发板主芯片型号:STM32L431RCT6; e1 S  d: a5 m; i) A. I
(2)开发板主芯片封装:LQFP-64_10x10x05P
9 e* H" {# ?% o2 c& a(3)开发板主芯片内核:ARM® Cortex®-M4
" g8 [' n6 U( u+ m4 L' D+ ~& L. A(4)开发板主芯片主频:80MHz
, ~. v. U9 v9 e) V(5)开发板主芯片Flash大小:256KB. r# S$ p' C6 _/ l
(6)开发板主芯片RAM大小:64KB
& A' X8 {& G6 L) f0 N. }. w* f, P* @3 l# D6 s( b7 ]! h
bb91345227434ee7a43a34bf3fe366e6.png
$ H( \0 y* k8 [" E. _' A, C7 Y5 X
3 R6 A1 C0 J: U1 k) y/ O( T
929c0cce04aa4115a8623703982bf3e1.png ( ]# g+ T6 P* A' R: }. L! k" v

, i8 ?, o" v8 u$ o2、LED灯资源
' {! y7 h1 [$ G5 }(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
" D$ t9 i8 C. n& ^
- [* W5 S' c: u7 ~4 x4 c
0f177691c5814f16a508bcfa747f87ac.png 8 Y8 P# [$ v, o. I+ F

! M, t/ f2 K7 w7 L

3 J9 _/ e5 \& D, {. b* q8 \(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
  q# d$ z: {  k2 u5 S+ V! x: d# e; E+ S
e923ad767b8448b7ac37c4ed693724bd.png
( p: T0 o. ^4 P) N+ V' t8 j- Z5 i- s, o9 s. w  l. t3 K
​3、串口printf打印工作原理5 v5 n$ F4 c8 v7 z
 串口全称为串行通讯接口,即数据在通信线上一次传输一位,按先后一定顺序传输。我们通常所说的单片机串口准确来说应该是串行异步收发传输器(Universal Asynchronous Receiver/Transmitter,UART),使用TTL电平,串口需要RXD、TXD、GND三根线进行通信。2 {: p1 b* w9 C- Y! ]& [+ N
     (1)我们选用的STM32L431RCT6开发板串口1已通过USB转TLL串口芯片CH340G引出,使用时,只需要用公对公USB线连接电脑即可(注意也得需要安装CH340G驱动),后期验证试验也可使用该串口作为debug串口。$ A! Q& a" ^) Z) C: Q3 J

- \+ Y* K, ?. r5 u     (2)开发板上的其他串口已通过排针引出,为TTL电平,通信的时候需要注意选择对应的电平模块,如USB转TTL串口模块等。( N* Z! S( {& q3 [4 z

: j) D9 x% r8 }" X# B! T8 n; zTTL转CH340串口,硬件原理图如下所示:$ T2 b" B7 [1 A! _3 _1 X  D
' Q, ]* L3 X: x$ U
4df1b489cb944c26b55013001061675d.png
% O: `/ O$ l6 k) p! x) X. p: I/ i' T) k" |/ U

" b# K! P9 J8 [) a! r) ?) _$ L4、ADC简介:
% n/ h! o' `" r5 UADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。
1 b) B* }  K: |' q( z3 b% C7 V& J' ]% Y' B/ D% z
STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。
/ Y7 z3 ^8 V# ]. l+ A- }2 j2 e4 q; A4 R5 q/ A- ]
STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。, D! g1 G, s8 }7 i
( U5 O2 Q; s! @0 Q* e2 t
/ x) H  \- K6 J% @
  二、ADC实验过程) `; S% _& |4 O
1、新建STM32CubeMX基础工程

, X3 J- d% G2 t# {% t; g$ v(1)打开STM32CubeMX,点击“File”-->"New Project"" c& |' R# R, ^
, F  A/ S; U6 V+ ]' A; P
2399170347904e959c855fefd5877f84.png
8 ]1 {# f( J4 A& E6 P7 H( K7 h2 F! y
  ?; b. N, t3 i$ }(2)等待打开主芯片选项界面(大约1分钟时间)。& Q; z) U4 ?5 ~9 Q7 m

; q9 O. R& A8 R
d74d2fdc60c9440483e2b7cf8d928e7f.png ) t/ l+ J, X: c4 I
5 j' g9 |5 \) R$ I; k
(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
1 c- G% m0 K' i6 Z0 ^" W  R
  |# m' X" u% w0 R* c: I
7b80345238d74bea82ce70e1a348f7b4.png 0 \3 q, R6 \) }( k+ @
2 m( O8 a& A/ O$ y& f9 Z
(4)选择时钟源。
" P* Y9 X( S) ]0 {, S3 [0 l' A, y4 ?! ]/ d(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。1 ^! w  O2 g+ V! Z0 Y1 ~

/ g& D8 `3 v' [" u  S( M
3f65707eca104663a3dede6d25dfa961.png
3 f2 C' M3 i5 g

, J- f4 [: v* v* Q(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
6 f' j6 u* J/ ^# M% m* B2 ]
  H/ {. N" r& ~% v1 E  F
72119b971f62410fa8344f7f9fb9f389.png 2 d3 K+ K* u: o& n' X
9 L$ J; g- ?0 L0 R9 j1 @/ Y+ F" b
2、配置GPIO控制LED
" A! ~" {, h( D3 {(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:/ W7 b2 F1 h' F( ?3 |9 x
LED1——PC0, f. K/ P. z! z6 U, n# \# b$ ^
LED2——PC1
; b2 i  M7 S- V$ S3 A- oLED3——PC2
  s0 Z% h; P' c6 DLED4——PC3
4 U+ w( }& {9 t" e+ [, J" ]/ z7 f. e+ J2 q" {% a
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。
9 e' C& O6 S2 A- m! ^$ \: Z5 b% @, F鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。
2 c/ O6 U& x7 b, y9 `, r. N鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。& U* I9 n3 x" p6 A1 f8 M
鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式4 j) x  c0 _' z0 ^+ _! u5 W
鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。
" `) D, m# g+ I6 [2 e! @0 W3 R3 Z
$ l- D7 V0 v; H5 Q
492907c1e71149819adbaee4516a2af4.png
. p* r0 \% E/ f! H( K
4 l4 A) _& i2 F9 r( m
c75d3f10ba2e427d9c1a10fad9bf5471.png   S4 V& K( E( E+ n% o
0 J+ W" C) D( H& q; E
(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。) b) J/ p- Y$ z, W, }

; k. x5 C, ~* g+ G/ |
38ff4b80e1c5495ba3076a5158fd91fa.png
5 z  v, ?" I# r) \3 w& s8 \  O3 M8 b. D
​​3、配置PA9、PA10为串口% K3 z5 X" B+ J5 p2 X7 }
查原理图得知,串口1使用STM32L431RCT6引脚为PA9-USART1_TX,PA10-USART1_RX,引脚设置如下:1 k' ?' ?/ s' r" E! I

; K% n/ ^) _! s1 n& @0 r1 l% E
497b8ee0243e446784e64a3c31e8a26f.png
- y/ H- [* `6 w4 f* l! O2 i+ G" J6 q4 ?: a9 B% M+ R/ w! g2 Y
1 M1 I1 e; g! S! }; H
(1)序号1用来设置串口收发引脚的选择。
1 v" l" ~+ k( N- L! u(2)序号2-3-4-5-6设置串口参数,如波特率115200、8位、NONE无奇偶校验等。
, W, Y: q& Z4 p# f; c1 Y8 |6 Z6 j/ e/ s2 Q& l
4、配置ADC(单次转换模式)
$ I! U3 v( L( o. h2 l(1)ADC简介:. V. S7 z' g% {! g8 W, N  {
☆ADC全称 Analog-to-Digital Converter,即模拟-数字转换器,可以将连续变化的模拟信号转换为离散的数字信号,进而使用数字电路进行处理,称之为数字信号处理。
8 J2 \- ^" d) ^. z
: g: o" q% ?+ Y5 b7 X☆STM32L431xx 系列有 1 个 ADC,ADC 分辨率高达 12 位,每个 ADC 具有多达 20 个的采集通道,这些通道的 A/D 转换可以单次、连续、扫描或间断模式执行。 ADC 的结果可以左对齐或右对齐方式存储在 16 位数据寄存器中。8 [( N6 I7 b8 m& R2 e9 H" I

7 \* V+ S* c. f5 R& q6 P/ _☆STM32L431 的 ADC 最大的转换速率为 5.33Mhz,也就是转换时间为 0.188us(12 位分辨率时),ADC 的转换时间与 AHB 总线时钟频率无关。" z/ F8 E, |/ b

6 s1 D; H% i, f0 V(2)首先选择ADC1,开启通道9. n. H' Z. {% M) X$ M8 x  k
; C9 M7 O) d6 |' U0 [
f31d2998798b4294a5efa1cda1de7c31.png ' p- z: L" P, o

% |8 D% }8 o& J(3) 进行ADC配置,这里保持默认即可。' m6 l% T( S* D# @  d/ O/ }- ~
& W/ k9 q: S  l# Q
01e7319ac29443dda07463a86cb4343e.png
6 \: K. M- F& W  d( R& ?; y4 E: X$ P- N  s% K3 w6 @/ {
(4) 配置ADC的转换规则,选择channel9
1 A4 P& b5 H5 J7 B  D6 A/ o# {& d* {& t
( {  o( j% B! r9 X& p
+ ?1 ^' P& e/ ]& M5 O# C
5、配置项目工程参数
2 Q. o* U, Z; Y  @+ C; e(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。2 W9 _, n  |8 d
; y9 s  i+ O7 P% o, U6 y8 D  P
f3ecedd9323f4463b69539906b3c1199.png . I+ k% q- f& `. c. x" F4 s$ R

5 x9 b. B+ d8 g' i+ W( J6 u* M3 C(2)完成配置工程。
# J1 v' I0 ~" v- k, H7 ^备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)- Z: y+ R+ e$ r$ f* x. b6 ?
, X4 V4 z4 M+ o2 a
efdb616174f54925b6eac31109f227b5.png
4 o- ^$ K; j. K9 M​​& t- \0 v/ M! {; ?4 h6 t- P/ z
41c3f2716e4e4eda8f62fa3a1d871322.png
! g* Q, ^. T/ s+ Y) k# b* J(3)生成代码。8 w/ T' h* h$ v; v4 m& _4 a
备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
$ L0 ^0 Q- z7 K$ c! @' |6 g" u
# x+ z. Z3 r- W+ u- f& X  a: F
8eaa7d0babea40ee93f158481a6ee471.png ; F9 P9 i$ Q4 J$ Q4 o/ q& j1 k

- m, p2 N3 B+ X. F* g0 E: m# E& o(4)工程代码生成成功。( z- ^; R7 z# |
$ e1 q, _; A5 C( q9 N
e8f46d59a1fb4af589feb613fdff17b4.png 0 o4 r" Y- M, _/ A8 s: U! Z

4 i8 H; |' p; c% e% ~! \5 \. z
4 C! J7 _' f1 g5 d; l$ Y) b7 O 三、在KEIL 5中编写代码  k4 D2 y+ Y' @- \' j( X8 C0 Q
1、使用KEIL 5(MDK)打开项目工程文件3 y4 {* o" x5 I/ z. B7 s! H
源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。9 u! k' ^* D" [: p9 N. S! o. U
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。0 L/ P+ u, W. x" t% ?0 U# K% ~

: @& V3 b/ i: O- Z- ^
048bd5008312422bab9ef3bfe37d762e.png 7 r8 w0 [4 m1 T" R: j% l. _

1 i4 t1 r- R1 K2 D* e+ G/ _7 \2、添加ADC获取验证程序7 M) v" }6 V! \- H7 N2 g
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加控制程序,如下所示:实现每隔500ms后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换,并且串口每隔500ms打印一次。
2 t0 @, R1 r1 w, n( _5 }) [: `9 A6 S& Q
备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。
/ d- C; h- D1 l
$ G# ~5 W8 _& s7 ?
d1194af353cd4b0b88cd9208b1ac7db1.png
% ?, G6 d& |+ D: G5 @; D
' Y* l" ?1 _" J3 |3 q! q2 l1 o 178a631ceb1b40769861cfa141087495.png
& \. w$ \: H3 ~) K+ ^6 g6 v1 z  J6 e/ j9 W7 n+ d
(2)在main.c 文件中添加ADC获取以及打印代码,如下所示:6 O; [, g. Z1 l' t# `: D

9 |9 X9 u# {2 z& I# Z
76308de291b64abbb6c092cd71e77e49.png ! e9 ~) U$ v# }. M

' {! m7 \2 t8 d. S0 V+ ~
  1. int main(void)
    & T( W! r5 R: r+ f/ ^0 I  E
  2. {1 M7 C0 F% q4 U: m7 k0 L
  3.     /* USER CODE BEGIN 1 */
    ' M7 c( D; s6 ?. i5 e* B
  4.     uint32_t ad_value=0;                    //初始化ADC获取值
    8 g" ?. Z0 a# _6 X$ r  U$ l2 [
  5.     /* USER CODE END 1 */% l. }% u" {6 m; a
  6. 3 A* z7 c  }; B5 Y" D! `
  7.     /* MCU Configuration--------------------------------------------------------*// A4 b! u9 \# V; E

  8. 4 i) N6 a' x1 Y1 L" h8 n
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    / M; t; ~$ e, A# K
  10.     HAL_Init();
    " W) U5 M5 j. n1 ]& I
  11.   I7 E8 J, t: D% M
  12.     /* USER CODE BEGIN Init */
    ; y) ?0 f0 B( G3 X2 ^

  13. 7 ?/ `3 q- V* p0 e: K7 V# o
  14.     /* USER CODE END Init */9 K- n; A2 v* t6 n& K2 {  T& J

  15. + o( \. x1 A7 i, G/ D% T2 `
  16.     /* Configure the system clock */( j5 P, ]  W* @9 S6 i
  17.     SystemClock_Config();
    4 I4 d8 f8 V3 F. S6 b
  18. # j/ s# U- Y7 {" c$ |$ T+ k9 S
  19.     /* USER CODE BEGIN SysInit */5 i& s9 P4 t. g( W
  20. : q$ B( l. C# N5 k4 D  y
  21.     /* USER CODE END SysInit */% N1 a6 \# d' c$ C! S
  22. 5 j8 ]) B6 e  ]3 p- q
  23.     /* Initialize all configured peripherals */; G. s2 F  m3 x) t0 j
  24.     MX_GPIO_Init();* K" f% t# D" T9 A5 }
  25.     MX_USART1_UART_Init();9 g& L0 [  d: W+ L0 S3 y
  26.     MX_ADC1_Init();
    $ ]: R8 t& q- D% \
  27.     /* USER CODE BEGIN 2 */
    9 A7 E! d3 S# Z; ^; v% f$ |
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);        //初始化默认点亮LED8 q/ H2 I, N2 ?4 k
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);        //初始化默认点亮LED# k: f7 }3 u3 e5 q% W% Y
  30.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);        //初始化默认点亮LED
    + w  x& k8 l! x0 o, A
  31.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);        //初始化默认点亮LED
    ! f: p5 L5 g2 i7 R; I) Y( n% w5 z2 s
  32.     /* USER CODE END 2 */" f# j& m3 c2 b; n) d% ?

  33. - w4 s, i9 V5 [
  34.     /* Infinite loop */5 x; @3 L! N5 r* e, y
  35.     /* USER CODE BEGIN WHILE */7 q; n% ^! R; D5 K
  36.     while (1)
    & X. d3 I- B! v; s
  37.     {, U& m5 j- k" Z5 m8 M- s& H6 A" [! X
  38.         /* USER CODE END WHILE */
    0 x0 j. w4 s1 c6 i! p

  39. 7 `" O: @1 P, i! c  w1 ^( e9 ^( m8 B" i
  40.         /* USER CODE BEGIN 3 */
    ) T/ D' e+ X" ?% A# M4 n$ [
  41.         HAL_Delay(500);3 R* [' s) s2 O- ^1 }* S
  42.         HAL_ADC_Start(&hadc1);                      //启动ADC转换
    + y! N$ \- l% d
  43.         HAL_ADC_PollForConversion(&hadc1,0x10);     //等待转换完成
    ! w0 j4 h) B0 Z6 }8 ?
  44.         ad_value = HAL_ADC_GetValue(&hadc1);            //获取转换值- J% S1 h/ \& L' M
  45.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);                //反转LED灯& m. p- z4 E' M6 O( S# d6 p
  46.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);                //反转LED灯: P# k1 ^! ?1 G1 w' j$ U
  47.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);                //反转LED灯+ ?& A$ e+ b) V& U5 F1 B, {/ q2 h
  48.         HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);                //反转LED灯
    0 S' x' u+ w7 w) y0 E
  49.         printf("hello world,this is adc value==%d\r\n",ad_value);   //printf ADC获取值
    0 s+ V3 J5 T! o8 z1 S  P/ N7 h
  50.     }. @- X( g2 q( E$ a3 P- m& s9 [
  51.     /* USER CODE END 3 */6 p- K. D) p" K, c$ Y
  52. }
复制代码

8 z( t( ~" V! f3 w) u3、设置编程仿真下载模式
4 R6 e  O3 a4 ]' M(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。8 C5 V- c6 ]$ T! k3 D6 P- x* B

& {, _9 f8 [- T2 i$ d2 Y
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
: x" J& v, x3 w$ |3 _( r​​
% c: {: o( v5 F1 b& v9 k; l& J) b5 `(2)点击编译,完成后提示“0 error(s),0 warning(s)”。5 `: _4 Q8 \) Y
6 S0 S) ?! V" i( ?! V  Q* o
e0b7e3e353b345a7987fe5f821de2dda.png
5 n  C9 I1 h- e# F  W8 T/ P  j​​
; D- Y. J) l% p# D+ {5 M(3)点击Download(或者快捷键F8),即可下载程序。
. @  ^7 p; p# o4 T, u* n0 `! h! e% G0 `2 Q
eb3f250f19e44862a7df80c2492fcd01.png   V8 T- O) W. T' U$ i
​​
1 `/ l; p& s$ s3 F(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4闪烁,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。7 {0 x; Q9 i- M/ ?" p
1 }' [; j# O3 K, ]3 z! P7 m
9f8aa1a4e8f04041bcf5cb183facd100.png 0 C; Z2 D5 p" o, u8 w2 E
​​
. R) x# d$ ]  W0 f, }# B4、ADC实验效果展示
% c2 {  C7 \/ u4 @( t  P4 d9 C5 ?' c; ^        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后每隔500ms闪烁一次,并且打开串口助手后(串口参数:波特率115200、N、8、1),可以看到printf每隔500ms打印一次log数据。+ z5 c5 ~  Q& M* I% \$ E

% k4 m% P# K- J8 B) S3 z9 S当PA4通过杜邦线短接到3.3V时,value约为4032,当PA4通过杜邦线短接到GND时,value值为0。1 _* N; j  G" x
* z: J: |2 z- o# V; o1 S; Z/ Q$ j. H
0a4dbb1de86343a2bfd95b1ee2180da1.png , Q' }) N, l% K: g$ N* I

* e! ?, V8 U3 K/ A6 @————————————————
5 r, P$ e1 b3 a& u7 a1 S版权声明:智能小屋ZYXC
7 B5 r$ T/ C" ^# o; m1 R0 A0 t
* e) h! A, a0 |  z. C& s/ C
1 J2 M  |# o3 m. @! k9 k
5092b6c6ba3644239c3805164afda05b.png
收藏 评论0 发布时间:2023-1-13 19:00

举报

0个回答

所属标签

相似分享

官网相关资源

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