【STM32】当按键具有上拉电阻时GPIO应该配置什么模式?怎么用按键去控制LED翻转?

当按键具有上拉电阻时,可以通过正确配置STM32的GPIO端口和编写相应的控制代码来实现按键控制LED灯的功能。具体来说,需要配置按键所连接的GPIO端口为输入模式,并启用内部上拉电阻,这样在按键未操作时该端口保持高电平状态,当按键被按下时,端口电平被拉低,从而能够被STM32检测到。

首先,对于按键具有上拉电阻的情况,需要将按键所连接的GPIO端口配置为输入模式,并开启内部上拉电阻。这样,当按键未操作时,由于上拉电阻的存在,GPIO端口会保持高电平。而当按键被按下时,GPIO端口会被拉低,形成低电平信号。这种配置确保了在无按键操作时,端口状态是确定且可预测的。

其次,在编程处理按键信号时,通常会加入软件去抖逻辑。这是因为机械按键在实际操作中容易因为接触弹跳而产生快速多次的通断动作,这会导致MCU误判为多次按键操作。通过在检测到按键按下的低电平信号后加入短暂的延时(如5-10毫秒),然后再检测一次按键状态,可以有效避免因机械抖动造成的误触发。

在实现上述基础功能的同时,还可以根据实际需求进一步优化和扩展功能。例如,可以增加对长按、双击等操作的支持,或者与其他传感器、输入设备协同工作,以实现更复杂的控制逻辑和更丰富的用户交互体验。另外,合理使用中断而非轮询方式来处理按键事件,也可以有效提高系统响应速度并减少CPU占用率。

综上所述,通过合理配置GPIO端口为输入模式并启用内部上拉电阻,以及精心编写去抖和按键处理逻辑,可以实现STM32中按键控制LED灯的功能。这些操作不仅保证了系统对按键动作的准确识别和响应,也为开发者提供了进一步优化和功能扩展的基础。

具体按键控制LED翻转代码如下:

#include "stm32f10x.h" // 引入STM32F10x系列微控制器的标准外设库头文件// 定义按键和LED对应的GPIO引脚
#define KEY_PIN GPIO_Pin_0
#define LED_PIN GPIO_Pin_1
#define KEY_GPIO_PORT GPIOA
#define LED_GPIO_PORT GPIOBvoid GPIO_Config(void) {GPIO_InitTypeDef GPIO_InitStructure; // 定义GPIO初始化结构体变量// 初始化按键对应的GPIO引脚为输入模式,并启用内部上拉电阻RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟GPIO_InitStructure.GPIO_Pin = KEY_PIN; // 设置引脚为KEY_PINGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 设置为上拉输入模式GPIO_Init(KEY_GPIO_PORT, &GPIO_InitStructure); // 初始化GPIOA的KEY_PIN引脚// 初始化LED对应的GPIO引脚为输出模式RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能GPIOB时钟GPIO_InitStructure.GPIO_Pin = LED_PIN; // 设置引脚为LED_PINGPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 设置为推挽输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 设置输出速度为50MHzGPIO_Init(LED_GPIO_PORT, &GPIO_InitStructure); // 初始化GPIOB的LED_PIN引脚
}int main(void) {// 初始化硬件和外设GPIO_Config(); // 调用GPIO配置函数进行初始化while (1) {// 检测按键是否按下if (GPIO_ReadInputDataBit(KEY_GPIO_PORT, KEY_PIN) == Bit_RESET) {// 按键按下,翻转LED状态GPIO_WriteBit(LED_GPIO_PORT, LED_PIN, (BitAction)(1 - GPIO_ReadOutputDataBit(LED_GPIO_PORT, LED_PIN)));// 延时一段时间,防止抖动for (uint32_t i = 0; i < 100000; i++);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/875294.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis 7.x 系列【30】集群管理命令

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 集群信息2.1 CLUSTER INFO 3. 节点管理3.1 CLUSTER MYID3.2 CLUSTER NODES3…

LC617-合并二叉树

文章目录 1 题目描述2 思路优化代码完整输入输出 参考 1 题目描述 https://leetcode.cn/problems/merge-two-binary-trees/description/ 给你两棵二叉树&#xff1a; root1 和 root2 。 将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另…

mysql设置root密码

mysql设置root密码 在MySQL中设置root用户的密码可以通过几个简单的步骤完成。以下是在已经安装并启动MySQL的情况下如何设置root密码的方法: 1. 登录到MySQL服务器 首先,使用以下命令以root身份登录到MySQL服务器。系统会提示你输入密码,如果是第一次登录或者还没有设置…

sql 常用建表脚本

建表 CREATE TABLE your_table (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(255),remark remark TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ); 已有表添加字段 ALTER TABLE y…

数据结构排序合集(笔记)

目录 一.插入排序与希尔排序 二.选择排序与堆排序 三.冒泡排序和快速排序 四.归并排序 五.计数排序 一.插入排序与希尔排序 时间复杂度空间复杂度稳定性插入排序O&#xff08;N^2&#xff09;O(1)稳定希尔排序O(N^1.3)O(1)不稳定 插入排序&#xff1a; 希尔排序&#xff…

报红:找不到名称ref ts(2304)、‘ref‘ is not defined. eslint(no-undef)

接上篇 在上篇介绍了使用 unplugin-auto-import 和 unplugin-vue-components 配置完成后&#xff0c;项目可以正常运行&#xff0c;并且页面也正常显示&#xff0c;但vscode里就是报红 这个报红可能是由于 ts 发出的&#xff0c;也可能是由于 eslint 发出的 具体可以用鼠标…

打卡第22天------回溯算法

开始学习了,希望我可以尽快成功上岸! 一、回溯理论基础 什么是回溯法?回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 回溯是递归的副产品,只要有递归就会有回溯。 回溯法的效率回溯法的本质是穷举,穷举所有可能,然后找出我们想要的答案。如果想让回溯法高效一些,可…

Docker-Compose实现MySQL之主从复制

1. 主服务器(IP:192.168.186.77) 1.1 docker-compose.yml services:mysql-master:image: mysql:latest # 使用最新版本的 MySQL 镜像container_name: mysql-master # 容器的名称environment:MYSQL_ROOT_PASSWORD: 123456 # MySQL root 用户的密码MYSQL_DATABASE: masterd…

我用Tauri开发的待办效率工具开源了!

开源仓库地址 gitee Git仓库地址:https://gitee.com/zhanhongzhu/zhanhongzhu.git 应用地址 windows应用地址下载 https://kestrel-task.cn 具体内容 也可以看&#x1f389;使用Taurivitekoa2mysql开发了一款待办效率应用 这篇文章。 &#x1f4bb;技术栈 Tauri: Tauri…

传统自然语言处理(NLP)与大规模语言模型(LLM)详解

自然语言处理&#xff08;NLP&#xff09;和大规模语言模型&#xff08;LLM&#xff09;是理解和生成人类语言的两种主要方法。本文将介绍传统NLP和LLM的介绍、运行步骤以及它们之间的比较&#xff0c;帮助新手了解这两个领域的基础知识。 传统自然语言处理&#xff08;NLP&…

Angular中component和directive的区别?

在Angular中&#xff0c;Component和Directive都是重要的构建块&#xff0c;用于构建和组织应用程序的UI。然而&#xff0c;它们有不同的用途和特点。以下是Component和Directive的主要区别&#xff1a; Component&#xff08;组件&#xff09; 1、定义&#xff1a;Component…

采集PCM,将base64片段转换为wav音频文件

需求 开始录音——监听录音数据——结束录音 在监听录音数据过程中&#xff1a;客户端每100ms给前端传输一次数据&#xff08;pcm数据转成base64&#xff09;&#xff0c;前端需要将base64片段解码、合并、添加WAV头、转成File、上传到 OSS之后将 url 给到服务端处理。 {num…

Redis分布式系统中的主从复制

本篇文章主要对Redis的主从复制进行讲解。主要分析复制的原理&#xff0c;包括:建立复制、全量复制、部分复制、全量复制、心跳检测等。希望本篇文章会对你有所帮助。 文章目录 一、主从复制简介 二、配置主从复制模式 断开主从复制 安全性 只读 传输延迟 三、拓扑结构 四、主…

【git】太大了失败: fatal: fetch-pack: invalid index-pack output

#‘’ Git仓库过大致使clone失败的解决方法 上述大神的方法&#xff0c;亲测有效 中途失败: 太大了 fetch-pack: unexpected disconnect while reading sideband packet fatal: early EOF fatal: fetch-pack: invalid index-pack output关闭压缩 git config --global core.…

如何利用VPN和NAT技术实现高效安全的网络连接

文章目录 **什么是VPN&#xff1f;****专用地址的使用****VPN的工作原理****远程接入VPN****VPN的应用实例****什么是NAT&#xff1f;****NAT的工作原理****NAPT&#xff08;网络地址与端口号转换&#xff09;****NAT的优势和局限****NAT的应用实例****VPN和NAT的结合****常见问…

C++ | Leetcode C++题解之第279题完全平方数

题目&#xff1a; 题解&#xff1a; class Solution { public:// 判断是否为完全平方数bool isPerfectSquare(int x) {int y sqrt(x);return y * y x;}// 判断是否能表示为 4^k*(8m7)bool checkAnswer4(int x) {while (x % 4 0) {x / 4;}return x % 8 7;}int numSquares(i…

详细带你彻底搞懂 Spring Security 6.0 的实现原理

​ 博客主页: 南来_北往 系列专栏&#xff1a;Spring Boot实战 前言 Spring Security 6.0是一个功能强大且可扩展的身份验证和访问控制框架&#xff0c;它用于保护基于Java的应用程序。其主要目标是提供一个全面的安全解决方案&#xff0c;包括身份验证、授权、防止跨站请…

IPv6过渡技术之网络工程师软考中级

IPv6过渡技术 IPv4/IPv6双栈 1.设备支持IPV4/IPv6&#xff0c;IPv4及IPv6在网络中独立部署&#xff0c;在一段时间内并存。对现有IPv4业务影响较小。 2.演进方案相对简单、易理解。网络规划设计工作量相对更少 3.现有软硬件(网络设备、终端、操作系统等)已经有很大一部分支持…

IDEA-安装插件 驼峰下划线转换

第一步&#xff1a;安装 file-settings-plugins-在marketplace搜索“CamelCase”-点击安装 第二步&#xff1a;设置 file-settings-editor-camel_case 第三步&#xff1a;使用 选中想转换的遍历 使用快捷键 Alt Shift U

用excel能做出这些报表吗?

用excel能做出这些报表吗&#xff1f; 有什么办法不安装OFFICE也能显示出来&#xff1f;