stm32中断概念:单片机cpu在执行当前程序的时候,由于外界出现外界请求或内部请求,使cpu暂停正在执行的程序而去处理相应的请求程序,当程序运行完毕后,cpu再来执行原先被暂停的程序,这个过程就是中断。又由于在处理请求程序过程中,可能被其他更高级或者低级的外界请求干扰,这时候就要判断优先级,先处理哪个请求程序,这个就是中断优先级。中断优先级分为抢占优先级和响应优先级,规则是:抢占优先级高可以中断抢占优先级低的中断函数,相同抢占之间不能相互中断,而响应优先级则看一下中断表里的排位顺序.
在使用中断时的时候,要用NVIC分组,为什么?判断中断表中的排序决定先处理哪一个而nvic就是这个中断分组。
在stm32中有一个专门的函数来配置中断优先级NVIC_PriorityGroupConfig(u32 NVIC_PriorityGroup)其中 u32 NVIC_PriorityGroup可以设置成NVIC_PriorityGroup0~4。NVIC需要使用misc.h库文件
EXTI是外部中断,外部中断初始化包含以下几个结构体GPIO_Init(),NVIC_Init(),EXTI_Init()
PA0(15)---->AFIO_EXTICR1中EXTI0(15)--------->EXTI0
注意:一次性使用中断只能有16个,且每组io序号只能用一次
2.AFIO_代表gpio的复用功能,有adc,串口等,而用作外部中断或者使用重印射功能必须开启afio时钟
由上图可以知道
首先得设置分组,然后io初始化。选择io口,开启中断通道且设置参数
只要是外设就需要使用rcc外部时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE)
然后gpio初始化GPIO_Init()有个结构体
GPIO_InitStructure.GPIO_Pin=k_left; #这里的k_left实际上是一个外设,按键
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU; //是上拉电阻输入,没有输入信号的时候为高电平
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOE,&GPIO_InitStructure);
其次设置输入的io口GPIO_EXTILineConfig()
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource2)//因为我的按键在gpio的引脚为GPIOE组的第二管脚
然后对中断优先级NVIC_Init()有个结构体
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //这里使用的是中断优先级1组即1个抢占优先级,3个响应优先级
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //打开 EXTI2的全局中断//这里使用2作为中断向量,在stm32f10x.h中的IRQn可以找到定义,这里与EXTI_Line2对应的
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为 0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应优先级为 0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能
NVIC_Init(&NVIC_InitStructure);
最后初始化外部中断EXTI_Init()有个结构体
EXTI_InitStructure.EXTI_Line=EXTI_Line2;//读取外部中断2,01234独立一个,5-9共同一个,10-15共用一个
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//中断模式
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//中断触发模式
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure)
外部中断的中断函数EXTI2_IRQHandler()//2跟上面同理,看引脚是什么,这里是需要自己按需求写,中断后运行什么程序就是在这里面修改
包含EXTI_GetITStatus()函数读取中断标志
EXTI_ClearITPendingBit()函数 清除中断标志
实际上原理就是,先把自己的外设(cpu需要执行的程序)初始化好,配置好参数,然后把中断初始化配置好,自己中断(外界请求或内部触发命令程序)会运行什么,按键?,传感器?还是其他的,把这些都初始化好(中断配置管脚和外部请求等程序得一一对应),然后再通过EXTI2_IRQHandle()函数将cpu执行的程序和中断后执行的程序联系起来。这就是我理解的一个完整的中断程序过程,打红线的部分就是按需要而进行修改的东西。是不是很简单