帮我写一个stm32外部中断按键控制led灯亮灭的代码
时间: 2024-12-12 22:28:11 浏览: 28
STM32_外部中断之按键控制点亮LED灯
5星 · 资源好评率100%
在STM32微控制器上,通过外部中断(EXTI)控制LED灯的亮灭需要连接按键和LED到相应的GPIO引脚,并设置中断处理函数。以下是一个基本的示例代码片段,假设我们使用STM32F103C8T6,GPIOA用于接LED,PA5作为中断引脚,按键连接到INT0:
```c
#include "stm32f1xx_hal.h"
// 宏定义GPIO配置
#define LED_PIN GPIO_PIN_5
#define KEY_PIN EXTI_PIN_0
#define LED_GPIO_PORT GPIOA
#define KEY_GPIO_PORT EXTI_GPIO_Port
// 定义中断处理函数
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(KEY_GPIO_PORT, EXTI_IT_FALLING) != RESET) {
// 按键按下,LED亮起
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_SET);
// 清除中断标志
EXTI_ClearITPendingBit(KEY_GPIO_PORT, EXTI_IT_FALLING);
} else if (EXTI_GetITStatus(KEY_GPIO_PORT, EXTI_IT_RISING) != RESET) {
// 按键释放,LED熄灭
HAL_GPIO_WritePin(LED_GPIO_PORT, LED_PIN, GPIO_PIN_RESET);
// 清除中断标志
EXTI_ClearITPendingBit(KEY_GPIO_PORT, EXTI_IT_RISING);
}
}
int main(void)
{
// 初始化硬件资源
HAL_Init();
SystemClock_Config();
// 配置LED和按键中断
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pin = LED_PIN | KEY_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; //推挽输出
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.Pin = KEY_PIN;
EXTI_InitStruct.Line = EXTI_Line0;
EXTI_InitStruct.Mode = EXTI_Mode FallingEdge; //下降沿触发
EXTI_InitStruct.Interrupt = EXTI_Int_Enable;
EXTI_InitStruct.Event = EXTI_Event_IRQn; //对应中断向量
HAL_EXTI_Init(&EXTI_InitStruct);
// 设置中断服务函数
NVIC_SetPriority(EXTI0_IRQn, 0); // 设置中断优先级
HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 开启中断
while (1) {
// 主程序循环,不做其他操作,等待按键触发
}
return 0;
}
// 中断向量函数模板
void EXTI0_IRQn(void) interrupt 4
{
EXTI0_IRQHandler(); // 调用自定义中断处理函数
}
```
请根据实际硬件连接和你的STM32库文件调整上述代码。记得检查GPIO和EXTI初始化是否成功,以及中断相关的NVIC配置。
阅读全文