江科大学习笔记 _3.外部中断配置
例:开启PB14的引脚的 接收外部信号 中断
1. 开启RCC时钟,挂载在APB2总线上
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
2. 开启AFIO时钟,挂载在APB2总线上
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
EXTI和NVIC在STM32中不需要手动开启
3. 选择EXTI外设中断线,并配置EXTI
AFIO的配置文件和GPIO在一个函数里
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
配置EXTI
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line14;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStruct);
4. 配置NVIC
在内核函数库里(misc.h)
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//这个函数在整个程序里只要配置一次
NVIC_InitTypeDef NVIC_InitStruct;
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);
4步后,中断程序开启,接下来就需要编写中断函数
每一个中断通道都对应一个中断函数
void EXTI15_10_IRQHandler(void)
{
//因为EXTI10--15都能进这个中断函数,所以先判断是不是EXTI14进的中断
if(EXTI_GetITStatus(EXTI_Line14) == SET)
{
EXTI_ClearITPendingBit(EXTI_Line14);//关闭这个中断,否则一直在中断中
}
}