文章目录
一、中断
1.1.什么是中断
STM32中的中断是指在程序正常运行时,外部事件或内部异常强行打断当前执行流程,转而执行相应处理程序,完成后再返回原流程的机制。在STM32中,中断是指当外设或处理器内部发生某些事件时,处理器暂停当前执行的程序,转而执行预定义的中断服务程序,处理完毕后再返回原程序继续执行的机制。
1.2.中断的意义与作用
中断的意义就是能高效处理紧急程序,不会一直占用CPU资源。
作用:
- 实时控制:在确定时间内对相应事件做出响应。
- 故障处理:检测到故障,需要第一时间处理。
- 数据传输:为了不确定到来的数据提供保障
1.3.中断优先级基本概念
- 抢占优先级(pre):高抢占优先级可以打断正在执行的低抢占优先中断
- 响应优先级(sub):当抢占优先级相同时,响应优先级高的先执行,但是不能相互打断
- 抢占和响应都相同的情况下,自然优先级越高的先执行
- 自然优先级:中断向量表的优先级
- 数值越小,表示优先级越高越先执行
1.4.中断优先级分组
以下表格是中断优先级分组,优先级分组为5组,是因为STM32的IPR(中断优先级寄存器)只使用高四位。
优先级分组 | AIRCR[10:8] | IPRx bit[7:4] | 分配结果 |
---|---|---|---|
0 | 111 | None :[7:4] | 0位抢占优先级,4位响应优先级 |
1 | 110 | [7] :[6:4] | 1位抢占优先级,3位响应优先级 |
2 | 101 | [7:6] :[5:4] | 2位抢占优先级,2位响应优先级 |
3 | 100 | [7:5] :[4] | 3位抢占优先级,1位响应优先级 |
4 | 011 | [7:4] :None | 4位抢占优先级,0位响应优先级 |
下表为中断优先级举例:(假设分组是2)
首先看抢占优先级,抢占优先级数值越低,越先执行,因此编号3和7排到前二名;再看响应优先级,响应优先级数值越低,越先执行,因此编号7最先执行;再看编号6和-1,它们的抢占优先级和响应优先级都一样,就要看自然优先级,自然优先级数值越低,越先执行,因此编号-1要排到第3个执行,编号6要排到最后执行。总结,先考虑抢占优先级,再考虑响应优先级,最后考虑自然优先级。
编号 | 自然优先级 | 对应外设 | 抢占 | 响应 | 执行顺序 |
---|---|---|---|---|---|
3 | 10 | RTC | 2 | 1 | 2 |
6 | 13 | EXTI0 | 3 | 0 | 4 |
7 | 14 | EXTI1 | 2 | 0 | 1 |
-1 | 6 | Systick | 3 | 0 | 3 |
PS:如果EXTI0或Systick正在执行,RTC或EXTI1可以打断它;如果EXTI0正在执行,Systick不可以打断它。
二、NVIC
2.1.NVIC的基本概念
NVIC全称:Nested vectored interrupt controller(嵌套向量中断控制器)是STM32中用于管理和控制中断的核心组件,负责中断优先级分配、使能/禁用控制以及中断嵌套处理等功能。NVIC是STM32处理器中负责处理和管理中断的核心组件,它通过配置中断优先级、使能中断源以及处理中断嵌套等功能,确保系统能够高效响应各类中断请求。NVIC支持256个中断(16内核+240外部),支持256个优先级,并允许裁剪,ST公司把256个优先级裁剪为16个。下图是F1和F4型号的中断和中断优先级对比:
型号 | 内核中断 | 外部中断 | 中断优先级 |
---|---|---|---|
STM32F103xx | 10 | 60 | 16 |
STM32F407xx | 10 | 82 | 16 |
图中内核中断为10,意味着有6个中断被保留。无论是内核中断还是外部中断,它都有相应的中断服务函数,也就是中断发生时,CPU需要执行相应的中断程序,中断服务函数就是该中断程序的一个入口。这些中断服务函数被定义在中断向量表里。
2.2.中断向量表
中断向量表是指在一块固定的内存,以4字节对齐,存放各个中断服务函数程序的首地址,当发生中断时,CPU会自动执行对应的中断服务函数,main函数往往是最后执行的,也就是优先级最低。
下图是内核中断服务函数(10个):
下图是外部中断服务函数(60个):
2.3.NVIC相关寄存器
NVIC相关寄存器 | 位数 | 寄存器个数 | 备注 |
---|---|---|---|
中断使能寄存器(ISER) | 32 | 8 | 32*8=240个外部中断,每个位控制一个中断置1 |
中断除能寄存器(ICER) | 32 | 8 | 32*8=240个外部中断,每个位控制一个中断置0 |
应用程序中断及复位控制寄存器(AIRCR) | 32 | 1 | 位[10:8]只有这三个位控制优先级分组 |
中断优先级寄存器(IPR) | 8 | 240 | 8个位对应一个,而STM32只使用高4位 |
2.4.NVIC的工作原理
下图是NVIC的工作原理,假设有4个外部中断来影响程序执行,外部中断进入NVIC后首先经过ISER和ICER寄存器来决定是否给该中断使能,如下图可知只有外部中断2、3、4使能,并进入IPR(中断优先级寄存器),STM32只使用高4位来控制一个优先级,再由AIRCR(应用程序中断及复位控制寄存器)控制优先级分组,最后到CPU来处理,其中内核中断最后一个到来,内核中断不用经过使能或失能,直接来到SHPR(系统异常优先级寄存器),该寄存器与IPR同一级别,最后CPU再处理内核中断。
2.5.NVIC的使用
- 设置中断分组:寄存器AIRCR[10:8],HAL_NVIC_SetPriorityGrouping
- 设置中断优先级:寄存器IPRx bit[7:4],HAL_NVIC_SetPriority
- 使能中断:寄存器ISERx,HAL_NVIC_EnableIRQ
2.5.1.HAL_NVIC_SetPriorityGrouping
设置中断分组,大概是通过以下流程来操控AIRCR寄存器来设置分组。
2.5.2.HAL_NVIC_SetPriority
该函数有三个参数,第一个填入外部中断的位置(该编号可查阅STM32F10xxx参考手册_V10(中文版)第132页);第二个填入抢占优先级;第三个填入响应优先级。主要操作的是IPR(中断优先级寄存器)。
2.5.3.HAL_NVIC_EnableIRQ
该函数主要实现请求使能该中断,通过ISER(中断使能寄存器)控制特定位置1使能。