一:EXTI 简介
STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个用于产生事件/中断请求的边沿检测器。
EXTI 的每根输入线都可单独进行配置,以选择类型(中断或事件)和相应的触发事件(上升
沿触发、下降沿触发或边沿触发),还可独立地被屏蔽。
二:EXTI 配置步骤
(EXTI 相关库函数在 stm32f10x_exti.c 和stm32f10x_exti.h 文件中)
(1)使能 IO 口时钟,配置 IO 口模式为输入
(2)开启 AFIO 时钟,设置 IO 口与中断线的映射关系
1、使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
2、将端口A 映射 引脚0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource15);
(3)配置中断分组(NVIC),使能中断
EXTI产生中断线 ---> 流向NVIC
NVIC初始化
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //EXTI15 中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化 VIC 寄存器
(4)初始化 EXTI,选择触发方式
文件在stm32f10x_exti.c和 stm32f10x_exti.h 当中
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
函数形参是有一个结构体 EXTI_InitTypeDef 类型的指针变量
typedef struct
{
uint32_t EXTI_Line; //中断/事件线
EXTIMode_TypeDef EXTI_Mode; //EXTI 模式
EXTITrigger_TypeDef EXTI_Trigger; //EXTI 触发方式
FunctionalState EXTI_LineCmd; //中断线使能或失能
}EXTI_InitTypeDef;
EXTI_Line:EXTI 中断/事件线选择,可配置参数为 EXTI0-EXTI20,可参考上表。
EXTI_Mode:EXTI 模式选择,可以配置为中断模式 EXTI_Mode_Interrupt 和事件模式 EXTI_Mode_Event。
EXTI_Trigger:触发方式选择,可以配置为上升沿触发 EXTI_Trigger_Rising、下降沿触发 EXTI_Trigger_Falling、上升沿和下降沿触EXTI_Trigger_Rising_Falling 。
EXTI_LineCmd:中断线使能或者失能,配置 ENABLE 为使能,DISABLE 为失能,我们这里要使用外部中断,所以需使能
(5)编写 EXTI 中断服务函数
中断服务函数名是固定的,在开始文件startup_stm32f10x_md.s 当中寻找
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
EXTI15_10_IRQHandler
stm32f10x_exti.h 函数
stm32f10x_exti.h 函数
将外设 EXTI 寄存器重设为缺省值
void EXTI_DeInit(void);
根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器
void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);
把 EXTI_InitStruct 中的每一个参数按缺省值填入
void EXTI_StructInit(EXTI_InitTypeDef* EXTI_InitStruct);
产生一个软件中断
void EXTI_GenerateSWInterrupt(uint32_t EXTI_Line); EXTI_Line:待使能或者失能的 EXTI 线路
检查指定的 EXTI 线路标志位设置与否
FlagStatus EXTI_GetFlagStatus(uint32_t EXTI_Line);EXTI_Line:待检查的 EXTI 线路标志位
清除 EXTI 线路挂起标志位
void EXTI_ClearFlag(uint32_t EXTI_Line);EXTI_Line:待清除标志位的 EXTI 线路
检查指定的 EXTI 线路触发请求发生与否
ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);EXTI_Line:待检查 EXTI 线路的挂起位
清除 EXTI 线路挂起位
void EXTI_ClearITPendingBit(uint32_t EXTI_Line);EXTI_Line:待清除 EXTI 线路的挂起位