1、EXTI 简介
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性
EXTI 功能框图
EXTI 可分为两大部分功能,一个是产生中断,另一个是产生事件,这两个功能从硬件上就有所不同。
产生中断线路目的是把输入信号输入到 NVIC,进一步会运行中断服务函数,实现功能,这样是软件级的。
而产生事件线路目的就是传输一个脉冲信号给其他外设使用,并且是电路级别的信号传输,属于硬件级的。
另外,EXTI 是在 APB2 总线上的,在编程时候需要注意到这点。
2、中断/事件线
EXTI 有 20 个中断/事件线,每个 GPIO 都可以被设置为输入线,占用 EXTI0 至EXTI15,还有另外七根用于特定的外设事件
EXTI0 可以通过 AFIO 的外部中断配置寄存器 (AFIO_EXTICR1)的EXTI0[3:0]位选择配置为 PA0、PB0、PC0、PD0、PE0、PF0、PG0、PH0 或者 PI0
2、EXTI 初始化结构体详解
1 typedef struct {
2 uint32_t EXTI_Line; // 中断/事件线
3 EXTIMode_TypeDef EXTI_Mode; // EXTI 模式
4 EXTITrigger_TypeDef EXTI_Trigger; // 触发类型
5 FunctionalState EXTI_LineCmd; // EXTI 使能
6 } EXTI_InitTypeDef;
- EXTI_Line:EXTI 中断/事件线选择,可选 EXTI0 至 EXTI19,可参考表 18-1 选择。
- EXTI_Mode:EXTI 模式选择,可选为产生中断(EXTI_Mode_Interrupt)或者产生事件(EXTI_Mode_Event)。
- EXTI_Trigger:EXTI 边沿触发事件,可选上升沿触发(EXTI_Trigger_Rising)、下降沿触发 ( EXTI_Trigger_Falling) 或者上升沿和下降沿都触发( EXTI_Trigger_Rising_Falling)。
- EXTI_LineCmd:控制是否使能 EXTI 线,可选使能 EXTI 线(ENABLE)或禁用(DISABLE)。
1. 编程要点
- 初始化用来产生中断的 GPIO;
- 初始化 EXTI;
- 配置 NVIC;
- 编写中断服务函数;
按键和 EXTI 宏定义
1 //引脚定义
2 #define KEY1_INT_GPIO_PORT GPIOA
3 #define KEY1_INT_GPIO_CLK (RCC_APB2Periph_GPIOA\
4 |RCC_APB2Periph_AFIO)
5 #define KEY1_INT_GPIO_PIN GPIO_Pin_0
6 #define KEY1_INT_EXTI_PORTSOURCE GPIO_PortSourceGPIOA
7 #define KEY1_INT_EXTI_PINSOURCE GPIO_PinSource0
8 #define KEY1_INT_EXTI_LINE EXTI_Line0
9 #define KEY1_INT_EXTI_IRQ EXTI0_IRQn
10
11 #define KEY1_IRQHandler EXTI0_IRQHandler
12
13
14 #define KEY2_INT_GPIO_PORT GPIOC