stm32外部中断按键实现一个按键控制一个LED灯的亮灭
时间: 2023-09-01 20:08:49 浏览: 185
stm32实现LED灯亮灭
5星 · 资源好评率100%
好的,这是一个基于STM32的外部中断和GPIO口实现按键控制LED灯亮灭的简单例程。
首先需要配置GPIO口和外部中断。以下是初始化代码:
```c
GPIO_InitTypeDef GPIO_InitStruct = {0};
EXTI_InitTypeDef EXTI_InitStruct = {0};
NVIC_InitTypeDef NVIC_InitStruct = {0};
// 使能GPIO时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
// 配置按键引脚为输入
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// 使能外部中断时钟
__HAL_RCC_SYSCFG_CLK_ENABLE();
// 配置外部中断线路
EXTI_InitStruct.Line = EXTI_LINE_0;
EXTI_InitStruct.Mode = EXTI_MODE_INTERRUPT;
EXTI_InitStruct.Trigger = EXTI_TRIGGER_FALLING;
EXTI_InitStruct.Pull = EXTI_PULLUP;
HAL_EXTI_SetConfigLine(&EXTI_InitStruct, EXTI_CONFIG_PORT_A);
// 配置中断优先级
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
HAL_NVIC_Init(&NVIC_InitStruct);
```
以上配置将PA0引脚配置为输入模式,并且使用上拉电阻使其默认为高电平。然后配置外部中断触发条件为下降沿触发,并且使能该中断的优先级。
接下来是中断处理函数的实现:
```c
void EXTI0_IRQHandler(void)
{
HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 切换LED灯的状态
HAL_Delay(100); // 延时一段时间,消除按键抖动
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); // 清除中断标志
}
```
中断处理函数中,首先使用`HAL_GPIO_TogglePin()`函数切换LED灯的状态,然后使用`HAL_Delay()`函数延时一段时间,消除按键的抖动。最后使用`HAL_GPIO_EXTI_IRQHandler()`函数清除中断标志位。
最后,在`main()`函数中使用以下代码启动程序:
```c
int main(void)
{
HAL_Init();
SystemClock_Config();
GPIO_Init();
while (1)
{
}
}
```
`GPIO_Init()`函数中可以初始化LED灯的输出口:
```c
GPIO_InitTypeDef GPIO_InitStruct = {0};
// 使能GPIO时钟
__HAL_RCC_GPIOC_CLK_ENABLE();
// 配置LED引脚为输出
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 初始状态关闭LED灯
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_RESET);
```
以上就是按键控制LED灯亮灭的简单例程。当按下按键时,LED灯会切换亮灭状态。
阅读全文