STM32F1xx官方资料: 《STM32中文参考手册V10》-第9章 中断和事件
Cortex-M3内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。但是,STM32并没有使用CM3内核的全部东西,而是只用了它的一部分。STM32有84个中断,包括16个内核中断(异常)和68个可屏蔽中断,具有16级可编程的中断优先级。而STM32F103系列上面,16个内核中断(异常)不变,而可屏蔽中断只有60个(在107系列才有68个)。
注意一下:CM3的外部中断和STM32的外部中断不是一个概念。CM3:除了内核异常之外的都是外部中断;STM32:外部中断EXTI只有6个
其实,内核中断也叫内核异常。
- 中断是指系统停止当前正在运行的程序转而其他服务,可能是程序接收了比自身高优先级的请求,或者是人为设置中断,中断是属于正常现象。
- 异常是指由于cpu本身故障、程序故障或者请求服务等引起的错误,异常属于不正常现象。
因此,下面就直接介绍一下STM32F103系列的16个内核中断(异常)、60个中断:
中断向量表(末尾代表地址)
这其中包含很多内核中断以及单片机管理中断,例如1号PVD中断,检测到单片机供电电压不足时会触发这个中断会将单片机的运行数据保存,以免数据丢失,诸如此类的中断还有很多。
优先级号越小优先级越高,异常和中断向量表只能使用汇编语言编写。
地址的作用:程序中的中断函数,它的地址由编译器来分配,是不固定的,但是我们中断的跳转,由于硬件的限制,只能够跳转到固定的地址执行程序,所以为了能让硬件跳转到一个不固定的中断函数里,在这里就需要在内存里面定义一个地址的列表,这个列表地址是固定的,中断发生后,就跳转到这个位置,然后在这个为由编译器,再加上一条跳转到中断函数的代码,这样中断跳转就可以跳转到任意位置了。(相当于中断跳转的一个跳板)
上面这些中断地址不需要我们自己进行手动定义,编译器都已经帮我们做好了。
NVIC基本结构(NVIC:嵌套中断向量控制器)
NVIC相当于一个外设帮CPU过滤中断请求,最后将最合适执行的中断交给CPU执行。NVIC的核心功能是中断优先级分组,中断优先级配置,读中断请求标志,清除中断请求标志,清除中断,使能中断等。它控制STM32中断向量表的0-59的60个中断。外部中断信号从核外发出,信号最终要传递到NVIC
STM32中断优先级分组
中断优先级寄存器
组 | AIRCR[10:8] | IP bit[7:4]分配情况 | 分配结果 | 抢占优先级 | 响应优先级 |
---|---|---|---|---|---|
0 | 111 | 0:4 | 0位抢占优先级,4位响应优先级 | 0位,取值为0 | 4位,取值为0~15 |
1 | 110 | 1:3 | 1位抢占优先级,3位响应优先级 | 1位,取值为0~1 | 3位,取值为0~7 |
2 | 101 | 2:2 | 2位抢占优先级,2位响应优先级 | 2位,取值为0~3 | 2位,取值为0~3 |
3 | 100 | 3:1 | 3位抢占优先级,1位响应优先级 | 3位,取值为0~7 | 1位,取值为0~1 |
4 | 011 | 4:0 | 4位抢占优先级,0位响应优先级 | 4位,取值为0~15 | 0位,取值为0 |
其中AIRCR寄存器来确定是用哪种分组,抢占优先级的级别高于响应优先级,而数值越小所表示的优先级越高。
如果不在同一中断分组如何比较抢占优先级和响应优先级呢,哪怕不在同一优先级组中,也是同样的方式比较抢占优先级和响应优先级,数字越小优先级越高。
介绍一下抢占优先级、响应优先级的区别:
- 高优先级的抢占优先级是可以打断正在进行的低抢占优先级中断的;
- 抢占优先级相同的中断,高响应优先级不可以打断低响应优先级的中断;
- 抢占优先级相同的中断,当两个中断同时发生的情况下,哪个响应优先级高,哪个先执行;
- 如果两个中断的抢占优先级和响应优先级都是一样的话,则看哪个中断先发生就先执行;
除此之外有两点需要注意:
1.打断的情况只会与抢占优先级有关,和响应优先级无关