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

STM32按键控制

[复制链接]
STMCU小助手 发布时间:2022-11-24 15:39
按键扫描的基本原理5 H& i  m: R+ z% Z
按键信号的识别:一般来说,按键的两个引脚的一端通过电阻上拉到高电平,另一端则接地。接上拉电阻时在没有按键按下的时候,输入引脚为高电平,当有按键按下,输入引脚则为低电平;接下拉电阻时在没有按键按下的时候,输入引脚为低电平,当有按键按下,输入引脚则为高电平。; Q( |5 L; t/ E+ V; q( t0 G
通过反复读取按键输入引脚的信号,然后识别高低电平来判断是否有按键触发。
1 l0 I# V; q. ~1 L3 I& x为什么去抖动:按键的输入引脚有低电平产生不代表一定是有按键按下,也许是干扰信号,因此,需要通过去抖动处理,将这些干扰信号过滤,从而获得真实的按键触发信号。( P" n# f  V5 X% ?" i
如何去抖动:首次检测到按键输入引脚有低电平后,稍作延时,再次读取该引脚,如还是低电平,则确认为按键触发信号;否则,判断为干扰信号,不予处理。
8 _/ U- e7 x" m/ AHAL库中关于GPIO的3个重要函数6 [; v& G' D! C1 g' Y8 T! \
电平输出函数7 X! J* t6 V  V! a$ G# b" m
void HAL_GPIO_WritePin( GPIO_TypeDef* GPIOx, uint16_t GPIo_Pin, GPIO_PinState PinState);
3 @) t- U+ p; }* |/ a, G电平翻转函数6 m* H4 {' T8 p- M2 |9 a
void HAL_GPIO_TogglePin( GPIO_TypeDef*GPIOx,uint16_t GPIO_Pin);
. [) [( n) U" G2 \) W: O0 d电平输入函数
9 C0 T5 H3 x6 }" x. g: p+ c$ m/ mGPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPlOx,uint16_t GPIO_Pin);
2 X* Y- t0 |1 E! w' z如:判断PC13引脚的输入信号,若为高电平,则将PB9引脚控制的LED灯的开关状态切换。- p9 |8 M0 o+ D: R7 _5 ]
  1. if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == GPIO_PIN_SET)& `# c' C$ d6 ^
  2. {
    8 l' Z& x3 p3 _0 a2 n  }) ~: E1 B
  3.         HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);6 z5 G0 e- n$ E3 I8 s7 A
  4. }
复制代码
! }' t2 n/ Y. d
按键控制实验设计# [. t; i; P8 `( ]9 {9 c, }  S
使用图形化的配置工具CubeMX进行硬件配置
- ~4 h! a1 u/ d
首先新建一个项目
5 l+ Q; g9 _' W0 l* V  h
/ g; S6 C# n4 R/ r: w8 E+ ^: U bbbbe8480e054d60b743ef49a69582f4.png 8 E5 i" ]( v6 b1 q7 u1 s+ e: _

+ f, X# J. V& q; d- G5 G& Y选择芯片
6 C$ X) g4 s# U& f( {" D9 k  i  k
4 V2 ]1 v% Y# ^: `4 b! x$ H$ v 3bf496df40fb48a4864ba08dbb271121.png 3 ~* C- \4 l. C

8 o6 Z% a( _% Y- L8 z1 y进入以下引脚界面,开始配置工作& E4 F- _4 @8 s& x3 n8 t
3 y8 Y2 d, }. e9 T3 b
46c3ffe4762c4874b995f6315f1a557e.png
% F( t8 ?* b8 E' k( L( H" d" i" v2 L; [9 `/ [
引脚配置: ?4 i9 ]" [. [/ S7 s$ y
PB8和PB9为output模式,PC13和PB1为input模式0 i4 _7 B0 c2 y& Y. M- k. R

' d; s! L% |) e1 P: E* F, a 5e80f01e2bdf44daa4dffbc958b58591.png
$ G! h) b( q* S* @. [$ v# p  m: E1 }4 {2 }8 ]& i% j$ s
系统配置,选择SWD接口的仿真器,Debug中选择Serial Wire0 `3 m, {9 Z" q% B' z& X( B

' R0 R9 I, r% d' n, o2 T b04e2f6497184331934b821496c30018.png % F# m2 c2 o1 G

! k* O3 x  s; W/ m选择使用外部晶振1 h- y/ V( W8 V, x/ X4 K+ ?8 I4 |
  ]9 m/ _/ }3 g
fd01b8062a084d44aec7944620bd55f0.png
" k2 @( s- j- _# N, s* b5 ]
( o; J+ t2 P$ a$ D" q6 _将PB1和PC13设置为上拉模式1 B. p& s! @9 b+ ]4 ]) B7 x6 g: _# [
" V, b7 s$ D; W
223672854e334fec963c7b744419917d.png . u; M- ]5 r* |, ]- }3 U
6 R$ H' N7 u% K% U
在时钟树中配置
; L/ u. M  j4 y
# j5 k8 }  P. i. f 6dc407bd84d746068f97974dc0d25dfa.png
" c$ ^& s$ J3 ]  f- q; c% O' P! Y- t! O8 x3 S7 u" z
生成代码
/ Y; _9 ]0 `  j" i
/ M4 @# y: f3 o3 v e4b2f77be5fb44f4834e8d2ec108654b.png
) d- a! ?& c2 S) N4 a) ?- f: ~( D1 s/ H  X' T
37b60cc243bc4864a45296d6b6f2cd58.png
  }& H/ U) A* e8 N
8 }$ m+ \7 Y: m4 [使用Keil打开生成的代码进行编辑
' }' S$ e5 N; s0 Q+ i* Z& ~打开文件
% _/ X5 k3 I* Q2 n1 x
3 C4 y9 w1 n9 B/ ?1 C! u d8aefff5af4d4af7af0131fb0758c228.png
" K- |& ^; w9 s
+ o, t% {; }: m0 ^: ^9 P; n6 E* U& e( @代码编写2 |0 k7 ]; E+ L8 C& Q
在/* USER CODE BEGIN WHILE */与/* USER CODE END WHILE */中while循环下编写
/ D6 [; |& d& M4 X+ g
  1. if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)  // 如果按键被按下- g0 O0 ^' m, j" V$ m4 r- W
  2. {
    ; H0 ^' [" O  H( s
  3.         HAL_Delay(10);  // 消抖处理. F( [3 [4 h: h" e
  4.         if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET)  // 如果此时依然为低电平: Y4 a, ?  K- j/ y" A/ ]
  5.         {
    1 b) J! `2 X" M# T2 O. G  G
  6.                 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);  // 翻转此引脚电平' }- u1 ~8 _# U, [
  7.                 HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_9);  // 翻转此引脚电平
    7 D# W: Y2 B! O) v
  8.                 while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET);  // 松开按键后再执行下一轮循环
    ; n& E4 k$ `  D0 q; ^# R" K, F
  9.         }
    " j* n1 L+ j: b  J1 }
  10. }
复制代码

5 u+ h* Y. f3 ?5 g& V# Q编译代码" [1 A4 z) G% ^8 y) }7 d4 r
1 L9 M. G3 ]. y# l8 A
38225350580b4b7f8f21a193bc31be79.png 8 i1 x7 Y- f! D. Z

+ V7 u  d3 S9 ~# ?. mProteus中仿真) Z/ E& k" C6 x: r9 ]3 ~
新建工程. k5 S" H0 Y! E
$ ~9 [; U0 U" S  W. c" f% }
1fee45c2f0824ce18f2caa998f52415b.png
$ X9 v4 ~0 n! l# {- i. l/ J: O9 `8 q6 H
工程向导" f! I/ c. o2 N# M2 I( r
一直选择默认,在Firmware中按照以下配置,最后单击完成) I. x& M8 _8 m" z3 s7 f

; x7 L0 c* ?, T0 ]& B ec2b004db6c74d0986015909f2e61b26.png / e% Q$ @8 o+ J( R

1 f) p; x% S% {! {4 W% _. V注意:应当尽量使CubeMX中选择的开发板与仿真时选择的开发板一致: m% K  F- Z: D
; d% `, \: h/ q2 c) @5 O: @& T
仿真电路图搭建
" Z# d: a1 b' W/ Z3 s+ q& `$ V$ e2 y& e8 S( z% B
8bc017a55c0c4fb98c04f6150940a1c6.png
8 K  m, W2 ]# k( I( e, p: Y  K6 s, L: J1 f8 I& P
其中接地线在. j; [: A+ I" N0 \( ^4 Y9 t. O; ]

$ `# [; J. _: V$ Z! i8 A d7071ed45011412cb2c143d3f8446af7.png ; j) H  |3 `! N
- ~7 e: d9 @8 ?
搭建完毕后双击开发板,引入编译代码后产生的hex文件
1 @# v+ _. P% |4 m: q: `9 S$ h0 z, S! t5 B0 c+ g
462dd57710fa4b42947ce62c1c07eeff.png ' G* A' T5 a1 z: S

6 x0 I+ F1 w% m点击左下角开始模拟
. R: B  [& Y9 s  x) T- K- o; G5 \+ Q" M1 a4 E1 n
未按按键时,灯为亮的状态5 X8 \$ x8 b& \: p2 `) n
) a; \' ~9 W( o8 n) P' U+ J
593645e9644d4ddf8ddd0b0a6da83761.png
0 m- W# j) e9 e: X6 I: @7 V+ J6 ?; W$ o
按一次按键后,灯熄灭
3 u$ c6 ~) F2 X
: j  h- U  m2 X8 x 7a362137065c4be680b15c882f46eb8b.png : J% }/ c2 r( n5 U% W1 P0 N$ `
* s( u; t- {8 p1 k2 E3 l
————————————————6 A7 `3 _" c% n6 f+ v, S
版权声明:m0_56450064
- o# ^1 T5 f, v
3 T6 v+ U/ S. L3 w# T6 F0 y  _& E( `! B- }/ }
赞 收藏 评论0 发布时间:2022-11-24 15:39

举报

0个回答

所属标签

相似技术帖

官网相关资源

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