一,NVIC
1.1.1NVIC定义
NVIC属于内核设备,翻译为嵌套向量中断控制器,在stm32全系列中最多有256个中断由NVIC配置,并允许裁剪,因此每个型号的中断数与优先级数各不相同。
1.1.2NVIC工作原理![](https://i-blog.csdnimg.cn/blog_migrate/08d5d194b3709dd89c74b240153df472.png)
当外部中断响应时,通过第一层判断(是/否使能该中断)来判断是否让该中断进入NVIC,此后进入IPR来获取中断优先级,其中AIRCR是一个将IPR前4位标志位进行分组的寄存器(stm32只用到了IDR寄存器的前四位);如果是内核产生的中断,则进入SHPR寄存器进行获取优先级,再读取AIRCR判断分组。
1.1.3NVIC寄存器![](https://i-blog.csdnimg.cn/blog_migrate/e9d4c51c05aa3ea290637fa7e5434f57.png)
ISER与ICER都是共32*8个位,每一个位控制一个中断,AIRCR的8-10位控制分组,IPR的240个寄存器对应着240个外部中断,但stm32只使用了前4位。
1.1.4中断向量表![](https://i-blog.csdnimg.cn/blog_migrate/3e742fcc18880e9dc57bf41883d82202.png)
如图,当中断进入NVIC时会寻找对应的中断服务函数。
1.1.5优先级概念![](https://i-blog.csdnimg.cn/blog_migrate/266748faf2924d5d1e3e775e3b558c1c.png)
其中自然优先级是可以在中断向量表中查询的。
1.1.6优先级标志位![](https://i-blog.csdnimg.cn/blog_migrate/14a4f9683ef620ece238220413fab3d6.png)
二,EXTI
2.1.1EXTI叙述![](https://i-blog.csdnimg.cn/blog_migrate/e6a69bf93cfba1538026900639629e9e.png)
中断是一种发生了要进入NVIC的情况,则会将cpu调用,而事件是不进入NVIC的情况,会使硬件发生变化,通常也会伴随则是否使用中断的寄存器标志位。
20条EXTI线对应着20种事件与中断,其中图上缺乏以太网唤醒事件。
EXTI可以配置如上图所示,其中软件触发是通过软件更改寄存器的操作。只有将EXTI配置成功,对应的外部中断才能通过NVIC调用函数。
2.2.1 AFIO的重映射
如果需要使用EXTI外部中断需要将GPIO的重映射功能开启,既AFIO。
使能AFIO的函数定义在HAL库中的GPIO.C中
开启复用功能后需要判断是哪一个EXTI线产生了外部中断,以上寄存器共有4个,可配置的EXTI线共有4*4个,每4位为1组,通过不同的位控制来自于哪组GPIO。
三,中断配置流程
3.1.1EXTI的配置步骤![](https://i-blog.csdnimg.cn/blog_migrate/e85b35c27c20f17382d1bffe68bac3d4.png)
首先:使能GPIO的时钟
其次:通过GPIO初始化函数将GPIO模式,AFIO映射,时钟,屏蔽全部配置好
最后:设置NVIC的分组,中断优先级,并且使能
配置完毕后,要设置中断服务函数,终端服务函数的过程如下。
首先要设计一个中断服务函数(顾名思义,产生了何种中断,CPU会进入到终端服务函数中进行处理)
其次终端服务函数中要包含HAL库的中断共用处理函数(所谓公用,既例如所有的外部中断函数都适用于这个函数,函数的参数为GPIO_PINX,进入函数会检测是否该PIN产生了外部中断挂起位,挂起后,会执行回调函数,并软件清除中断标志位)
最后进入回调函数,回调函数在公用函数中被引用,并且是_weak弱定义,因此可以在使用它的地方将其内部重新定义为用户所需要的函数。并且可以设计多个中断服务函数,进入公用函数后进入回调函数,再在回调函数中进行逻辑判断,对应相应的中断,执行操作。