基于stm32标准库写一个用两个按键利用中断的方式控制两个LED的代码
时间: 2024-11-20 14:34:31 浏览: 62
基于STM32的标准库编写一个基本的中断驱动程序,用于控制两个LED灯的开关,通常会涉及到GPIO配置、中断配置以及中断服务函数。这里提供一个简化版的示例代码,假设我们有两颗LED连接到PA0和PA1,以及两个按键连接到PB0和PB1:
```c
#include "stm32f1xx.h"
// LED GPIO初始化
#define LED_PIN_GPIO_PORT GPIOB
#define LED_PIN_1 GPIO_Pin_0 // 连接到PA0
#define LED_PIN_2 GPIO_Pin_1 // 连接到PA1
// 按键GPIO初始化
#define KEY_PIN_GPIO_PORT GPIOA
#define KEY_PIN_1 GPIO_Pin_0 // 连接到PB0
#define KEY_PIN_2 GPIO_Pin_1 // 连接到PB1
#define KEY_INTERRUPT_LINE EXTI_Line0 // PB0对应的EXTI线
// 定义中断处理函数
void EXTI0_IRQHandler(void)
{
static bool ledState1 = false;
if (GPIO_ReadInputDataBit(KEY_PIN_GPIO_PORT, KEY_PIN_1)) {
ledState1 = !ledState1; // 按下时改变LED1状态
GPIO_SetBits(LED_PIN_GPIO_PORT, LED_PIN_1); // 设置对应LED亮
GPIO_ResetBits(LED_PIN_GPIO_PORT, LED_PIN_2); // 另一LED灭
}
}
void EXTI1_IRQHandler(void)
{
static bool ledState2 = false;
if (GPIO_ReadInputDataBit(KEY_PIN_GPIO_PORT, KEY_PIN_2)) {
ledState2 = !ledState2; // 按下时改变LED2状态
GPIO_SetBits(LED_PIN_GPIO_PORT, LED_PIN_2); // 设置对应LED亮
GPIO_ResetBits(LED_PIN_GPIO_PORT, LED_PIN_1); // 另一LED灭
}
}
int main(void)
{
// 初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = LED_PIN_1 | LED_PIN_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(LED_PIN_GPIO_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = KEY_PIN_1 | KEY_PIN_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(KEY_PIN_GPIO_PORT, &GPIO_InitStructure);
// 配置EXTI中断
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = KEY_INTERRUPT_LINE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
// 开启中断
NVIC_EnableIRQ(EXTI0_IRQn);
NVIC_EnableIRQ(EXTI1_IRQn);
while (1)
{
// 主循环,不做其他操作
}
return 0;
}
阅读全文