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

【实测教程】STM32L4之按键输入实验

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:52
一、开发板平台简介:
' C5 k( A* E4 Q1 o& q, O  x1、开发板资源简介

$ k( J. z+ w: i(1)开发板主芯片型号:STM32L431RCT62 @8 @2 a9 [8 K: I; Z. F1 G$ ?
(2)开发板主芯片封装:LQFP-64_10x10x05P4 M9 i& Z% w- \0 ~8 m
(3)开发板主芯片内核:ARM® Cortex®-M4
; L# k' A  V+ Q2 Y, U5 J(4)开发板主芯片主频:80MHz4 l: \* l+ Y, g1 _: {. b5 a6 _
(5)开发板主芯片Flash大小:256KB' m' ^; i) r  q5 }
(6)开发板主芯片RAM大小:64KB
1 N, k; V3 K  _! g# \% i' O. N$ b, t! Z# ~: Y, A# w/ f0 ^9 [: {
bb91345227434ee7a43a34bf3fe366e6.png , p. n/ ^0 X6 e+ B( U. g

7 t% ]( A: P% X. z3 x1 X( U
929c0cce04aa4115a8623703982bf3e1.png
5 B* Q( k1 G4 E# [# a' C1 U. e! B8 G- A. G$ _2 {' Y
2、LED灯资源

1 v. U9 x& L, a' F(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:" r6 @  H6 G* g" ?/ a

3 Z2 B" r! J, Y$ o
0f177691c5814f16a508bcfa747f87ac.png
4 H" I! \2 ?  m  K
4 y/ a1 g8 O; y$ C0 ~
0 a' C0 I" h- C: w6 x; L
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:8 O2 G7 j+ m2 H6 i, r7 e

, v$ M  i4 C) X) c
e923ad767b8448b7ac37c4ed693724bd.png
; [( {7 y4 z- G+ A$ Q
& e2 M# p8 d3 U- P: I2 E3 \- N/ y% h
​3、按键输入工作原理
6 H  Y' q6 z; k按键输入原理:读取GPIO引脚的输入高低电平。硬件原理图设计中通常会加入100nf的硬件消抖,以及ESD二极管防止静电损坏。
$ Z1 @0 a3 {. J0 c3 N. o$ J; S  m% R, l: o7 {! P3 E' d; L% s5 |
如下硬件原理图所示:默认PA0输入上拉,按键按下后高电平转换为低电平。7 V% O6 I6 K: i

% s5 u, f, b+ L0 L8 P* J
0aef905d6dd649c1b1a14e4e3929cce6.png 0 ^' H$ y* z8 Q  R- P3 a. [1 j3 F
; ]8 |$ O3 P" ]7 W: _- D
  二、按键输入实验过程5 E' k  Z0 u3 ^7 H: M  l( ^
1、新建STM32CubeMX基础工程
# d4 ^  h$ a1 Z3 _(1)打开STM32CubeMX,点击“File”-->"New Project"6 b. J4 G6 z6 D/ f: B

: S  l: ]( z0 Q- d% O4 h
2399170347904e959c855fefd5877f84.png ' q" B/ H, _) z, k0 ^
2 Z. }) X/ J' S9 ]. M+ ~/ L5 E
(2)等待打开主芯片选项界面(大约1分钟时间)。2 F# }! q( d2 b# X
9 }( D/ h' O, \1 u
d74d2fdc60c9440483e2b7cf8d928e7f.png 7 Q: o$ _0 Q5 X7 @

+ N; _; R, k3 |6 a- T9 k' B(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。0 ~+ h# v9 K0 T

! m& z7 G6 P. Y( {' e" h# ]
7b80345238d74bea82ce70e1a348f7b4.png 0 `4 @% o/ p, J5 n2 i- a
& h2 S' R' @6 o6 o
(4)选择时钟源。
3 x* V, m3 d1 ?& M4 `9 G: v, M" X  \  W, y/ ?  p& n; s/ v
(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。
$ x: L. w+ }/ h+ l5 m4 U# F$ j- v0 k/ u; I! d( S2 g# ^+ X: H
3f65707eca104663a3dede6d25dfa961.png
2 `! I& i- _/ |* |- {9 X
4 I- h+ e1 j! S; t$ P$ L5 K(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
% U4 t5 W7 Q% k3 M2 t5 z* _  s4 P1 {% _; x* I
72119b971f62410fa8344f7f9fb9f389.png 5 I: a: y5 c8 L3 \3 O- Y! r
. t8 f; J- A9 `7 G4 w
2、配置GPIO控制LED
* n3 d: e- I" ?) K  k$ m, O(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:9 \0 L2 }3 T) u- y4 i
( U. }# F; _6 n1 N( q. S
LED1——PC0
& z# q2 d% c3 O1 g7 ^1 ^5 I5 DLED2——PC1
$ `5 |& L2 W) G& n5 [* XLED3——PC21 ?3 J! n# Q$ Q( ~
LED4——PC3. h0 [% L2 h3 J$ i+ ~. m
  _/ b& i  u0 k8 p/ i* a
(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。8 \9 Q& d3 r6 W) p% d. J

* C8 Q' |* n, l2 U鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。6 O( f, w7 g& k
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
' {& C$ d6 z% {4 n, j* o" Y! K* e鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
- ^( h+ {$ C4 s( k8 N3 t鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。& s8 ]+ n0 u6 n/ J
; i3 h( a3 Z+ l/ `! `
492907c1e71149819adbaee4516a2af4.png
! j2 S1 f8 ?. s+ H$ X
, B$ p+ V2 K; _4 e/ s
c75d3f10ba2e427d9c1a10fad9bf5471.png ; ]5 G  o; l9 M2 A/ D" I

3 k! a/ V% ~2 _(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。! z8 D2 L" v8 ?* i

8 p& y. `4 g1 _4 |9 Q
38ff4b80e1c5495ba3076a5158fd91fa.png * N5 _4 \/ ?5 O" h9 |- g9 {" V* n3 D

+ P1 f" O* }8 s, q" c0 \​​3、配置PA0按键输入模式. [) f# Y5 V' L7 _9 {! ^
如下图所示:右键点击PA0,选择GPIO_Input,配置PA0按键输入模式,默认内部Pull up上拉即可。
. |9 ^  [: ^! ^, Q% j& R# l) t# ^( h. z5 D; e+ a! O: V
dd6637a0885540099c753cda683008fb.png
; R8 K! H& \, _. W! Q  e. D 100c273590ec423dbc03c83cb5bc088f.png 9 Z" v2 @1 g  P: u) d- E5 n1 M

8 K& n* Z0 t, c
1 b" t7 B1 R/ }2 R- C 3、配置项目工程参数3 s& b. @. [0 S3 }# r, \
(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。
' W  o# D6 a. H& Z& L2 {' ~- G' W9 e  ~, ^
f3ecedd9323f4463b69539906b3c1199.png 1 c: G& s) m- F; H. r  g
0 g& M) p7 m! _

  I: X/ A5 _9 x/ B/ b" P% \; n(2)完成配置工程。* f0 n  l2 u1 L
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)  H9 ^# \; C9 a8 t, O' A: O; W- z9 K
2 D+ x2 g8 Q/ a& Y! g
efdb616174f54925b6eac31109f227b5.png
' B$ S- X, p* ~  X: Q9 @​​
+ |: g. k+ n  K% v9 \ 41c3f2716e4e4eda8f62fa3a1d871322.png
" x+ q7 P8 Q2 j) M" u$ h: y6 J* ~
* G1 Q& I6 b8 }5 @
(3)生成代码。
' u9 ~! f1 Y# a6 w- N: L备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。' i% L- f2 Y0 b- G9 r
* U+ n/ Z% T5 ]4 Q
8eaa7d0babea40ee93f158481a6ee471.png
5 Y* U- t' d" q4 o+ N​​
, I% u% r  r3 ~! U/ R(4)工程代码生成成功。
+ f4 O8 D. x, y* w1 u' _) ^4 }
e8f46d59a1fb4af589feb613fdff17b4.png
; W7 B/ S; U& {$ j- \3 Q
% ^# p7 ?) C) z8 X3 c8 \" ]  V4 ^ 三、在KEIL 5中编写代码) M3 U  d  {* X$ B1 Y
1、使用KEIL 5(MDK)打开项目工程文件
4 h$ k  u4 g6 r8 z. y( C4 ~源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。
! E$ r- Q$ U2 B! F, |% `. d(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。" d. n, |5 {  D+ m1 @0 ^: Q, n
$ H  Z9 O: [- T8 c# ^
c4de30b9c6ed4cfba7c8581501244b42.png
6 t. k8 t" F; s* s+ Y: p$ f+ |: L0 Q8 l2 i) S1 ]
2、添加按键输入验证程序/ Z4 r) c- U2 L, z& }
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加按键输入控制程序,如下所示:实现按键输入后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换。; f2 c# h0 _  z6 X# h( h7 ?

) d( B6 k( @& [* R# F" D. t% f; {备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。3 h+ {2 L5 [2 u2 z% V. h
4 p" ]3 l! @" i+ Y/ l! F  m, G
7ce423ed75a64c7c834a1547b2b07f80.png ! M& |) L% ^5 m# b8 _- k) i- t

  P" Y8 L1 d, c; e3 ^- m% K(2)main 函数代码如下所示:- x; q1 N( o( P3 d- Z
  1. int main(void)
    , V0 R- A: t7 q- |% c
  2. {
    ) ?, c2 ?4 ?- K1 \7 Q& |/ g; @
  3.     /* USER CODE BEGIN 1 */
    + U! D4 ~$ ?4 H  S, G
  4. 5 z' C( C, G7 D; t, g( q4 C
  5.     /* USER CODE END 1 */5 \" k- f0 A* \! _* h

  6. 2 ?5 N9 ]; [0 B
  7.     /* MCU Configuration--------------------------------------------------------*/
    ) ^& e$ S# @  M! K6 F
  8. 0 u; D% ?# {) C2 K% f
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    , k5 R2 s% p8 K( j& t$ Q
  10.     HAL_Init();2 @2 Z  F. H9 Q+ |5 X6 d, [$ l
  11. # }) E( U+ {2 a( R+ |/ z5 C
  12.     /* USER CODE BEGIN Init */
    ) ^5 Q: S0 H3 t8 s3 L

  13. , d' o3 \& \( `6 F' c$ i, s" R
  14.     /* USER CODE END Init *// @9 d8 t$ O. N
  15. . w! i4 S: o% o2 r/ M5 {" }5 j& P
  16.     /* Configure the system clock */; r5 G8 x) G  f; x; G- G
  17.     SystemClock_Config();: T6 k! `2 ]6 R

  18. # W2 b/ k6 h* P- V6 A3 w& D! K: {
  19.     /* USER CODE BEGIN SysInit */
    * ~1 F/ Y$ G/ z  Q' y! [
  20. " |/ T5 F* V. v4 F1 b0 k
  21.     /* USER CODE END SysInit */
    7 ~+ I- w2 Y3 D: U2 A
  22. 0 T( ~2 c; i6 V( B5 Q& \
  23.     /* Initialize all configured peripherals */2 T1 e2 G1 F' ?( W7 M
  24.     MX_GPIO_Init();0 _) H# e/ _' \/ z, o
  25.     /* USER CODE BEGIN 2 */' v7 G' u# F& A) \) r
  26.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);    //默认LED1、LED2、LED3、LED4初始化点亮
    5 i( k9 h: V  L5 Q0 s# G5 h8 u* v! B
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);- m# y( r+ b0 y1 F7 u( l
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);
    4 I: z0 F" v7 T" S
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);0 S4 E: J- ]8 g7 h7 g1 G
  30.     /* USER CODE END 2 */
    . I* J8 r9 B0 I
  31. , ^. w2 C5 c- `
  32.     /* Infinite loop *// d2 W7 h( N* v6 z& X
  33.     /* USER CODE BEGIN WHILE */" z/ H! ]( H; y% y  s
  34.     while (1)
    8 ~7 T1 x: n! A# M! Y
  35.     {
    9 b% |- c& }# z* B
  36.         /* USER CODE END WHILE */
    ; L' s5 |+ B; F' w9 b+ M$ l

  37. / w. c8 n) d8 ^+ d* ]
  38.         /* USER CODE BEGIN 3 */+ B4 M* a4 T- t( B) a# [0 S* o
  39.         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)                                //读取按键输入
    / w1 d8 h( I# |  w4 m0 U
  40.         {
    ( ~$ \% m1 F% T' L6 _# r+ v
  41.             HAL_Delay(200);                                                 //软件延时200ms
    * T' C8 a7 Q) M; U+ {! l
  42.             if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)                    //按键反转LED,熄灭和点亮切换
    5 H  K0 M0 s4 j# \
  43.             {/ q+ f+ `8 L% L
  44.                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
    4 x- s: g( t0 Q) s
  45.                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);+ Q1 ^3 f0 J7 o  F) V0 |
  46.                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
    9 V( l3 e8 W3 B% c( r
  47.                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
    + E7 f0 x1 w- m$ _
  48.             }
    / ?( O: m9 k- L
  49.         }
    0 Z# e. O1 a: U& s
  50.     }8 B! h/ Z, m" X5 u1 w7 X: `5 B
  51.     /* USER CODE END 3 */
    - ]+ H1 K7 C  F2 u% A
  52. }
复制代码

8 z2 ~/ A: R/ h5 U( i3、设置编程仿真下载模式
: z; W! F0 U) |, W(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。
: s2 _. l# W/ B/ K( B
: U& q5 c; I  Z: f; A
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
( l2 g) y0 {; P3 ], t/ \​​
1 L+ w* F  Z! e% Z1 X. t(2)点击编译,完成后提示“0 error(s),0 warning(s)”。' l! f- N3 L' h! i+ g1 `% y
, \: @1 L+ q9 w1 k& p( s
e0b7e3e353b345a7987fe5f821de2dda.png
' `  S  T0 B" e7 B1 y5 t​​
0 q$ r( {3 x  ^$ }* F(3)点击Download(或者快捷键F8),即可下载程序。
9 _6 R; W: \3 M9 c4 P
: i! v5 Y: S6 w: J' i, x5 I
eb3f250f19e44862a7df80c2492fcd01.png
5 n( }1 u* b7 v- |. ]& }​​
: a: b+ i. @8 h# j: l+ b. ~9 [* i2 s, ~( k
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4点亮,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。- B- D+ D+ T- M: i6 X
7 O) r% o7 Z. H& L
9f8aa1a4e8f04041bcf5cb183facd100.png
- g3 [) p! i+ p9 n% @' {/ C ​( e) e& k5 U' b( n6 p" i* n
2 ]# q( V2 j  _4 l5 ^( c
4、按键输入实验效果展示
# K1 b7 F# u0 @        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后常亮,按下侧按键K1即可实现LED1、LED2、LED3、LED4点亮和熄灭的反转切换。# a) [2 ?, d9 u
————————————————
  M3 Y6 _, W4 a# k版权声明:智能小屋ZYXC
: V+ L. w3 D- g: r$ }1 e5 M9 O7 q, ]# \
' t7 r& T- t( y$ ^/ M# _

1 M( N7 d  H/ V$ ^4 c) l- A2 z# |
赞 收藏 评论0 发布时间:2023-1-14 18:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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