stm32按键中断控制多个led灯代码
时间: 2023-10-10 20:13:25 浏览: 166
以下是一个简单的示例,演示如何使用STM32的按键中断来控制多个LED灯的状态:
```c
#include "stm32f10x.h"
#define LED1_PIN GPIO_Pin_12
#define LED2_PIN GPIO_Pin_13
#define BUTTON_PIN GPIO_Pin_0
void GPIO_Config(void);
void EXTI_Config(void);
void NVIC_Config(void);
int main(void) {
GPIO_Config();
EXTI_Config();
NVIC_Config();
while(1) {
}
}
void GPIO_Config(void) {
//开启GPIOB和AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
//配置LED1和LED2引脚为推挽输出模式
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = LED1_PIN | LED2_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//配置BUTTON引脚为浮空输入模式
GPIO_InitStructure.GPIO_Pin = BUTTON_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void EXTI_Config(void) {
//开启AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//配置BUTTON引脚为中断输入模式
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
//配置BUTTON引脚对应的EXTI线路
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
void NVIC_Config(void) {
//配置BUTTON引脚对应的NVIC中断
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void EXTI0_IRQHandler(void) {
if(EXTI_GetITStatus(EXTI_Line0) != RESET) {
//切换LED1和LED2的状态
GPIOB->ODR ^= LED1_PIN;
GPIOB->ODR ^= LED2_PIN;
//清除中断标志位
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
```
在上面的示例中,我们首先定义了LED1_PIN、LED2_PIN和BUTTON_PIN分别代表LED1的引脚、LED2的引脚和按键的引脚。然后在GPIO_Config函数中,我们开启了GPIOB和AFIO时钟,并分别配置了LED1、LED2和BUTTON引脚的模式。
接着,在EXTI_Config函数中,我们开启了AFIO时钟,并将BUTTON引脚配置为中断输入模式,同时配置了按键触发的中断类型为上升沿和下降沿。
最后,在NVIC_Config函数中,我们开启了BUTTON引脚对应的NVIC中断,并设置了中断优先级。
当按键被按下时,EXTI0_IRQHandler函数会被调用。在该函数中,我们切换了LED1和LED2的状态,并清除了中断标志位。这样,每次按键被按下时,LED1和LED2的状态就会发生反转。