单片机-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钳在低电平 |
| 输入 | 模拟输入 | 模拟信号读取 |

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

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

相关推荐
FakeOccupational27 分钟前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存(D-Cache)结构+MPU+DMA&Cache+STM32CubeMX配置
笔记·stm32·缓存
殷忆枫1 小时前
基于K210与STM32的智能垃圾分类与物联网监管系统
stm32·物联网·分类
周洲08302 小时前
STM32 GPIO 外部中断深度解析:边沿触发 / 电平触发、NVIC 优先级配置、中断嵌套实战
stm32·单片机·嵌入式硬件
LCG元2 小时前
STM32F103 CAN 总线通信实战:标准库双机通信与过滤器配置精讲
stm32·单片机·嵌入式硬件
zlinear数据采集卡3 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
Kuakewei8884 小时前
平芯微42V热拔插OVP过压保护芯片:PW1600
嵌入式硬件
ACP广源盛139246256734 小时前
WAIC2026 国产超节点算力浪潮下@ACP#IX9104 在算力矩阵中的定位与落地场景
大数据·数据库·人工智能·嵌入式硬件·线性代数·矩阵
z20348315204 小时前
STM32单片机控制无源蜂鸣器播放《晴天》
stm32·单片机·嵌入式硬件
国科安芯6 小时前
详解ADC 规则组外部触发:CH2、CH3 与 TRGO2
运维·网络·单片机·嵌入式硬件·mcu·系统架构
ACP广源盛139246256736 小时前
WAIC2026 国产算力浪潮@ACP#YLB3118 在算力矩阵中的存储定位与落地场景
大数据·人工智能·分布式·单片机·嵌入式硬件