一、EXTI框图
二、EXTI初始化结构体
三、应用
目标:按键按下时,反转LED状态。
1. 编程流程
- 初始化连接到 EXTI 的 KEY
- 连接 EXTI 中断源 到 key0、key1 引脚
- 初始化EXTI,用于产生中断事件
- 初始化 NVIC,用于处理中断
- 编写中断服务函数
2. 代码总结
- key.c
#include "key.h"
static void KEY_NVIC_Config(void);
void KEY_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_AHB1PeriphClockCmd(KEY0_CLK | KEY1_CLK, ENABLE); // 开启 GPIO 外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // 开启 EXTI 时钟
/* 1. 初始化连接到 EXTI 的 KEY */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // 输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; // 确保按键未按下时,GPIO引脚能保持稳定的电平状态。
GPIO_InitStructure.GPIO_Pin = KEY0_PIN;
GPIO_Init(KEY0_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = KEY1_PIN;
GPIO_Init(KEY1_PORT, &GPIO_InitStructure);
/* 连接 EXTI 中断源 到 key0、key1 引脚 */
SYSCFG_EXTILineConfig(KEY0_EXTI_PORTSOURCE, KEY0_EXTI_PINSOURCE);
SYSCFG_EXTILineConfig(KEY1_EXTI_PORTSOURCE, KEY1_EXTI_PINSOURCE);
/* 2. 初始化 EXTI */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 中断模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 下降沿触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能
EXTI_InitStructure.EXTI_Line = KEY0_EXTI_LINE;
EXTI_Init(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = KEY1_EXTI_LINE;
EXTI_Init(&EXTI_InitStructure);
/* 3. 初始化 NVIC,用于处理中断 */
KEY_NVIC_Config();
}
void KEY_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); // 配置中断优先级分组
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 主优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannel = KEY0_EXTI_IRQ; // 中断通道
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = KEY1_EXTI_IRQ;
NVIC_Init(&NVIC_InitStructure);
}
- key.h
#ifndef __KEY_H
#define __KEY_H
#include "stm32f4xx.h"
#define KEY0_CLK RCC_AHB1Periph_GPIOH
#define KEY0_PORT GPIOH
#define KEY0_PIN GPIO_Pin_3
#define KEY0_EXTI_LINE EXTI_Line3
#define KEY0_EXTI_PORTSOURCE EXTI_PortSourceGPIOH
#define KEY0_EXTI_PINSOURCE EXTI_PinSource3
#define KEY0_EXTI_IRQ EXTI3_IRQn
#define KEY0_EXTI_IRQHANDLER EXTI3_IRQHandler
#define KEY1_CLK RCC_AHB1Periph_GPIOH
#define KEY1_PORT GPIOH
#define KEY1_PIN GPIO_Pin_2
#define KEY1_EXTI_LINE EXTI_Line2
#define KEY1_EXTI_PORTSOURCE EXTI_PortSourceGPIOH
#define KEY1_EXTI_PINSOURCE EXTI_PinSource2
#define KEY1_EXTI_IRQ EXTI2_IRQn
#define KEY1_EXTI_IRQHANDLER EXTI2_IRQHandler
void KEY_Config(void);
#endif
- stm32f4xx_it.c文件添加如下内容
#include "key.h"
#include "led.h"
void KEY0_EXTI_IRQHANDLER(void)
{
if(EXTI_GetITStatus(KEY0_EXTI_LINE) != RESET)
{
LED0_TOGGLE; // 翻转LED状态
}
EXTI_ClearFlag(KEY0_EXTI_LINE); // 清除中断标志位
}
void KEY1_EXTI_IRQHANDLER(void)
{
if(EXTI_GetITStatus(KEY1_EXTI_LINE) != RESET)
{
LED1_TOGGLE;
}
EXTI_ClearFlag(KEY1_EXTI_LINE);
}
- main.c
#include "stm32f4xx.h"
#include "led.h"
#include "key.h"
int main(void)
{
GPIO_Config();
KEY_Config();
while(1)
{
}
}
- 编译运行即可