嵌套向量中断控制器(NVIC)
外部中断/事件控制器(EXTI)
外部中断初始化函数
初始化IO口为输入
KEY_Init();
开启复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //外部中断,需要使能AFIO时钟
初始化中断线
EXTI_InitTypeDef EXTI_InitStructure; //外设EXTI的初始化变量
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); //GPIO与中断线映射,PA0
//外设EXTI的初始化变量成员
EXTI_InitStructure.EXTI_Line=EXTI_Line0; //选择了待使能或者失能的外部线路
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //被使能线路的模式
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //被使能线路的触发边沿
EXTI_InitStructure.EXTI_LineCmd = ENABLE; //定义选中线路的新状态
EXTI_Init(&EXTI_InitStructure); //初始化外设EXTI寄存器
WK_UP高电平有效,故上升沿触发;
KEY0和KEY1低电平有效,故下降沿触发;
初始化中断分组
NVIC_InitTypeDef NVIC_InitStructure; //外设NVIC的初始化变量
//外设NVIC的初始化变量成员
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //选择待使能或失能的外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //先占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //定义选中通道的新状态
NVIC_Init(&NVIC_InitStructure); //初始化外设NVIC寄存器
中断服务函数
中断服务函数的名字是在MDK中事先有定义的,STM32的IO口外部中断函数只有6个:
EXTI0_IRQHandler、EXTI1_IRQHandler、EXTI2_IRQHandler、EXTI3_IRQHandler、EXTI4_IRQHandler
EXTI9_5_IRQHandler、EXTI15_10_IRQHandler
中断线0-4每个中断线对应一个中断函数;
中断线5-9共用中断函数EXTI9_5_IRQHandler;
中断线10-15共用中断函数EXTI15_10_IRQHandler;
注意
中断函数无需再exit.h文件中进行声明;
重要函数
ITStatus EXTI_GetITStatus(u32 EXTI_Line) //检查指定的EXTI线路触发请求发生与否
void EXTI_ClearITPendingBit(u32 EXTI_Line) //清除EXTI线路挂起位
中断服务函数格式
void EXTI2_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line2)!=RESET) //判断某个线上的中断是否发生
{
中断逻辑
EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE上的中断标志位
}
}
外部中断实验---->WK_UP的中断服务函数:WK_UP同时控制DS0和DS1,按一次,它们的状态就翻转一次。
void EXTI0_IRQHandler(void)
{
delay_ms(10); //先延时10ms,再判断是否为高电平,消抖
if(WK_UP==1)
{
LED0=!LED0;
LED1=!LED1;
}
EXTI_ClearITPendingBit(EXTI_Line0); //清除EXTI0线路挂起位
}
主函数
中断优先级分组函数放在含中断设置的初始化函数前面;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组2
EXTIX_Init(); //外部中断初始化