使用中断回调函数STM32三个按钮控制三个LED灯
时间: 2023-06-24 15:07:17 浏览: 102
中断-按键控制LED灯
好的,这里提供一个基于STM32的代码示例,实现三个按钮控制三个LED灯,使用中断回调函数。
首先需要初始化GPIO口和中断,然后编写中断回调函数。在回调函数中,检测是哪个按键被按下,然后设置对应的LED灯状态。
以下是示例代码:
```c
#include "stm32f10x.h"
void GPIO_Configuration(void);
void EXTI_Configuration(void);
void NVIC_Configuration(void);
int main(void)
{
GPIO_Configuration(); // 初始化GPIO口
EXTI_Configuration(); // 初始化中断
NVIC_Configuration(); // 初始化NVIC
while (1) {
// 主函数中不需要做什么事情
}
}
// 初始化GPIO口
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// 使能GPIO口的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);
// 配置LED灯对应的GPIO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置按键对应的GPIO口
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
// 初始化中断
void EXTI_Configuration(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
// 使能AFIO的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
// 配置按键对应的中断线路
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource0);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource1);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);
// 配置中断线路对应的中断事件
EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1 | EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
// 初始化NVIC
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// 配置中断优先级
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// 配置中断通道
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn | EXTI1_IRQn | EXTI2_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) {
// 检测到按键0被按下
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_0)));
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
void EXTI1_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line1) != RESET) {
// 检测到按键1被按下
GPIO_WriteBit(GPIOA, GPIO_Pin_1, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1)));
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
void EXTI2_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line2) != RESET) {
// 检测到按键2被按下
GPIO_WriteBit(GPIOA, GPIO_Pin_2, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2)));
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
```
在上面的代码中,我们使用了 `GPIO_InitStructure` 、`EXTI_InitStructure` 和 `NVIC_InitStructure` 这三个结构体来配置GPIO口、中断和NVIC。在 `GPIO_Configuration` 函数中,我们使用了 `GPIO_InitStructure` 来初始化LED灯和按键对应的GPIO口。
在 `EXTI_Configuration` 函数中,我们使用了 `EXTI_InitStructure` 来初始化中断线路对应的中断事件,以及使用 `GPIO_EXTILineConfig` 来将按键对应的GPIO口连接到中断线路上。
在 `NVIC_Configuration` 函数中,我们使用了 `NVIC_InitStructure` 来配置中断优先级和中断通道。
最后,在三个中断回调函数中,我们使用了 `GPIO_WriteBit` 来设置LED灯的状态,并使用了 `EXTI_GetITStatus` 和 `EXTI_ClearITPendingBit` 来清除中断标志位。
以上就是基于STM32的代码示例,实现三个按钮控制三个LED灯,使用中断回调函数的全部内容。
阅读全文