中断是指在cpu在执行程序的过程中,由于某些内部或者外部的事件的发生,cpu停下正在执行的进程,转向去为这些事件服务,并且在服务完成后回到被打断的地方继续执行的机制。
嵌套向量控制器(NVIC)和外部中断/事件控制器(EXTI)
中断的类型可以分为内部中断和外部中断,内部中断只要和cpu运行时产生的一些错误和异常有关,我们一般进行配置的是外部中断。STM32对中断的管理是通过NVIC和EXTI两个外设来进行的。
NVIC
NVIC居于M4的内核之中,主要是对中断优先级和中断嵌套进行管理。
中断优先级
在STM32F4中,中断优先级由中断优先级寄存器(IPR)的高四位来控制。并且通过优先级分组将这四位又分为抢占优先级和子优先级,以便管理STM32中的大量中断。简单来说,优先级分组就是来规定IPR高四位的分配情况(如优先级分组为1,则表示抢占优先级占一位,子优先级占三位)。
在进行中断优先级的比较时,首先比较抢占优先级,当抢占优先级相同时比较子优先级。STM32里都是规定优先级的数值越小,对应中断的优先级越高。
中断嵌套
中断嵌套考虑到在执行中断的过程中,接收到其他中断的请求是否执行的问题。STM32中的嵌套原则是高抢占优先级的事件可以打断低抢占优先级的事件;但若抢占优先级相同,高子优先级事件并不能打断低子优先级事件。
EXTI
EXTI主要是对外部中断进行单独的配置,可以配置中断的触发方式,以及中断屏蔽寄存器等等。下图清除的解释了EXTI的功能。
值得注意的是,EXTI有23根线作为中断源,其中EXTI0 - EXTI15管理外部GPIO端口的中断源,因此会涉及端口复用的问题,同一个EXTI端口只能同时响应一个中断。
cubeMX配置中断
以GPIO的外部中断为例,首先要配置GPIO端口,端口模式设置为GPIO_EXTIx。下图中我将PE3和PE4作为中断源。
点开GPIO选项卡,并在GPIO mode一栏可以配置中断的触发方式
点开NVIC一栏来配置中断优先级
此项同样可以通过右侧NVIC选项卡来配置
中断服务
用HAL库进行编程,编写中断服务程序有两种方式,第一是直接改写中断服务函数,第二是编写中断回调函数。
当配置好后,cubeMX会自动生成中断服务函数,函数定义在stm32f4xx_it.c下。可以改写函数的函数体来实现中断服务。
采用HAL库的回调函数的机制来编写中断服务程序。HAL库实现了一个weak版本的回调函数,可以在工程的任意处重写来实现中断功能。