STM32 proteus + STM32Cubemx仿真教程(第二课按键教程)


前言

本篇文章开始带大家学习如何使用proteus和STM32Cubemx来完成STM32的学习,第二节课我们先来学习按键的用法。

proteus使用8.9版本。

STM32Cubemx使用6.3版本。

一、STM32按键的原理

GPIO引脚配置为输入模式

首先,需要将STM32的某个GPIO引脚配置为输入模式,以便读取按键的状态。通常情况下,按键有两种连接方式:

上拉电阻连接方式:按键一端接地,另一端接GPIO引脚,同时GPIO引脚内部启用上拉电阻。当按键未按下时,GPIO引脚为高电平;按键按下时,GPIO引脚为低电平。

下拉电阻连接方式:按键一端接电源(如3.3V),另一端接GPIO引脚,同时GPIO引脚内部启用下拉电阻。当按键未按下时,GPIO引脚为低电平;按键按下时,GPIO引脚为高电平。

二、STM32Cubemx创建工程

在这里的话我们可以把之前的工程复制过来就行了,在原来的基础上我们对他进行修改即可。

在这里插入图片描述
选择一个引脚作为输入引脚

在这里插入图片描述

三、proteus仿真电路图

找到按键:
在这里插入图片描述
放置按键:

这里需要注意按键的使用的时候需要加上上拉或者是下拉电阻,防止按键处于悬空状态。

在这个电路图中当按下按键时PC6接地表现出低电平,当松开按键时PC6通过上拉电阻连接到了电源,所以此时按键表现为高电平。
在这里插入图片描述

四、程序代码编写

4.1函数介绍

HAL_GPIO_ReadPin函数
HAL_GPIO_ReadPin函数用于读取指定GPIO引脚的电平状态。

函数原型

GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

参数说明

GPIOx: 指定GPIO端口基地址,具体可以是GPIOA, GPIOB, GPIOC等。
GPIO_Pin: 指定GPIO引脚,使用宏定义,如GPIO_PIN_0, GPIO_PIN_1等。

返回值

GPIO_PIN_RESET(低电平)
GPIO_PIN_SET(高电平)

4.2使用按键点亮LED灯

在这里插入图片描述

这里需要注意在使用按键的时候需要进行消抖处理:

按键在机械结构上的设计导致了其在按下和释放时可能会产生抖动现象。抖动是指在按键触点闭合或断开时,触点会在短时间内快速地多次接触和断开,导致检测到的按键信号在短时间内出现多次高低电平的变化。消抖处理的主要原因包括以下几个方面:

  1. 抖动的原因
    机械结构的自然特性:按键的触点在按下和释放的过程中并不是立即稳定在某个位置,而是会发生短时间的颤动。
    弹簧或金属片回弹:按键内部的弹簧或金属片在按压和松开过程中会回弹,这会导致触点短时间内多次接触和断开。
  2. 抖动的影响
    多次检测按键按下:如果不进行消抖处理,当按键按下一次时,系统可能会检测到多次按下信号,导致按键事件被误认为是多次按下。
    误触发:抖动可能会导致不正确的按键事件触发,比如在抖动期间误认为按键已经松开。
    系统稳定性:频繁的抖动信号会增加系统的处理负担,影响系统的稳定性和可靠性。
  3. 消抖处理的方法
    消抖处理的方法主要有硬件消抖和软件消抖。

3.1 硬件消抖
硬件消抖是通过硬件电路来过滤掉按键抖动信号,常用的方法包括:

电容消抖:在按键电路中并联一个电容,利用电容的充放电特性来平滑按键信号。
施密特触发器:使用施密特触发器电路将抖动信号转换为稳定的高低电平信号。

3.2 软件消抖
软件消抖是通过编程手段在软件层面过滤掉按键抖动信号,常用的方法包括:

延时法:检测到按键状态变化后,延时一段时间(如10ms),再次检测按键状态,如果状态没有变化,则认为按键状态有效。
计数法:连续多次读取按键状态,只有在连续多次读取到相同状态时,才认为按键状态有效。
状态机法:使用状态机来管理按键状态的变化,只有在状态稳定时才进行按键处理。

总结

本篇文章就讲解到这里,大家有什么疑问都可以留言。

本篇文章代码和工程将放在微信公众号中。

回复 STM32仿真按键即可领取源码和工程。

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 20:22:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 20:22:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 20:22:04       87 阅读
  4. Python语言-面向对象

    2024-06-09 20:22:04       96 阅读

热门阅读

  1. 力扣面试题17.18.最短超串

    2024-06-09 20:22:04       34 阅读
  2. leetcode 1514.概率最大的路径

    2024-06-09 20:22:04       32 阅读
  3. C语言中的变量和常量是什么,以及它们的区别

    2024-06-09 20:22:04       22 阅读
  4. cocos入门8:向量叉乘

    2024-06-09 20:22:04       33 阅读
  5. Mybatis-plus 自动填充字段

    2024-06-09 20:22:04       29 阅读
  6. 345_C++_共享缓冲区管理类shared_buffer

    2024-06-09 20:22:04       27 阅读