STM32学习笔记(6)中断优先级及EXTI外部中断(改)

文章目录

  • 简介
    • 中断的概念:[举例](https://blog.csdn.net/SUN1_SHINE2/article/details/94561717)
    • 为什么需要中断
    • 中断优先级是什么
  • 中断优先级分组(NVIC)
    • 相关寄存器介绍
    • 优先级设定
  • EXIT外部中断相关
    • 概述
    • 中断控制器框图
    • 相关寄存器简介
    • EXIT_Init函数
    • 使用步骤
  • 中断与插入函数的区别

简介

中断的概念:举例

为什么需要中断

中断可以看作是放在while(1)语句中一个不停判断,准备执行的语句,问题是中断只相当于一个突发事件,我们不可能占用这么多资源去时时刻刻判断它是否发生(就像小明不可能时时刻刻盯着小丽,等她叫小明去买口红)。并且如果放在while(1)里面去判断,一旦加入其他代码,会使得突发事件的处理没有时效性。(就像小明不能等喝酒这一事件完结后再去陪小丽买口红),因此,我们需要一种只有在发生某种事件时,才会执行,平时又不占资源的功能,这就是中断。

中断优先级是什么

当有多个中断时,系统会根据中断优先级决定先执行哪一个中断函数。就像小明同时收到两个中断请求,老婆小丽叫小明陪她去买口红,朋友小张叫小明一起开黑,此时小明会根据事情的轻重缓急(优先级),决定去做哪一件事情。

中断优先级分组(NVIC)

CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256级的可编程中断设置。但STM32 只有 其中84 个中断,包括 16 个内核中断和 68 个可屏蔽中断,具有 16 级可编程的中断优先级。在 STM32F103 系列上面,又只有 60 个(在 107 系列有 68 个)。本文将对STM32F103 系列这 60 个可屏蔽中断进行介绍。

相关寄存器介绍

ISER[8]:( Interrupt Set-Enable Registers),中断使能寄存器组。由 8 个 32 位寄存器来控制,每个位控制一个中断。对于STM32F103,有用的就是两个(ISER[0]ISER[1]), ISER[0]的 bit0~bit31 分别对应中断 0~31。 ISER[1]的 bit0~27 对应中断 32~59;要使能某个中断,必须设置相应的 ISER 位为 1。具体每一位对应哪个中断,请参考 stm32f10x.h 里面的第 140 行处(针对编译器 MDK5 来说)。

ICER[8]:( Interrupt Clear-Enable Registers),中断除能寄存器组。与 ISER 的作用相反,用来清除某个中断的使能的。其对应位的功能,也和 ICER 一样。这里要专门设置一个 ICER 来清除中断位(即写1),而不是向 ISER 写 0 来清除。

CM3 中可以有 240 对使能位/除能位,每个中断拥有一对。这 240 个对子分布在 8 对 32 位寄存器中(最后一对没有用完)。欲使能一个中断,你需要写 1 到对应 SETENA 的位中;欲除能一个中断,你需要写 1 到对应的 CLRENA 位中;如果往它们中写 0,不会有任何效果。通过这种方式,使能/除能中断时只需把“当事位”写成1,其它的位可以全部为零。
防止有些位被写入 0 而破坏其对应的中断设置(写 0 没有效果),从而实现每个中断都可以自顾地设置,而互不侵犯

ISPR[8]:( Interrupt Set-Pending Registers),中断挂起控制寄存器组。每个位对应的中断和 ISER 是一样的。通过置 1,可以将正在进行的中断挂起,而执行同级或更高级别的中断。 (不常用)

ICPR[8]:( Interrupt Clear-Pending Registers),中断解挂控制寄存器组。其作用与 ISPR 相反,对应位也和 ISER 是一样的。通过设置 1,可以将挂起的中断接挂。(不常用)

IABR[8]:( Interrupt Active Bit Registers),中断激活标志位寄存器组。对应位所代表的中断和 ISER 一样,如果为 1,则表示该位所对应的中断正在被执行。这是一个只读寄存器,通过它可以知道当前在执行的中断是哪一个。在中断执行完了由硬件自动清零。 (不常用)

IP[240]:( Interrupt Priority Registers),中断优先级控制寄存器组。 240 个 8bit 的寄存器组成,每个可屏蔽中断占用 8bit,总共表示 240 个可屏蔽中断。 而 STM32 只用到了其中的前 60 个。 IP[59]~IP[0]分别对应中断 59~0。 而每个可屏蔽中断占用的 8bit 并没有全部使用,而是 只用了高 4 位。这 4 位,又分为抢占优先级和子优先级。抢占优先级在前,子优先级在后。而这两个优先级各占几个位又要根据 SCB>AIRCR 中的中断分组设置来决定。

抢占优先级和子优先级的解释:
抢占优先级:高优先级可打断正在进行的低优先级。
子优先级:中断同时发生,高优先级先执行。
若两个中断的两种优先级相同,则先发生先执行。(值越低,优先级越高)

STM32 的中断分组: STM32 将中断分为 5 个组,组 0~4。该分组的设置是由 SCB->AIRCR 寄存器的 bit10~8 来定义的。具体的分配关系 :

STM32学习笔记(6)中断优先级及EXTI外部中断(改)
中断线对应中断服务函数

中断控制器框图

STM32学习笔记(6)中断优先级及EXTI外部中断(改)

中断与插入函数的区别

类似而不相同,中断相当于一个时刻判断条件的函数,而插入在程序的函数(插入在while(1)里),想要运行必须等到程序执行到那里,当程序存在delay时,插入的函数检测会变得困难,而中断不会,中断甚至在符合条件后停止正在运行的主函数,去运行中断函数。

来源:凯之~

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年4月21日
下一篇 2020年4月21日

相关推荐