一、NVIC简介
什么是 NVIC ? NVIC 即嵌套向量中断控制器,全称 Nested vectored interrupt controller 。它 是内核的器件,所以它的更多描述可以看内核有关的资料。M3/M4/M7 内核都是支持 256 个中断,其中包含了 16 个系统中断和 240 个外部中断,并且具有 256 级的可编程中断设置。然而芯片厂商一般不会把内核的这些资源全部用完,如 STM32F407 的系统中断有 10 个,外部中断有82 个。
1、NVIC寄存器
2、中断优先级
STM32 中的中断优先级可以分为:抢占式优先级和响应优先级,响应优先级也称子优先级,每个中断源都需要被指定这两种优先级。抢占式优先级和响应优先级的区别:
抢占优先级 :抢占优先级高的中断可以打断正在执行的抢占优先级低的中断。
响应优先级 :抢占优先级相同,响应优先级高的中断不能打断响应优先级低的中断。
还有一种情况就是当两个或者多个中断的抢占式优先级和响应优先级相同时,那么就遵循自然优先级,看中断向量表的中断排序,数值越小,优先级越高。
对于 NVCI 的中断优先级分组: STM32F407 将中断分为 5 个组,组 0~4 。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。
所以中断优先级分组决定了中断优先级控制寄存器位数的分配设置,设置哪几位是抢占优先级,哪几位是响应优先级,所以中断优先级分组就决定了中断的抢占优先级和响应优先级的设置范围。
通过这个表,我们就可以清楚的看到组 0~4 对应的配置关系,例如优先级分组设置为 3 , 那么此时所有的 82 个中断,每个中断的中断优先寄存器的高四位中的最高 3 位是抢占优先级, 低 1 位是响应优先级。每个中断,你可以设置抢占优先级为 0~7 ,响应优先级为 1 或 0 。抢占优先级的级别高于响应优先级。而数值越小所代表的优先级就越高。
HAL_NVIC_SetPriorityGrouping 函数
HAL_NVIC_SetPriorityGrouping 是设置中断优先级分组函数。 这个函数在一个工程里基本只调用一次,而且是在程序 HAL 库初始化函数里面已经被调 用,后续就不会再调用了。因为当后续调用设置成不同的中断优先级分组时,有可能造成前面设置好的抢占优先级和响应优先级不匹配。
3、NVIC的使用
二、EXTI 简介
EXTI 即是外部中断和事件控制器,它是由 20 个产生事件/ 中断请求的边沿检测器组成。每 一条输入线都可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。
产生中断线路目的使把输入信号输入到 NVIC,进一步运行中断服务函数,实现功能。而产生事件线路目的是传输一个脉冲信号给其他外设使用,属于硬件级功能。
对于正点原子:
EXTI 的功能框图是最直接把有关 EXTI 的知识点连接起来的图,掌握了该图的来龙去脉,就会对 EXTI 有了一个整体熟悉,编程时候可以得心应手。
三、如何使用中断
1、EXTI中断流程
EXTI 0-15这16根线会与gpio完成映射,EXTI16、17....等输入线是其他外设中断,比如闹钟,USB等,这两者统称为EXTI中断。
2、EXTI中断配置步骤
其中步骤2-5可以使用HAL_GPIO_Init一步到位
四、HAL库中断回调处理机制
五、应用示例
应用步骤
1、看原理图确定引脚连接
2、使能IO口时钟,完成IO口与中断线的映射关系,设置优先级,设置中断服务函数处理中断,设置中断回调函数实现具体中断处理操作。
按键消抖的实现:
按键按下(GPIO中断)|v
启动定时器(复位计数器)|v定时器计时(10ms)|v
定时器计数完成(触发中断)|v
检查按键状态(确认按下)|v
停止定时器,设置标志位|v主循环处理中断事件