外部中断/事件控制器包含多达 19 个用于产生事件/中断请求的边沿检测器。 每根输入线都可单独进行配置, 以选择类型( 中断或事件) 和相应的触发事件( 上升沿触发、 下降沿触
发或边沿触发) 。 每根输入线还可单独屏蔽。 挂起寄存器用于保持中断请求的状态线。其中有16条是对应于GPIO的
内核中会有一个NVIC( 嵌套向量中断控制器) 来管理所有的中断, 并对中断进行分组和优先级的分配。
Cortex-M3内核总共可以分0...7总共八组, 而STM32单片机只使用其中5组
一。外部中断的配置使用
如果是事件触发中断,需要进行外部事件是什么,如按键触发中断,则按键的引脚是IO几,通过观察状态线对应的GPIO进行选择IO口映射到的外部中断线
(一).外部中断初始化
1.打开AFI0和IO端口时钟
2.IO口初始化--按键是输入模式:如果按键函数单独配置了,这里可以省略IO口配置。
3.IO口映射到外部中断线上GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);或是AFIO->EXTICR[0] &=~ (0xf<<0);
4.选择中断源,开放中断请求,设置优先级,设置优先级分组NVIC_SetPriorityGrouping(5);//占先:2位 次级:2位,中断管理使能---------------寄存器配置
44。配置外部中断 EXTI_InitTypeDef EXTI_InitStruct;,,设置优先级NVIC_InitTypeDef NVIC_InitStruct;,设置优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);-----------库函数配置

void Exti0_Init(void)
{
#if reg_progream
//使能AFIO时钟 PA端口时钟
RCC->APB2ENR |= (1<<0)|(1<<2);
// //PA0浮空输入
// GPIOA->CRL &=~(0xf<<0);
// GPIOA->CRL |= (0x4<<0);
//IO口映射到外部中断线EXTI0 PA0 -- EXI0
AFIO->EXTICR[0] &=~ (0xf<<0);
//选择中断源
EXTI->FTSR |= (1<<0);
//开放中断请求
EXTI->IMR |= (1<<0);
// //设置优先级分组
// NVIC_SetPriorityGrouping(5);//占先:2位 次级:2位
//设置优先级 01 01
NVIC_SetPriority(EXTI0_IRQn,5);
//中断管理使能
NVIC_EnableIRQ(EXTI0_IRQn);
#else
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
//IO口映射到外部中断线EXTI0
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);
//配置外部中断
EXTI_InitStruct.EXTI_Line = EXTI_Line0; //中断线
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;//中断
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发
EXTI_InitStruct.EXTI_LineCmd = ENABLE; //开放中断请求
EXTI_Init(&EXTI_InitStruct);
// //设置优先级分组 :占先:2位 次级:2位
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//设置优先级
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; //中断向量表中的位置
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01;//占先优先级 01
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01; //次级优先级 01
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStruct);
#endif
}
(二)中断服务函数
1、 进入中断服务函数要先清除中断标志位
2、 中断服务函数无参数、 无返回值
3、 快进快出( 中断服务函数最好不要加延时)
4、 中断服务函数不声明不调用
配置过程:
1.先判断中断是否产生
2.产生的话清中断标志位

void EXTI0_IRQHandler(void)
{
#if reg_progream
if(EXTI->PR &(1<<0))//判断中断是否产生
{
EXTI->PR |= (1<<0);//清中断
printf("中断产生
");
}
#else
if(EXTI_GetITStatus(EXTI_Line0)==SET)
{
EXTI_ClearITPendingBit(EXTI_Line0);//清中断
printf("中断产生
");
}
#endif
}