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

文章目录

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

简介

中断的概念:举例

为什么需要中断

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

中断优先级是什么

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

中断优先级分组(NVIC)

相关寄存器介绍

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 来定义的。具体的分配关系 :

中断控制器框图

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

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

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

相关推荐