STM32之外部中断[概念篇]

中断是STM32中很重要的一个概念,如果想要单片机效率更高,就要摆脱查询式,用中断式来提高它的运行效率。今天讲的外部中断,就是GPIO口和4个特定中断/事件外设,由于中断比较复杂,就先讲概念,下一篇讲具体的实验代码。

一、中断和异常

1、中断——当需要出现时,CPU暂时停止当前程序的执行,转而执行处理新情况的程序和执行过程。
2、异常——处理器要复位,不可屏蔽中断,存储故障,这些由内核产生的就叫做异常,也就是硬件异常。

  • 注:两者区别就是,中断一般发生与外部,异常发生于内部。
  • 中断源三个来源:1、IO口;2、片上外设;3、内核。

二、NVIC和EXTI

1、嵌套向量中断控制器(NVIC)

在这里插入图片描述
可以看到,NVIC是属于Cortex-M3的,不可屏蔽中断和外部中断都由它处理,它的作用如下:

  • 可嵌套中断支持
  • 向量中断支持
  • 动态优先级调整支持
  • 中断延迟大大缩短
  • 中断可屏蔽

NVIC可管理240个中断,15个异常

2、外部中断/事件控制器(EXTI)

在这里插入图片描述

EXTI是属于STM32的,功能如下:

  • 每个中断/事件都有独立的触发和屏蔽
  • 每个中断线都有专用的状态位
  • 支持多达20个软件的中断/事件请求
  • 检测脉冲宽度低于APB2时钟宽度的外部信号。

管理STM32的16个IO口(占用 EXTI0至 EXTI15),以及片上的4个外设PVD输出,RTC闹钟事件,USB唤醒事件、以太网唤醒事件(按顺序占用EXTI16,EXTI17,EXTI18,EXTI19)
注意:以太网唤醒事件只适用于互联型。

(1)中断和事件的区别

  • 中断:需要CPU参与,需要软件的中断服务函数才能完成中断后产生的结果
  • 事件:靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果

(2)中断触发流程

1、输入线输入一个信号(中断)
2、进行边沿检测(上升沿或下降沿触发)
3、或门进入中断挂起请求寄存器
4、若打开了中断屏蔽寄存器,与门输出到NVIC中断检测电路

(3)事件触发流程

1、输入线输入一个信号(事件)
2、进行边沿检测(上升沿或下降沿触发)
3、若打开了事件屏蔽寄存器,与门输出一个1到脉冲发生器,产生一个脉冲,供其他外设使用。

3、中断/事件线的映像

在这里插入图片描述
通过相应寄存器,可以配置16个IO口具体哪一个为EXTI中断源,每一个中断线上只能映像一个IO口,比如,你映像了PA0,那PB0~PG0不能再作为中断源。

4、向量表

ST公司以M3为内核,制造了STM32单片机,制造过程中对支持的中断进行了裁剪,所以STM32只能支持60个中断,15个异常,如下,就是STM32公司支持的中断和异常,叫中断向量表,灰色部分就是15个异常,剩下的就是60个中断。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、中断的优先级及分组

1、中断优先级

中断很多,如果同时有多个中断发生,该怎么办?这里讲一下优先级。

  • 优先级:一种约定,优先级高的先做,优先级低的后做
  • 优先级分为主优先级次优先级
  • 数字越小优先级越高
  • 由名字可以知道,两个中断先比较主优先级,再比较次优先级

我们通过不同优先级例子来掌握什么是优先级。
1、假如有两个中断A,B同时到达

在这里插入图片描述
先比较主优先级:A的主优先级高于B的主优先级,那么先执行中断A。
在这里插入图片描述
先比较主优先级:A,B主优先级一样,再比较次优先级:A的次优先级高,先执行中断A
在这里插入图片描述
先比价主优先级:A,B主优先级一样,再比较次优先级:A,B次优先级一样,这时候,就根据向量表中的位置,谁的中断号小就先执行谁

2、假如有两个中断B先到,A后到
在这里插入图片描述
B先来先执行B,执行到一半,A来了,A的主优先级比B的高,B暂时挂起,等待A执行完才能继续执行B,这就是主优先级的嵌套
在这里插入图片描述
B先来先执行B,执行到一半,A来了,A,B的主优先级一样,这时候,尽管A的次优先级高,但此刻不能进行嵌套,只能等B执行完才能执行A。
总结主优先级可以嵌套,次优先级不能嵌套

2、中断优先级分组

优先级分组就是最多能设置的优先级个数
在这里插入图片描述

  • 组0:4位设置次优先级,能设置16种次优先级(0-15)
  • 组1:1位设置主优先级,3位设置次优先级,能设置2种主优先级(0-1)8种次优先级(0~7)
  • 组2:2位设置主优先级,2位设置次优先级,能设置4种主优先级(0-3)4种次优先级(0-3)
  • 组3:3位设置主优先级,1位设置次优先级,能设置4种主优先级(0-7)4种次优先级(0-2)
  • 组4:4位设置主优先级,能设置16种主优先级(0-15)

四、NVIC寄存器组和EXTI寄存器

这里只讲需要手动设置的寄存器,想了解更多,请在Cortex-M3权威指南第八章查看。

1、NVIC寄存器组

(1)NVIC_ISER(中断使能寄存器组)

在这里插入图片描述
这个寄存器组是中断使能寄存器组:
ISER0使能0~31号中断
ISER1使能32~63号中断
ISER2使能64~95号中断
ISER3使能96~127号中断
ISER4使能128~159号中断
ISER5使能160~191号中断
ISER6使能192~223号中断
ISER7使能224~239号中断
这个寄存器每一位管理一个中断,但是由于STM32是经过裁剪的,只有60个中断,所以这个寄存器组我们只用前两个 ISER0 和 ISER1

(2)NVIC_IP(中断优先级控制的寄存器组)

在这里插入图片描述
这个寄存器用来设置优先级,每个寄存器只有8位,管理一个中断的优先级,那么有240中断你,就有240个PRI寄存器。因为大多数芯片采用的是小端存储,为了不同芯片代码移植方便,所以规定这个8位寄存器高四位设置优先级,低四位保留不用。
因为一个寄存器只有8位,为了统一,四个8位PRI寄存器凑成一个32位寄存器IP,如下图:
在这里插入图片描述
我们可以知道:

  • NVIC_IP0设置0~3号中断优先级
  • NVIC_IP1设置4~7号中断优先级
  • NVIC_IP59设置236~239号中断优先级

按这样,240个寄存器,4个4个组合起来,IP寄存器就变成了6032位寄存器。
STM32只有60个中断,我们只使用IP0~IP14

(3)NVIC_AIRCR(应用程序中断及复位控制寄存器)

在这里插入图片描述
这个寄存器就是用来设置分组的寄存器,8~10位用来设置分组。
设置分组时,必须把钥匙写进去,不然不能进行写操作。比如:

NVIC_AIRCR|=0X05FA0500; 		//写入钥匙和分组2

2、EXTI寄存器

(1)EXTI_IMR(中断屏蔽寄存器)

在这里插入图片描述
这个寄存器就是用来开放来自线x的中断请求。

(2)EXTI_RTSR(上升沿触发选择寄存器)

在这里插入图片描述
输入信号为上升沿时有效

(3)EXTI_FTSR (下降沿触发选择寄存器)

在这里插入图片描述
输入信号为下降沿时有效

(4)EXTI_PR(挂起寄存器)

在这里插入图片描述
挂起寄存器,对应位为1,说明有中断触发请求,对应位写1可以清除状态,否则会反复进入中断服务函数。

五、外部中断配置寄存器 1~4

这些寄存器就是配置输入线映射的寄存器,总共有四个。
在这里插入图片描述
在这里插入图片描述
如上

  • 向[3:0]位写入0001,说明中断/事件线0上,选择PB0为外部中断输入源
  • 向[7:4]位写入0001,说明中断/事件线1上,选择PB1为外部中断输入源
    可以看到,选择几号引脚,就对应几号中断线。
    AFIO_EXTICR1(外部中断配置寄存器1 ),管理0—3号中断线
    AFIO_EXTICR2(外部中断配置寄存器2 ),管理4—7号中断线
    AFIO_EXTICR3(外部中断配置寄存器3 ),管理8—11号中断线
    AFIO_EXTICR4(外部中断配置寄存器4 ),管理12—15号中断线。

六、总结

1、关于外部中断配置步骤

  • 1、开启复用时钟,设置映射关系(选择具体IO口引脚为中断输入源)
  • 2、开放来自线x的中断请求
  • 3、设置触发条件(上升沿、下降沿)
  • 4、分配中断向量控制器(分组和设置优先级并使能)
  • 5、编写中断服务函数(编写中断要处理的事情)

2、涉及寄存器总结

  • 1、RCC_APB2ENR
    开启复用时钟
  • 2、AFIO_EXTICR1~4
    选择中断输入源
  • 3、EXTI_IMR
    开放中断请求
  • 4、EXTI_RTSR和EXTI_FTSR
    选择触发条件
  • 5、NVIC_AIRCR
    设置分组
  • 6、NVIC_ISER0~1
    使能具体中断
  • 7、NVIC_IP0~14
    设置优先级
  • 8、EXTI_PR
    清除中断标志
评论 2 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

故梦听风吟

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值