嵌套向量中断控制器
特性
●68个可屏蔽中断通道(不包含16个Cortex™-M3的中断线);
● 16个可编程的优先等级(使用了4位中断优先级);
外部中断/事件控制器框图
外部中断程序设计思路:
中断初始化,主要是完善三个结构体:
①GPIO_InitTypeDef (功能:IO配置)
②EXTI_InitTypeDef (功能:中断配置)
③NVIC_InitTypeDef (功能:中断优先级配置)
抢占优先级高的可以抢占优先级低的,即发生中断嵌套;响应优先级高的中断先进行,但不会抢占响应优先级低的中断,即不能发生中断嵌套;
void exti_init() { GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
GPIO_InitStructure.GPIO_Pin=k_left;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //按键所接IO口设置为上拉模式RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //若是,开启复用功能,需要开启复用时钟。
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);//选择GPIO管脚作外部中断线路/*设置外部中断模式 *///此处注意,若是没有将中断引脚映射到外部中断线路上,中断将无效
EXTI_InitStructure.EXTI_Line=EXTI_Line2;//挂载中断线2
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置为中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); /*设置中断优先级*/
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打开EXIT2的全局中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
中断处理程序实现:}
①通过EXTI_GetITStatus检测中断线是否发生了变化
(EXTI_GetITStatus通过检测中断的挂起寄存器EXTI_PR是否和当前发生变化的中断线相同,是的话,返回SET;否的话,返回RESET。)
②发生中断后,使用EXTI_ClearITPendingBit清除EXTI线路挂起位。
中断处理函数,应该放置与stm32f10x_it.c中,也可将该函数copy到Keil编译路径下
如果放在新建的文件夹中,需要将对应的目录添加到Keil编译目录中
void EXTI2_IRQHandler() { if(EXTI_GetITStatus(EXTI_Line2)==SET) { EXTI_ClearITPendingBit(EXTI_Line0);//清除EXTI线路挂起位 delay_ms(10);//消抖 if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==Bit_RESET) //k_left被按下 { delay_ms(10);//消抖处理 if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_0)==Bit_RESET) { //LED 熄灭 GPIO_SetBits(GPIOC,GPIO_Pin_0); } else { //LED 点亮 GPIO_ResetBits(GPIOC,GPIO_Pin_0); } } while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2)==0); } }