中断简介
中断是微控制器的一个常见特性,中断由硬件产生,当中断产生以后CPU就会中断当前的流程去处理中断程序,Cotex-M内核的MCU提供了一个中断管理的嵌套向量中断控制器。
Cotex-M的NVIC最多可以支持240个IRQ(中断请求),1个不可屏蔽中断(NMI),1个Systick(滴答定时器)定时器中断和多个系统异常。
中断优先级分组
当多个中断来临的时候处理器应该相应哪一个中断由中断的优先级来决定的,最高优先级的中断(优先级编号小)肯定先得到相应,而且高优先级中断可以抢占低优先级的中断,这就是中断嵌套,Cortex-M处理器有些是固定优先级,比如:复位,NMI,HardFault,这些中断优先级都是负数,优先级也是最高的。
Cortex-M处理器具有三个固定优先级和256个可编程优先级,最多有128个抢占等级,但实际是由厂商决定的。但是,绝大多数芯片都会精简设计的,以致实际上的支持优先级数量会更少,如8级,16级,32级等。比如stm32就只有16级优先级,在设计芯片的时候会裁掉表达优先级的低端有效位,以减小优先级数,所以不管用多少位来表达优先级
stm32使用使用4位,所以有5组优先级分组,定义的组0对应的值是7!如果是组4的话,4位优先级全是抢占优先级了,没有亚优先级,那么就有0-15共16个优先级。
The table below gives the allowed values of the pre-emption priority and subpriority according
to the Priority Grouping configuration performed by NVIC_PriorityGroupConfig function
============================================================================================================================
NVIC_PriorityGroup | NVIC_IRQChannelPreemptionPriority | NVIC_IRQChannelSubPriority | Description
============================================================================================================================
NVIC_PriorityGroup_0 | 0 | 0-15 | 0 bits for pre-emption priority
| | | 4 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_1 | 0-1 | 0-7 | 1 bits for pre-emption priority
| | | 3 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_2 | 0-3 | 0-3 | 2 bits for pre-emption priority
| | | 2 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_3 | 0-7 | 0-1 | 3 bits for pre-emption priority
| | | 1 bits for subpriority
----------------------------------------------------------------------------------------------------------------------------
NVIC_PriorityGroup_4 | 0-15 | 0 | 4 bits for pre-emption priority
| | | 0 bits for subpriority
============================================================================================================================
外部中断
STM32的EXTI控制器支持19 个外部中断/ 事件请求。每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。
STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18:
线0~15:对应外部 IO口的输入中断。
线16:连接到 PVD 输出。
线17:连接到 RTC 闹钟事件。
线18:连接到 USB 唤醒事件。
触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。
外部中断分组:STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。