2. STM32_中断
中断
中断是什么:
打断CPU执行正常的程序,转而处理紧急程序,然后返回原暂停的程序继续运行,就叫中断。
中断的意义:
中断可以高效处理紧急程序,不会一直占用CPU资源。如实时控制、故障处理、处理不确定来临的数据。
中断信号传输简图:
NVIC
NVIC是什么:
NVIC就是嵌套向量中断控制器,属于内核的一部分,作用是管理全部的中断信号。NVIC支持256个中断(16内核 + 240外部)和256个优先级,这些中断和优先级是允许裁剪的。
对于STM32F103,它的NVIC支持10个内核中断、60个外部中断、16个中断优先级。
NVIC中常用寄存器含义:
- ISER:中断使能,每一个位控制一个外部中断。
- ICER:中断失能,每一个位控制一个外部中断。
- AIRCR:应用程序中断及复位控制寄存器,用于控制中断优先级分组。
- IPR:中断优先级寄存器,用于控制中断优先级。
中断优先级分类:
中断优先级有抢占优先级、响应优先级、自然优先级三种类型。
优先级数值越小,表示优先级越高。抢占和响应都相同的情况下,自然优先级越高的,先执行
- 抢占优先级(pre):高抢占优先级可以打断正在执行的低抢占优先级中断
- 响应优先级(sub):当抢占优先级相同时,响应优先级高的先执行,但是不能互相打断
- 自然优先级:中断向量表的优先级
中断优先级分组:
优先级分组影响的是抢占、响应优先级所能够设置的bit位。STM32的中断优先级分组如下:
注意:中断优先级分组是配置全部中断,因此在一个工程中一般只设置一次。
NVIC处理中断信号过程:
- 对于内核中断
中断信号直接就进入到了SHPR寄存器中,最后SHPR与IPR共同比对,从而CPU确定先执行哪一个中断信号。
- 对于外部中断
首先需要经过ISER、ICER,如果中断未使能,那么中断信号就不会传到IPR中,也就不会被CPU接收到,如图中外部中断1就是未使能下的信号传递过程。
之后信号存放在IPR中,IPR用于控制中断优先级,有抢占优先级与响应优先级这两种类型。这两种类型如何分配,由AIRCR寄存器控制,不同的中断优先级分组对应的抢占与响应所占bit位不一样。
最终CPU比对优先级,决定优先执行哪个中断。执行的中断时会跳转到中断向量表找到中断处理函数并执行函数体中的内容。
示例:
如下图,假设现在有这四个外设中断同时产生,抢占、响应、自然优先级如上表,分析CPU的执行顺序。
首先看抢占优先级,2优先级可以抢占3优先级,所以RTC和EXTI1先执行。因为EXTI1的响应优先级比RTC高,所以先执行EXTI1,再执行RTC。
因为EXTI0和Systick的抢占和响应优先级一样,所以根据自然优先级判断响应顺序。Systick比EXTI0的自然优先级高,因此先执行Systick,再执行EXTI0。
EXTI
什么是EXTI:
EXTI就是外部中断事件控制器,主要作用是管理内部/外部的唤醒事件或者中断。F1包含20个产生事件/中断请求的边沿检测器,即总共:20条EXTI线,其中0~15是外部事件,其余是内部事件。
EXTI特性:
每条EXTI线都可以单独配置:选择类型(中断或者事件)、触发方式(上升沿,下降沿或者双边沿触发)、支持软件触发、开启/屏蔽、有挂起状态位
EXTI工作原理:
EXTI信号框图如下图,分为触发中断和触发事件两部分,中断的触发又分为软件触发和外部触发,下面主要叙述外部中断触发的过程。
当信号从输入线进入后,边沿检测电路会根据RTSR、FTSR来判断是上升沿有效还是下降沿有效,之后将有效信号1传导到或门。
1通过或门一定输出1,信号传导到PR中代表中断产生,之后传导到与门。此时如果IMR = 1,那么中断信号将传导到NVIC去处理。
AFIO
什么是AFIO:
AFIO就是复用功能IO,主要用于重映射和外部中断映射配置。
对于中断配置,AFIO可以通过寄存器将EXTI0~EXTI15配置到具体的GPIO上。
EXTI与IO的映射关系:
对于EXTI0,对应的GPIO是pin0,究竟对应的是PA0还是PB0还是其他GPIO,这是由外部中断配置寄存器AFIO_EXTICR1来控制。
注意:同一时刻,只有一个pin0能连接上EXTI0