一、外部中断/事件控制器(EXTI)
STM32F103C8T6 有19个能产生事件/中断请求的边沿检测器。每个输入先可以独立地配置输入类型(事件——脉冲或中断——挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态先的中断请求。
二、开启外设时钟,配置好结构体成员参数,初始化
GPIOA端口第10引脚,下降沿触发(外部唤醒线是边沿触发,这些线上不能出现毛刺信号)
//外部中断需要开启AFIO时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//所需引脚时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
//定义外部中断线结构体
EXTI_InitTypeDef EXTI_InitStructure;
//中断线
EXTI_InitStructure.EXTI_Line=EXTI_Line10;
//触发模式:事件或者中断
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
//触发边沿
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
//开启外部中断
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
//初始化结构体参数
EXTI_Init(&EXTI_InitStructure);
三、设置中断优先级
//配置优先级分组:抢占优先级(x)和子优先级(4-x)共分配4个位
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
//定义、配置中断优先级结构体
NVIC_InitTypeDef NVIC_InitStructure;
//中断通道
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
//抢占优先级1
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
//子优先级2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
//开启EXTI15_10_IRQn中断
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
//初始化结构体
NVIC_Init(&NVIC_InitStructure);
四、中断服务函数
void EXTI15_10_IRQHandler(void)
{
//触发中断
if(EXTI_GetITStatus(EXTI_Linex)==SET)
{
中断处理
}
//清除标志位
EXTI_ClearITPendingBit(EXTI_Line10);
}