STM32使用按键控制LED实验

STM32使用按键控制LED实验

本次实验硬件:STM32F103C8T6核心板,按键(微动开关),面包板。

根据原理图可知,LED对应的引脚是PC13,且LED已接 3.3V 电源,如果PC13设置为推挽输出(Push-Pull Output),那么当PC13引脚输出高电平时LED灯熄灭,PC13输出低电平时LED点亮。如果PC13设置为开漏输出,如果我们控制输出为0,低电平,LED点亮,如果控制输出为1,那么引脚既不输出高电平,也不输出低电平,可以视为一个高电阻。

这里选择推挽输出。

在STM32CubeMX中配置PC13:

使用PA11引脚连接按键开关,设置为GPIO输入模式。

STM32的GPIO有浮空输入(Floating Input)、上拉输入(Input Pull-up)、下拉输入(Input Pull-down)和模拟输入(Analog Input)

模式 内部电阻 电平默认状态 典型应用场景
浮空输入 悬空 外部明确驱动(如I2C)
上拉输入 上拉 高电平 按键接地触发
下拉输入 下拉 低电平 按键接电源触发
模拟输入 ADC/DAC信号输入

根据原理图,按键接地触发,选择上拉输入。

在STM32CubeMX中配置PA11:

由于内部上拉电阻的原因,现在PA11默认是高电平,当按键开关按下后,因为接地原因,PA11会变成低电平。

完成配置后生成代码。

gpio.c中看到GPIO的初始化

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void MX_GPIO_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOD_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);

  /*Configure GPIO pin : PC13 */
  GPIO_InitStruct.Pin = GPIO_PIN_13;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  /*Configure GPIO pin : PA11 */
  GPIO_InitStruct.Pin = GPIO_PIN_11;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

}

HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);被默认设置为高电平,如果你在这里修改为低电平,将代码导入主板后,LED灯默认是点亮的。

main.c中添加代码

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_RESET)
        {
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
        }
        else
        {
            HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET);
        }
  }
  /* USER CODE END 3 */

if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_RESET)判断PA11是否是低电平,即按键是否被按下,如果是低电平则通过HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);将PC13设置为低电平。

编译并导入代码。按下按键后LED点亮,松开按键后LED灯熄灭。

如果我们将上面的if语句修改成if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_11) == GPIO_PIN_SET),即如果PA11是高电平,那么LED点亮。编译导入,运行代码,即可发现LED默认是点亮的,按下按键后,PA11变成低电平,LED熄灭,松开按键后LED点亮。