电子那点事: STM32F103 中断软硬件讲解

由于 STM32F103 是基于 ARM Cortex M3 内核设计的,因此我们先了解一下 ARM Cortex M3 的中断,M3 内核的中断分为两大部分,第一部分是系统中断,一共有 16 个,第二部分是 留给芯片厂家的 240 的外设中断(这两部分加起来一共有 256 个中断)。但是芯片厂家可能 用不上 240 个外设中断,因此会对其进行裁剪,我们的 STM32F103 只是用了 60 个外设中断。 下面我们看一下 STM32F103 这 76 个中断(16 个系统中断有些是预留的,有意义的系统中断 为 10 个。另外中断优先级数越小优先级别越高):

电子那点事: STM32F103 中断软硬件讲解

电子那点事: STM32F103 中断软硬件讲解

电子那点事: STM32F103 中断软硬件讲解

电子那点事: STM32F103 中断软硬件讲解

其中蓝色部分是系统的 16 个中断,其余 60 个为外设中断。另外除了三个中断优先级固 定外,剩余的中断优先级都是可以通过程序设置的,STM32 支持 16 个可编程优先级。 这里说一下和中断设置有关的名词: 中断使能/失能:中断使能的意思是让中断有效或者说是开中断,反之,失能则是关闭 中断。 中断挂起/解挂:当一个中断发生时,此时单片机正在执行和该中断同优先级或者更高 优先级的另外一个中断时,该中断将被挂起,直到另一个中断执行完才可解挂并执行,其实 就是根据中断优先级排队。 中断嵌套:正如前面图片表述那样,一个高优先级的中断打断了低优先级的中断的过程 就是中断嵌套,这样做使得不同优先级的中断能够按照优先级的大小依次执行,可以理解为 VIP 插队。 接下来我们看一下 STM32F103 中断的相关寄存器(这些寄存器是用于设置 STM32F103 的 60 个外设中断的):

电子那点事: STM32F103 中断软硬件讲解

该段代码位于 core_cm3.h 文件中,它定义的是就是 STM32 的中断相关寄存器。我们依 次讲解一下。

⚫ 中断使/失能寄存器(ISER/ICER)

ISER 用于使能某个中断,寄存器中的一个位对应着一个中断,写 1 就使能,写 0 被忽 略。由于 CM3 内核最多支持 240 个外设中断,因此 ISER 是由 8 个 32 位的寄存器组成(只不 过剩余的最高 16 位没有用到),而 STM32F103 只有 60 个中断,因此只用到了 ISER[0]和 ISER[1]的低 28 位。 同理,ICER 用于设置 STM32 的中断失能,写 1 失能,写 0 忽略。

⚫ 中断挂起/解挂寄存器(ISPR/ICPR)

这两组寄存器用于设置中断挂起和解挂,操作和中断使/失能寄存器一致。

⚫ 活动中断标志寄存器

字面理解就是用于记录此时正在执行中断的寄存器,如果一个中断被执行,那么该中断 对应位就会被置 1,即使该中断被其他更高优先级的中断打断,只要该中断没有执行完就一 直保持 1 的状态,直到中断服务函数执行完才会被自动清零。

⚫ 中断优先级寄存器(IP)

中断优先级寄存器用于设置每个中断的优先级,CM3 内核最大支持 240 个外设中断并为 每个中断分配了 8 位可编程优先级,但是 STM32F103 只用到了 60 个中断优先级寄存器,而 且每个中断只用到了高四位来设置中断优先级。这高四位又被分组为两部分优先级:抢占优 先级和子优先级(也可以叫响应优先级或者亚优先级)。一个中断是否需能够抢占其他中断 由三个因素决定:抢占优先级,子优先级,中断编号。 先说抢占优先级,如果中断 A 的抢占优先级比中断 B 的抢占优先级高,那么不管这两个 中断的子优先级和中断编号是什么,A 都会抢占 B,或者说发生 B 的时候 A 在执行,那么 B 会被挂起。 当 A、B 两个中断的抢占优先级相同的情况下,且 A 的子优先级比 B 高,那么当他们同 时发生或者同时解挂的时候会优先执行 A,如果 A 中断发生的时候 B 中断正在执行,那么 A也不会抢占 B,而是要挂起,等待正在执行的 B 中断执行完成才执行 A 中断。 当两个中断的抢占优先级和子优先级都相同的情况下且两个中断一起发生时,则根据中 断编号进行响应(号小的先响应)。

⚫ 软件触发中断寄存器(STIR)

用户可以通过写该寄存器来手动的触发对应中断,比如写入 0x08,则触发中断编号 8 的 中断。 下面说一下中断分组,STM32 的中断分组由 AIRCR 寄存器的 10-8 位控制:

电子那点事: STM32F103 中断软硬件讲解

该中断分组设置是全局的,例如此时将中断优先级分组设置为第三分组,那么对于所有 的外设中断来说,都将使用这种分组方式。STM32F103 的中断共分为 5 组:

电子那点事: STM32F103 中断软硬件讲解

就拿 2 组为例,此时抢占优先级的取值范围是 0~3,子优先级取值范围也是 0~3, 分组的好处是可以扩展优先级的功能。我们在配置中断的时候,一般要做两个工作:

1. 在一开机就设置中断分组,且在下次重启之前最好不要再进行分组设置。我们看一下设 置中断分组的函数(位于 misc.c):

电子那点事: STM32F103 中断软硬件讲解

该函数先检查参数是否合理,然后将该分组号赋给 AIRCR 寄存器,其中的 AIRCR_VECTKEY_MASK 是该寄存器的访问秘钥,对该寄存器写操作就必须先填入秘钥。我们 此时将其设置为分组 2: NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

2. 设置相应外设的中断,设置内容选择某个外设中断并设置它的抢占优先级和子优先级。 代码如下(以外部中断 0 为例):

电子那点事: STM32F103 中断软硬件讲解

本章需要大家掌握的是 STM32 的分组概念以及根据分组设置中断优先级,在程序上其 实只需要两步即可,第一步是开机分组,第二步是设置对应中断优先级并使能。


分享到:


相關文章: