只有当使用事件控制寄存器、复用重映射和调试寄存器以及外部中断寄存器的时候,才需要提前开启AFIO的时钟! 并不是使用到引脚复用功能就必须开启AFIO时钟。
第一步
配置RCC,将涉及到的外设的时钟都打开 ;(开启AFIO、GPIO时钟) NVIC和EXTI这两个外设时钟始终是打开的因此他们两个不需要开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
第二步
配置GPIO, 将端口设置成输入模式;(因为是通过外接对射式红外传感器中断次数传输到32)
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
第三步
配置AFIO,选择用的这一路GPIO连接到后面的EXTI;(设置gpio线路要中断的引脚配置)
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource10);
第四步
配置EXTI的选择边沿触发模式(上升沿、下降沿、双边沿)和选择触发响应模式(中断响应、事件响应);
//外部中断配置exti
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line10;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
第五步
配置NVIC,给中断选择一个合适的优先级;
最后就能通过NVIC外部中断信号进入CPU,CPU接收中断信号,从中断函数里面执行中断程序
NVIC_InitTypeDef NVIC_InitStruct;
//选择分组2完成,这个分组方式整个芯片只能用一种 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;
//指定抢占优先级
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStruct);
需要注意的是 NVIC支持多达20个软件的中断/事件请求
但是 exti9_5 exti15_10是共用同一个通道
后面根据选择通道设置一个中断函数(中断函数不需要在.H文件中声明)
//中断函数一般都是无参无返回
void EXTI15_10_IRQHandler(void)
{
//先进行一个中断标志位的判断
if(EXTI_GetITStatus(EXTI_Line10)==SET)
{ CountSenor_Num++;
EXTI_ClearITPendingBit(EXTI_Line10);
}
}