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

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

[复制链接]
STMCU小助手 发布时间:2023-1-14 18:52
一、开发板平台简介:" l: L/ i& G4 {
1、开发板资源简介
. ]+ S1 G) t, G, m- @( V
(1)开发板主芯片型号:STM32L431RCT62 d5 k" i1 o3 H
(2)开发板主芯片封装:LQFP-64_10x10x05P) q: i, B7 Q2 d
(3)开发板主芯片内核:ARM® Cortex®-M4- D0 @8 g( t+ b# R+ C7 {1 r
(4)开发板主芯片主频:80MHz
: y& R* Z  w) X; G# R2 X6 Q(5)开发板主芯片Flash大小:256KB; _5 K  Y( Z5 v
(6)开发板主芯片RAM大小:64KB
2 b; p6 U% N2 l. R' }7 J7 N
3 Z2 M/ w/ Z# b$ l% u: E6 |
bb91345227434ee7a43a34bf3fe366e6.png 9 P/ R) |8 G; o

  d7 J, J9 U, E1 k
929c0cce04aa4115a8623703982bf3e1.png 0 _" i/ b" k6 J
& _& R1 |; @8 ?6 K) _6 x5 `  e
2、LED灯资源

& E* y% f+ y9 }1 x(1) STM32L431RCT6开发板共5个LED灯资源,其中一个红色LED为系统指示灯,指示开发板供电系统是否正常,如供电系统正常,红色LED为上电常亮状态,硬件原理图如下图所示:
2 i: M2 u, X9 K# [7 R* P/ h. d6 _) e0 a  f- ?4 X
0f177691c5814f16a508bcfa747f87ac.png   q: x: R( [( U. {( X- T

2 o0 d7 K' H0 ~
- |' n5 f# O7 T, i4 p1 S
(2)其他四个LED灯为黄绿色可控LED,高电平点亮、低电平熄灭,计划用LED常亮验证看门狗的作用,硬件原理图如下图所示:
% D0 o1 b) H8 _9 [
6 I# V6 H' d" g/ U$ |, w4 f- H
e923ad767b8448b7ac37c4ed693724bd.png
# h. q2 M+ R1 L6 g: ^4 S* |, P

( k" W2 x) B" I; g) d, M​3、按键输入工作原理
; H7 n  |+ @! \* y. Y按键输入原理:读取GPIO引脚的输入高低电平。硬件原理图设计中通常会加入100nf的硬件消抖,以及ESD二极管防止静电损坏。
- I+ ^# s) F4 [. [; X" L( F+ v. ]) E
! R3 |3 l/ r6 x0 a2 ~7 v* [如下硬件原理图所示:默认PA0输入上拉,按键按下后高电平转换为低电平。* F9 }1 g0 d. F: z2 D( r; U
9 H% U# X( K# P7 ?9 h0 r7 |  F
0aef905d6dd649c1b1a14e4e3929cce6.png
9 |$ j3 Q  f5 t3 m7 |$ d4 i' W# }- }
  二、按键输入实验过程
3 r8 u- _0 B( \7 F+ {( ]1、新建STM32CubeMX基础工程
' ^5 W. I1 A, V7 P(1)打开STM32CubeMX,点击“File”-->"New Project"( Y6 E" D4 D. ^: X- U: u: `) K& @

1 U3 C# m  |( o
2399170347904e959c855fefd5877f84.png
9 m  B2 K0 r8 H8 C; s$ d: H

# I1 h8 i( L. A& s% H2 P; I(2)等待打开主芯片选项界面(大约1分钟时间)。
2 A: x6 Y" t/ J) X9 [) H; T. e
7 ?3 ^$ E# L+ k+ g$ j
d74d2fdc60c9440483e2b7cf8d928e7f.png
- A8 H4 J. F* r) f# D6 Y$ W( a
0 J, k# n; p8 U; m(3)昨天搜索框中输入(或选择)所需的主芯片型号(因为我们用的是STM32L431RCT6开发板,所以此处选择STM32L431RC),然后在右下角选择STM32L431RCTx(因为开发板主芯片是STM32L431RCT6),左键双击即可打开新建的项目。
& z  M$ g! B  R4 @- r/ C2 H' w4 f: L
7b80345238d74bea82ce70e1a348f7b4.png
- I% Q; U2 J# u) g& N+ f* S! `/ k- u6 Q: Q
(4)选择时钟源。) |: I" n" E( B0 k' w
' v2 P# o$ L* R# y1 V* Y
(1)因为开发板上有8M外部时钟,硬件原理图如下所示,所以此处选择使用外部高速时钟(HSE)。) t& O: ^4 B8 [  f

0 y+ W3 w' I* e8 R
3f65707eca104663a3dede6d25dfa961.png
* c' F, z. \9 l/ C+ H9 E
/ L+ m* p0 d2 f9 l. y! Z(2)因为我们没有用到外部低速时钟(LSE),此处不做处理,如下图所示。
! _$ d/ K& z- I, t  H# S/ H  T) w) U1 ^7 L/ e" W) a
72119b971f62410fa8344f7f9fb9f389.png 1 R! t$ k4 V. u2 e7 F
6 h" r9 N5 k3 q5 E% N
2、配置GPIO控制LED1 `$ R1 u, D0 }# N/ ~! O3 T. R
(1)查开发板原理图得,LED1、LED2、LED3、LED4的控制引脚分别为:
/ b) J' Q9 }" e2 _6 k/ l, |, F* Q
LED1——PC0* _+ q6 q4 `# a6 S% Z
LED2——PC1
3 f) {, o' c, J* |6 H- p5 G, dLED3——PC2
5 q7 U4 L' D, @5 c& R  v1 _% iLED4——PC3- W4 U( a1 q: B3 R' y+ a

0 m+ S- ?/ J/ i0 E2 o7 J4 \(2)配置LED的控制引脚为输出,输出频率、输出方式默认即可。& D' J0 D. u8 _4 [
" t" [5 I5 P6 i. \# P
鼠标左键点击PC0,选择“GPIO_Output”,表示设置该引脚为输出模式。9 n% a$ P& \2 @) W6 t4 V% K) b
鼠标左键点击PC1,选择“GPIO_Output”,表示设置该引脚为输出模式。
; X2 D7 s  ~% V! Y( D  v鼠标左键点击PC2,选择“GPIO_Output”,表示设置该引脚为输出模式。
6 Y, G/ s3 d3 Z' g( v2 ~鼠标左键点击PC3,选择“GPIO_Output”,表示设置该引脚为输出模式。" G( J0 O4 H$ v7 R0 `0 g

; X6 b% Q5 v. T" Z9 z- Y. y5 n
492907c1e71149819adbaee4516a2af4.png ( _/ W. N, i0 e( M& H

  k& v+ T7 `. Z8 G1 E! S
c75d3f10ba2e427d9c1a10fad9bf5471.png
6 l1 ]: \! x4 V, F

- S! Z6 F2 w$ y# R. M& k(3)也根据自己的需求配置GPIO的参数,如输出方式、输出频率、上拉下拉等。因为GPIO控制LED的要求比较低,此处采用默认参数即可,不用修改。
( D' p: g0 ?6 e- ^% O/ i* S' x- l  ?/ x8 I8 o
38ff4b80e1c5495ba3076a5158fd91fa.png
' P8 i  Z; j4 @4 e# ]& G: x
) N! y7 m" O% R& n( P​​3、配置PA0按键输入模式
1 ]) }: {; n2 b4 B- b' O# ?2 B1 S3 I如下图所示:右键点击PA0,选择GPIO_Input,配置PA0按键输入模式,默认内部Pull up上拉即可。! u4 p# a4 b: X0 b0 M* h

( K9 d( c8 Q, [/ U1 N
dd6637a0885540099c753cda683008fb.png 2 N4 \' ]' E$ U7 h6 s9 R  ~* v
100c273590ec423dbc03c83cb5bc088f.png
0 \. N) f! b- F5 r2 @( i; e, h6 M) u  j# U# K+ b8 `
, `2 Z* p  V* w" G% ?5 U  u2 A, c
3、配置项目工程参数
# f  Y9 s  o( U% Z, C$ O(1)配置时钟树,用于系统内部时钟,以及各个外设时钟等。此处选择外部8M晶振作为主时钟频率,内部最大倍频80MHz。+ Y# c* b5 F/ ?8 Z

+ z& p1 ^! b6 ]' x' t. S, W/ T
f3ecedd9323f4463b69539906b3c1199.png
6 L' v4 }. M$ X* h* x3 e( [% B4 E( {% L+ z

2 f/ e6 l* m" O2 e+ x# m  r(2)完成配置工程。0 c/ P5 w# g9 w/ Q- o7 e" p$ ?" n
备注:需要注意代码生成过程中的继承关系,如图所示:需要保留开发者自己编写的代码时,请根据配置设置,不然生成代码后会删除自己编写的代码(从这个方面也可以看出开发者备份自己的代码是多么的重要。)
+ o6 P: ~# m6 t
2 [8 l/ m8 x! ?  d( U
efdb616174f54925b6eac31109f227b5.png
# B& P/ ]6 }9 \) x/ T​​; ^& T9 h, O8 e' z) y  w
41c3f2716e4e4eda8f62fa3a1d871322.png ( |0 i9 }" d2 R' i  T( h$ r. @

/ P2 R! \' t) m6 F(3)生成代码。
; n6 d5 X$ t: ~; j( }备注:使用Generate CODE生成工程代码前,请确保文件路径无中文,否则会生成项目失败。
2 N6 F% k( i$ g0 @, }" ^! h' r$ M* P, @5 A* U: }6 h
8eaa7d0babea40ee93f158481a6ee471.png 9 P5 [  k: H$ u. V! r- [
​​) S3 [/ n, I1 M
(4)工程代码生成成功。/ X! w5 s; z0 b' w  I
5 I3 w6 P6 y0 ]* S5 v7 U+ f/ S! X
e8f46d59a1fb4af589feb613fdff17b4.png
1 m- w  ^) e3 P: g+ `4 k" c: X( S; x
三、在KEIL 5中编写代码1 D4 r" f$ [4 e4 J
1、使用KEIL 5(MDK)打开项目工程文件
' K& D2 q6 J$ K5 l& u" v/ J3 o源码使用说明:使用前必须把项目工程复制到无中文路径的文件夹下使用。' }" e2 q/ r3 y% d6 v9 A2 @
(1)找到刚才新建工程的存储路径,安装项目名称,打开项目工程.uvprojx。
) v! f, f; r" y
7 X" A7 R" E- M9 j3 n
c4de30b9c6ed4cfba7c8581501244b42.png
$ }5 k$ {* g& ?
& V  F% t' L" y6 ?1 J2、添加按键输入验证程序5 G6 K8 H. u! P+ o! c# h
(1)main.c文件中,初始化LED1、LED2、LED3、LED4默认为点亮,并在while循环中添加按键输入控制程序,如下所示:实现按键输入后LED1、LED2、LED3、LED4点亮和熄灭之间反转切换。
" |4 X. u( b$ B$ M
* L* X% R: d5 F+ t备注:自己添加的代码需要在 /* USER CODE BEGIN 3 */和 /* USER CODE END 3 */之间添加,否则STM32CubeMX更新代码时,会造成自己添加的代码丢失。5 Z) W# V9 ]8 d/ W

. v7 z3 T" h( k, g
7ce423ed75a64c7c834a1547b2b07f80.png 0 ~: T' r! ^) }! t' ^

! Q: W' |  Z( f2 x+ y(2)main 函数代码如下所示:' A8 B% g) G* z
  1. int main(void)- w4 h* _6 x) J
  2. {$ }% s% f" [! G+ o9 ^
  3.     /* USER CODE BEGIN 1 */
      l9 x! R4 z0 @* u9 H+ H
  4. 2 ~$ }3 r+ i3 k5 ?. @5 T: r
  5.     /* USER CODE END 1 */- C( z7 e& `, @
  6. ' Y9 N) W/ H3 J8 W4 X) m
  7.     /* MCU Configuration--------------------------------------------------------*/
    8 W$ j. i$ w3 l# [% P1 t& m8 D: ]

  8. & V: y2 E9 }+ u' J( |
  9.     /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    - X2 X( ]  _& F, ]
  10.     HAL_Init();2 f5 p, F. D$ u: f8 n1 E

  11. $ S. u3 g' s0 i: Y! a
  12.     /* USER CODE BEGIN Init */
    & }& |& ^# J- s/ [% ~3 e
  13. " O9 N$ n0 W9 g1 @: B% z/ W$ U; E
  14.     /* USER CODE END Init */# j6 n5 {, ?  D- p9 x

  15. & f! f& k: W: W' u
  16.     /* Configure the system clock */# l8 y8 C9 }1 g) c$ J" h- y/ m
  17.     SystemClock_Config();0 m4 `! p% z2 o% [" Z! O( k' b
  18. 5 w* T% |6 \$ [
  19.     /* USER CODE BEGIN SysInit */! C) X6 n9 X7 F! B6 e
  20. 2 I7 S+ C, O0 X/ O, D* V
  21.     /* USER CODE END SysInit */$ f* \0 T" ~7 g- F) H
  22.   |1 I, y4 d9 k9 G
  23.     /* Initialize all configured peripherals */' d3 L3 G" ^, a# p
  24.     MX_GPIO_Init();
    / y) e/ X" x% V8 v1 g
  25.     /* USER CODE BEGIN 2 */7 Y  ~5 Q5 S2 C( @5 k! C5 ?5 u2 |
  26.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_0,GPIO_PIN_SET);    //默认LED1、LED2、LED3、LED4初始化点亮. D" h5 x0 \4 f) I
  27.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_1,GPIO_PIN_SET);
    5 i* D) n6 N7 S$ s  R' N
  28.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_2,GPIO_PIN_SET);! @- A8 u, A- X+ R/ C
  29.     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_3,GPIO_PIN_SET);
    2 e: V  @$ H+ N+ z
  30.     /* USER CODE END 2 */* ^0 c( D& n. a* Q
  31. 7 E- x( E5 L7 U
  32.     /* Infinite loop */. X1 q2 F/ s" _
  33.     /* USER CODE BEGIN WHILE */7 k7 ?1 Q% x, j( j
  34.     while (1)& v* p! Y. K' G
  35.     {% b6 e1 F3 y, a  j. s
  36.         /* USER CODE END WHILE */
    2 @0 m, V5 Z* h
  37. 2 n: ^4 M6 Z9 I" t
  38.         /* USER CODE BEGIN 3 */% z( y  w+ Q. j/ Z3 N8 w
  39.         if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)                                //读取按键输入3 B# w8 _! C. s9 Y0 d
  40.         {7 a' _* _& ?/ l8 j* b% {) Q
  41.             HAL_Delay(200);                                                 //软件延时200ms- a! U! Z9 U  v% [" f+ B
  42.             if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)                    //按键反转LED,熄灭和点亮切换
    + h- Z6 J$ _/ V% y0 I" d1 o
  43.             {
    : o( K( G* W5 k& N7 Y2 A
  44.                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_0);
    # C3 Q% O9 s3 D6 [* N  v" S7 U
  45.                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_1);! }' D% c! S9 I1 F# m0 J
  46.                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_2);
    0 c; N$ u" D; P
  47.                 HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_3);
    + Y# o# R7 O5 W
  48.             }( ~) n* j, k4 Y8 b
  49.         }
    / O; G4 H3 @' ?6 R6 D5 F$ A% E' b
  50.     }: E1 v0 _' I6 X1 e
  51.     /* USER CODE END 3 */
    9 ^5 S7 p9 |8 ~5 P1 p3 u: L
  52. }
复制代码
, _* N3 ~. s6 M8 l1 A$ q& Y
3、设置编程仿真下载模式
' F7 x/ q: a. W" f2 g! A5 E6 m(1)选择Options for target ...>>Debug>>J-Link/J-JTRACE Cortex,点击Settings>>选择Port(SW),可以看到搜索成功SW Device,表示芯片可用,可以下载。& r/ J+ }( H' w! s( D
7 v3 y% B. G, o+ L5 L: z% W
edefb6b9a2a14be3b1221ad6d5c7a8a2.png
# P( M. U; V  [& F' P/ T; w) w! Y​​: [0 P: ^1 {! v/ A- e( \8 K
(2)点击编译,完成后提示“0 error(s),0 warning(s)”。
# E7 Y9 Z& w6 c& z1 o6 r0 U, H- T8 m# ?4 v3 e2 h
e0b7e3e353b345a7987fe5f821de2dda.png
7 O( U3 [+ e( z% T2 n; u( j8 R- R​​% ~: u6 q- M( |
(3)点击Download(或者快捷键F8),即可下载程序。; y) f5 g( _, [8 W9 `

6 k4 B- g# f5 p* P. a0 h
eb3f250f19e44862a7df80c2492fcd01.png
! Q3 c8 W2 d/ J  i0 ]5 B/ n3 ?​​" [! C, s" y; ~' N
5 J8 V7 H  W5 ^
(4) 如果下载程序后,没有看到LED1、LED2、LED3、LED4点亮,可以按下述方式设置一下(Reset and run表示下载后自动复位和重启运行)。或者重新彻底断电再次上电(或按开发板的Reset按键复位MCU即可)。
: v7 E# A, C# N( q& B' k/ ~2 y& ?, I( P0 s% j0 T
9f8aa1a4e8f04041bcf5cb183facd100.png
2 v+ z7 }  K( l' y0 o' ~. L
' F; t( Y7 k% s+ T- n( D3 l: I

% j$ g+ M4 z" @. d4 q. r) V4、按键输入实验效果展示
* |& f& ?$ K6 K: }        程序烧录到开发板后,即可看到LED1、LED2、LED3、LED4初始化后常亮,按下侧按键K1即可实现LED1、LED2、LED3、LED4点亮和熄灭的反转切换。- c' G2 h2 g: J9 v* u1 e6 c
————————————————- U$ c4 Z  ]8 B7 J- k8 i$ @! ]
版权声明:智能小屋ZYXC& }" N$ i* f: [
9 L* c/ |. a7 p- S* X

- J( P- t2 b( h0 t3 C( u9 ^: z" }0 k5 ?) b
收藏 评论0 发布时间:2023-1-14 18:52

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版