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点亮。