当前位置: 首页 > backend >正文

单片机-STM32部分:7、GPIO输入 按键

飞书文档https://x509p6c8to.feishu.cn/wiki/RtuVw6GgZiuwyBkxmdDcdsAFnKk

根据原理图,找到KEY1对应的PC3

找到CubeMX中的PC3,设置为GPIO_Input

右击,修改引脚名称为KEY1

或者在GPIO配置属性中修改

  • 引脚模式:这里默认为输入模式,不可更改。 
  • 开启引脚外部浮空/上拉/下拉:

模式的作用?
设置为浮空模式,IO会变成高阻态,IO电平由外部电平决定。
设置为上拉模式,在无外部信号输入时,IO电平是高电平。
设置为下拉模式,在无外部信号输入时,IO电平是低电平。

如何选择?
所以我们可以根据原理图设计选择,
如果外部是有上拉的,我们可以选择浮空。
如果外部没有上下拉的,内部就选择上下拉,钳住IO电平,让IO信号更稳定
-外部有效信号是高的,选择下拉。
-外部有效信号是低的,选择上拉。
因为我们电路已经有上拉电阻,这里可以选择浮空即可。  

TTL肖特基触发器:信号经过触发器后,模拟信号转化为0和1的数字信号。

  • 用户别名设置:设置为KEY1

同时按上节课的知识,添加LED作为测试效果展示

然后点击右上角"GENERATE CODE"生成代码

生成成功后,如果我们没打开Keil,可以点击Open Project,如果已经打开了Keil,可以点击Close,切换到Keil界面

这时会有很多弹窗告诉我们,说某个文件被修改了,是否重新加载,我们全部选择“是”即可。

然后在gpio.c文件中,我们就可以看到生成的代码

void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};//xxx__HAL_RCC_GPIOA_CLK_ENABLE();//xxxx/*Configure GPIO pin : PtPin */GPIO_InitStruct.Pin = KEY1_Pin;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_NOPULL;HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct);//xxxx
}

此时,如果我们需要读取IO的值,如何读取呢

/*** @brief  Reads the specified input port pin.* @param  GPIOx: where x can be (A..G depending on device used) to select the GPIO peripheral* @param  GPIO_Pin: specifies the port bit to read.*         This parameter can be GPIO_PIN_x where x can be (0..15).* @retval The input port pin value.*/
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)

所以我们可以实现读取按键是否按下,设置LED亮灭功能

  while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == 0) //判断按键KEY是否被按下{HAL_Delay(10);//延时10ms消除按键抖动if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == 0){    //再次判断按键KEY是否依然被按下HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);      //对LED引脚进行取反操作while(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == 0);  //等待按键抬起}}}/* USER CODE END 3 */

参考工程

见飞书文档

补充:模拟输入

在我们需要读取模拟量时,例如ADC或DAC的功能,就需要把IO设置为模拟数据,后续ADC章节讲解。

简单总结下这两节课学习的输出和输入功能,我们就可以知道什么时候用哪种模式:

输出/输入类型

具体应用场景

输出

开漏输出

如果需要不等同于VCC的输出电压,或者是线与功能,选择开漏输出。

特点:输出高电平由外部上拉电压决定,低电平为GND

推挽输出

非开漏输出场景时,选择推挽输出。

特点:输出高电平为VCC,低电平为GND

复用开漏输出

不作为通用IO口使用时,需要不同电压输出或线与功能,选择复用开漏输出

例如:I2C需要支持线与功能

复用推挽输出

不作为通用IO口使用时,不需要线与或者不同电压的输出,选择复用推挽输出

例如:UART的TX 、CAN的TX、SDIO等

输入

浮空输入

当外部有上下拉时,可以选择浮空输入

特点:IO会变成高阻态,在没有信号输入时,电平由外部上下拉决定。

上拉输入

当外部没有上下拉时,如果外部有效信号是低电平,选择上拉输入。

特点:在没有信号输入时,可以把IO钳在高电平

下拉输入

当外部没有上下拉时,如果外部有效信号是高电平,选择下拉输入。

特点:在没有信号输入时,可以把IO钳在低电平

模拟输入

模拟信号读取

疑惑:为什么没有复用输入功能的配置?

因为复用输入是直接连接的,没有可配置的地方,也不需要配置。

http://www.xdnf.cn/news/4524.html

相关文章:

  • ()初始化 和 { }初始化
  • PostgreSQL中“参数默认值实现伪重载“详解
  • Unable to ping server at localhost:1099解决
  • 【Linux庖丁解牛】—程序地址空间【进程地址空间 | 虚拟地址空间】
  • 每日一题洛谷P1025 [NOIP 2001 提高组] 数的划分c++
  • Python打卡 DAY 18
  • MySQL核心机制:日志系统、锁机制与事务管理的深度剖析
  • 六个仓库合并为一个仓库,保留master和develop分支的bat脚本
  • llama-Factory不宜直接挂接Ollama的大模型
  • 互联网大厂Java求职面试:分布式系统中向量数据库与AI应用的融合探索
  • FastDFS,分布式文件存储系统,介绍+配置+工具类
  • upload-labs靶场通关详解:第一关
  • 远程访问代理+内网穿透:火山引擎边缘网关助力自部署模型公网调用与全链路管控
  • 阿维塔汽车CAN总线数据适配技术解析与免破线数据采集实践
  • 模型中台建设全流程指南
  • [逆向工程]什么是 Process Explorer
  • 智慧系统搭建平台有哪些?2025智慧系统搭建平台推荐?智慧系统搭建平台TOP10全面解析
  • ERP源码?ERP系统是什么?能够解决什么问题?
  • 使用 Python 与 Java 实现接入 AI 大模型的 MCP 协议:原理与实战
  • 「动态规划」线性DP:股票问题合集 / LeetCode 121|122|123|188 (C++)
  • 密码学基石:哈希、对称/非对称加密与HTTPS实践详解
  • Charles 如何高效监控特定域名
  • BGP路由反射器
  • Linux 内核对 ARM 大小核架构的支持
  • B树如何用于磁盘 ,B+树为如何用于数据库
  • 源雀SCRM开源·AI企微客服|RAG知识中枢+自训练闭环
  • 汽车生产DV与PV验证
  • MongoDB培训文档大纲(超详细)
  • 基于大模型的子宫平滑肌瘤全周期预测与诊疗方案研究
  • 第4章 递推法