stm32项目按键控制led灯亮灭(中断法)
时间: 2025-05-20 11:22:15 浏览: 15
### STM32按键控制LED灯亮灭的中断法实现
在STM32项目开发中,使用中断法可以有效减少CPU资源占用并提高响应速度。以下是基于STM32F407芯片及其HAL库,利用STM32CubeMX配置工具完成的一个具体实例,展示如何通过外部中断来实现按键控制LED灯的亮灭功能。
#### 配置GPIO与EXTI(外部中断)
首先,在STM32CubeMX中设置PE2和PE3作为输入引脚用于检测按键状态,并启用对应的外部中断线。同时,将PF9和PF10配置为输出模式以驱动LED灯[^1]。
```c
// 初始化函数由STM32CubeMX自动生成
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOE_CLK_ENABLE(); // 启用PE端口时钟
__HAL_RCC_GPIOF_CLK_ENABLE(); // 启用PF端口时钟
/* PE2 和 PE3 设置为输入 */
GPIO_InitStruct.Pin = GPIO_PIN_2 | GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发中断
GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉电阻
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
/* PF9 和 PF10 设置为推挽输出 */
GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);
}
```
#### 编写中断服务程序ISR
当按下按钮时,会产生一个下降沿信号从而触发相应的中断处理函数。在此函数内部切换目标LED的状态。
```c
// 定义全局变量记录当前LED状态
uint8_t LED_State_PF9 = 0;
uint8_t LED_State_PF10 = 0;
/**
* @brief 处理来自PE2的外部中断请求
*/
void EXTI2_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); // 调用HAL库的标准接口清除标志位
}
/**
* @brief 实际执行的动作部分
*/
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_2) {
LED_State_PF9 ^= 1; // 切换状态
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_9, LED_State_PF9 ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
}
/**
* @brief 类似于上述针对另一个按键的功能定义
*/
void EXTI3_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_3) {
LED_State_PF10 ^= 1;
HAL_GPIO_WritePin(GPIOF, GPIO_PIN_10, LED_State_PF10 ? GPIO_PIN_SET : GPIO_PIN_RESET);
}
}
```
以上代码片段展示了完整的初始化过程以及中断回调机制的设计思路[^1]。
---
### 问题
阅读全文
相关推荐


















