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

STM32按键控制

[复制链接]
STMCU小助手 发布时间:2022-11-24 15:39
按键扫描的基本原理
8 V7 i+ S0 Z- j0 x按键信号的识别:一般来说,按键的两个引脚的一端通过电阻上拉到高电平,另一端则接地。接上拉电阻时在没有按键按下的时候,输入引脚为高电平,当有按键按下,输入引脚则为低电平;接下拉电阻时在没有按键按下的时候,输入引脚为低电平,当有按键按下,输入引脚则为高电平。4 a0 \* I1 x1 H* T& f' G' }! b  d
通过反复读取按键输入引脚的信号,然后识别高低电平来判断是否有按键触发。
) m1 E$ P" \& i+ D1 v/ L为什么去抖动:按键的输入引脚有低电平产生不代表一定是有按键按下,也许是干扰信号,因此,需要通过去抖动处理,将这些干扰信号过滤,从而获得真实的按键触发信号。9 p1 R0 o3 Q) h/ |4 t/ h; n2 ?' Y
如何去抖动:首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如还是低电平,则确认为按键触发信号;否则,判断为干扰信号,不予处理。
: R1 v, o1 b  L! y  MHAL库中关于GPIO的3个重要函数
' a' ^0 U; b5 O. s$ N1 j电平输出函数
; R% u  x3 x+ i" Y2 t2 ~void HAL_GPIO_WritePin( GPIO_TypeDef* GPIOx, uint16_t GPIo_Pin, GPIO_PinState PinState);, ?( e9 \6 U: }: T& j  ?0 Z
电平翻转函数
6 m- t9 c, ?+ S" p& ?! Vvoid HAL_GPIO_TogglePin( GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin);+ i4 T6 L: T0 z
电平输入函数
/ ?2 v! R* d4 o# m2 uGPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPlOx,uint16_t GPIO_Pin);1 z: R8 _5 [: n4 _
如:判断PC13引脚的输入信号,若为高电平,则将PB9引脚控制的LED灯的开关状态切换。
, m: e8 d7 w& _" y" s
  1. if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET): p1 k- ~- q( A7 E2 m" w
  2. {
    2 W+ S4 ]* q' L: w- ]
  3.         HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);$ B- U! i) b" J3 w, [. M; H- Z
  4. }
复制代码
7 I& A& f, M: [) a; j+ s1 T
按键控制实验设计: a. S' B: X. u2 v( |9 S" p
使用图形化的配置工具CubeMX进行硬件配置
; m! g0 Y# j+ t; x! |# I
首先新建一个项目% R+ s5 K% y* i# m
% q# p9 _6 o1 b& s4 C: ?" B
bbbbe8480e054d60b743ef49a69582f4.png 1 D! [( b( {3 g  w

  ?0 W1 A, ~# y* Z. r( ^选择芯片
# e8 `; Q% l( i/ B( D$ O# Z, n3 P) q, O# |$ C4 G
3bf496df40fb48a4864ba08dbb271121.png / S/ N- l' ?0 B* K
! O. x8 b/ n! _# s3 P
进入以下引脚界面,开始配置工作
- T: P9 j7 t* ]' R/ K7 p: L) `1 h6 G) D8 r4 N
46c3ffe4762c4874b995f6315f1a557e.png ! S8 O& Z  P) T; n9 A0 i0 b

4 X5 [" m; w* ~) M* o引脚配置
  d+ x8 L6 w4 B2 Z1 LPB8和PB9为output模式,PC13和PB1为input模式  T9 z* U/ b0 Q& `" [8 m% T

+ ^$ a9 I7 r6 N) g& s 5e80f01e2bdf44daa4dffbc958b58591.png & O* d3 a7 D% j3 @' V) U

* j/ _& K$ ~7 d, _* w* o系统配置,选择SWD接口的仿真器,Debug中选择Serial Wire
7 C" Q2 h7 C/ p- b* a9 u/ e0 k* n, o3 ~- K8 U0 R
b04e2f6497184331934b821496c30018.png & C6 y' |" `  ?( J; Z! ]( T

; n4 _3 X* z: \+ v, u! D4 g1 l选择使用外部晶振% |% i/ F- ?! u0 e6 j

7 x$ ]2 t  L8 ~4 j1 p) A1 D fd01b8062a084d44aec7944620bd55f0.png
* u3 P9 f- t7 J
* S$ X" H6 p2 N6 B" |) i9 x将PB1和PC13设置为上拉模式; Y. Q. B7 ]; o% t  s

! D% H/ c6 ~5 F9 \! f# z' Q) j4 z 223672854e334fec963c7b744419917d.png " v! @8 z  j* a/ N; L6 g( Q5 u
# Q6 [* S. [) K, l9 M2 m) I9 @
在时钟树中配置
# V6 }; O! x) l
; I* T1 @- s2 a7 I. S7 R 6dc407bd84d746068f97974dc0d25dfa.png
0 J! k! i( g& Q) ^9 ]8 w7 e% g% Z# {$ Z- b
生成代码
% k4 L( J3 I. z
# F# k* S, t3 a9 c( q e4b2f77be5fb44f4834e8d2ec108654b.png
! O4 y$ I+ w4 Q3 g/ j) l+ K5 ~4 F! \& M  P
37b60cc243bc4864a45296d6b6f2cd58.png
+ @8 I: j0 k0 N! T6 r
- ]8 L3 o3 w; l1 }* V, Q8 |# @. R使用Keil打开生成的代码进行编辑9 n  `2 B8 h4 k# z" e
打开文件
% e$ r2 p7 v+ X8 G1 _! P1 ^- I& P3 U
d8aefff5af4d4af7af0131fb0758c228.png
8 n1 t1 i% ]$ J  Q* R" g' ~) w! g3 O5 ^! ^- q  A1 C2 M# A
代码编写7 v3 B3 N+ b! Z% {/ b/ L5 U8 Z
在/* USER CODE BEGIN WHILE */与/* USER CODE END WHILE */中while循环下编写
& V3 T2 |( r7 K+ `3 B: C  M
  1. if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)  // 如果按键被按下5 ~+ u( f( E  c( B+ k6 c8 |5 s1 I
  2. {
    ) e- O" P$ [  \1 A0 S/ ]- G# C% z
  3.         HAL_Delay(10);  // 消抖处理$ @3 T9 Q1 p; f  a+ H
  4.         if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)  // 如果此时依然为低电平
    8 d- ]4 l% {9 f% ]! a. d
  5.         {. n  q+ y9 J& T
  6.                 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);  // 翻转此引脚电平9 j: j" J* t8 u6 u
  7.                 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);  // 翻转此引脚电平; y; M6 }  Q2 X% r5 W3 O
  8.                 while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET);  // 松开按键后再执行下一轮循环2 S% I8 }( }* s
  9.         }* j6 J% g4 l# U8 Y/ f! z; G: i
  10. }
复制代码
6 k: Q3 x& C. P  }5 N( }0 X
编译代码, I, S6 y# [$ u1 l0 ]
& x0 w/ @8 X, n2 o5 g
38225350580b4b7f8f21a193bc31be79.png # R. r, _; u# s! r; B
( i: ^2 h) }, H! y
Proteus中仿真
4 B. y9 x9 y( r1 B& Q) i新建工程# O3 y; f, q! E7 g2 j. D% y9 d
% ?+ T! L; ^8 y1 f' g
1fee45c2f0824ce18f2caa998f52415b.png
* i6 Y8 i9 k8 q
1 l( ?/ @& i* ~  H3 j9 ~7 |( t工程向导
' S5 p3 n- V% j一直选择默认,在Firmware中按照以下配置,最后单击完成
; [* ?. N8 V) n
+ W' s5 ]" h$ _" W ec2b004db6c74d0986015909f2e61b26.png
# K7 ?6 A/ T: O& W+ c2 C2 z6 [( a5 o- W
注意:应当尽量使CubeMX中选择的开发板与仿真时选择的开发板一致
5 p6 I% n: |; p
8 @" n1 v' M9 ]! m  O5 x( o仿真电路图搭建4 z+ ^  N2 O4 z" D: F* j& n
0 g& ]: |4 y$ {' P+ W! c5 E! \
8bc017a55c0c4fb98c04f6150940a1c6.png
! f9 G3 q4 [: p* }# R& W0 {2 a$ L
& p+ [/ V- Q* L+ P3 c其中接地线在
2 t; k1 d. n; D" c  Z" a+ `5 l
$ A+ I8 E5 O; R: I d7071ed45011412cb2c143d3f8446af7.png
3 g! r2 B: h! j  C/ A( g2 W3 N" g( ]. q+ s& A" U. i6 \
搭建完毕后双击开发板,引入编译代码后产生的hex文件# ~5 J8 ^) z. ~0 s6 R
: E9 R0 W2 ]- b
462dd57710fa4b42947ce62c1c07eeff.png
# j, R  R8 w7 d; z* Y/ s0 X- D0 H" N. B/ K1 @
点击左下角开始模拟0 z; T, @2 q" U: L* \0 I" L2 v, h
0 b* f" S* P" j3 U
未按按键时,灯为亮的状态0 D' ~+ t5 R; Y; \2 Z

8 C& ^" I9 V1 h6 y 593645e9644d4ddf8ddd0b0a6da83761.png
2 I4 |6 p4 K( Q' F$ f( O* D- S+ N/ p. i( Z: n) s; }
按一次按键后,灯熄灭( f5 j& ]  X' C% n1 A' B

: u; Z6 U/ P0 } 7a362137065c4be680b15c882f46eb8b.png # a- [* b, R+ }2 _
9 _! P6 C, A0 M& t8 @
————————————————9 w7 W5 v7 L' g  C" D( |0 c0 c
版权声明:m0_56450064
- l, N' b9 o/ T' J2 H& H: B0 p+ h7 t
" f/ N4 f" B( I4 g& R4 Z" d
收藏 评论0 发布时间:2022-11-24 15:39

举报

0个回答

所属标签

相似技术帖

官网相关资源

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