利用外部中断功能实现1个或两个按键控制stm32f407的三个led流水灯方向代码
时间: 2024-12-02 19:19:36 浏览: 42
STM32_外部中断之按键控制点亮LED灯
5星 · 资源好评率100%
在STM32F407微控制器上,我们可以使用外部中断功能(INTERRUPT)配合GPIO口来实现按键控制LED流水灯的方向。这里是一个简单的示例代码,假设我们有两枚按键(KP1和KP2)分别控制LED灯的前进和后退方向,以及三个LED灯(LED1、LED2和LED3)。以下是基于Keil uVision IDE的一个基础框架:
```c
#include "stm32f4xx.h"
// 定义GPIO和中断配置
#define KEY_PIN GPIO_Pin_0 // 示例按键A连接到PA0
#define LEDS [3] = {GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3} // LED1-3连接到PB1-PB3
#define LED_GPIO_PORT GPIOB
#define KEY_GPIO_PORT GPIOA
// 中断标志和结构体
volatile bool keyPress[KP_NUM] = {false};
EXTI_HandleTypeDef extiHandle;
void EXTI_Configuration(void) {
GPIO_InitTypeDef gpioInitStruct;
// 初始化GPIO用于输入模式
gpioInitStruct.Pin = KEY_PIN;
gpioInitStruct.Mode = GPIO_MODE_IT_FALLING;
gpioInitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(KEY_GPIO_PORT, &gpioInitStruct);
for (int i = 0; i < ARRAY_SIZE(LEDS); ++i) {
gpioInitStruct.Pin = LEDS[i];
HAL_GPIO_Init(LED_GPIO_PORT, &gpioInitStruct);
}
// EXTI初始化
extiHandle.Instance = EXTI9_5_IRQn; // 根据实际中断线选择
extiHandle.Init.Pin = KEY_PIN;
extiHandle.Init.Line = EXTI_Line_0;
extiHandle.Init.TypeEXTI = EXTI_TYPE_RISING;
extiHandle.Init.Polarity = EXTI_POLARITY_LOW;
extiHandle.Init.Edge = EXTI_EDGE_FALLING;
HAL_EXTI_Init(&extiHandle);
}
void Key_ISR() {
if (HAL_GPIO_ReadPin(KEY_GPIO_PORT, KEY_PIN)) {
if (!keyPress[0]) {
keyPress[0] = true; // 按下时置位标志
switchDirection(); // 调用切换方向函数
}
} else {
keyPress[0] = false; // 松开时清零标志
}
}
void SwitchDirection() {
int ledIndex = 0;
if (keyPress[1]) { // 如果按下KP2,则改变方向
ledIndex = (ledIndex + 1) % ARRAY_SIZE(LEDS); // 循环计数,改变LED顺序
}
HAL_GPIO_ToggleBits(LED_GPIO_PORT, LEDS[ledIndex]); // 控制LED灯方向
}
int main(void) {
HAL_Init();
SystemClock_Config();
EXTI_Configuration(); // 初始化中断和GPIO
while (1) {
HAL_GPIO_ToggleBits(LED_GPIO_PORT, LEDS[0]); // 自动循环点亮第一个LED
}
return 0;
}
阅读全文