半小时搞懂STM32面经知识——中断

1.中断

1.1 中断是什么?

在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行
在这里插入图片描述
在这里插入图片描述

1.2 中断优先级

在Cortex-M3(CM3)内核中,每个中断的优先级都是用寄存器中的8位来设置的,这样就有2^8 =256级中断,意味着可以支持256个中断,这其中包含了16个内核中断和240个外部中断,并且具有256级的可编程中断设置。但许多芯片厂商并没有使用CM3内核的全部东西,而是只用了它的一部分,而多余的部分应该是设计者考虑到后续应用发展而冗余设计的。
STM32F1只用了 NVIC->IPR 的高四位,[7:4]低四位取零,这样2^4=16,只能表示16级中断嵌套。
在这里插入图片描述

1.3 中断向量表

中断向量表(Interrupt Vector Table)是存储中断处理程序地址的表格。它是一个特定的数据结构,用于将每个中断事件映射到相应的中断处理程序。
中断向量表为每个外设作了硬件编号,可以把它理解为默认顺序。
在这里插入图片描述在这里插入图片描述
以上向量表中,灰色标住的是体现在内核水平的(异常),其余的是外设水平的(外部中断)
系统异常有 8 个(如果把 Reset 和 HardFault 也算上的话就是 10 个),外部中断有 60 个。

1.4 NVIC

这么多的中断,该怎样管理呢?嵌套向量中断控制器NVIC
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级
在这里插入图片描述

CASE1:外设B工作时遇到中断请求,外设A需要工作,因为A的抢占优先级高,这时外设B会立刻停止,外设A抢占B开始工作。抢占优先级是可以嵌套的。
在这里插入图片描述
CASE2:外设B工作时遇到中断请求,外设A需要工作,因为两者抢占优先级相同,此时只能实行先到先得,B弄完后A再来了。响应优先级是不能嵌套的。
在这里插入图片描述

抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队
无论是抢占优先级(主优先级)还是响应优先级(子优先级),优先级数值越小,就代表优先级越高。

1.5 中断编程

1.使能外设某个中断
2.初始化 NVIC_InitTypeDef 结构体

typedef struct
{
    uint8_t NVIC_IRQChannel; // 中断源
    uint8_t NVIC_IRQChannelPreemptionPriority; // 抢占优先级
    uint8_t NVIC_IRQChannelSubPriority; // 子优先级
    FunctionalState NVIC_IRQChannelCmd; // 中断使能或者失能
} NVIC_InitTypeDef;

初始化流程:
NVIC_InitTypeDef NVIC_InitStructure;
// 1.选择优先级分组
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
// 2.选择需要产生中断的外设
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
// 3.设置抢占优先级级别
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
// 4.设置响应优先级级别
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
// 5.使能中断
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
// 6.初始化中断
NVIC_Init(&NVIC_InitStructure);

3.编写中断服务函数
注:中断服务函数的函数名必须跟启动文件里面预先设置的一样,如果写错,系统就在中断向量表中找不到中断服务函数的入口,直接跳转到启动文件里面预先写好的空函数,并且在里面无限循环,实现不了中断。

1.6 EXIT

EXIT(External interrupt/event controller)外部中断/事件控制器,管理了控制器的 20 个中断/事件线。
每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI 可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
线 0~15:对应外部 IO 口的输入中断。
线 16:连接到 PVD 输出。
线 17:连接到 RTC 闹钟事件。
线 18:连接到 USB 唤醒事件。
STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个
在这里插入图片描述

1.7 EXIT的功能框图

在图 EXTI 功能框图 可以看到很多在信号线上打一个斜杠并标注 “20” 字样,这个表示在控制器内部类似的信号线路有 20 个,这与 EXTI 总共有 20 个中断/事件线是吻合的。所以我们只要明白其中一个的原理,那其他 19 个线路原理也就知道了。
在这里插入图片描述
EXTI0 至 EXTI15 用于 GPIO,通过编程控制可以实现任意一个 GPIO 作为 EXTI 的输入源。由表 EXTI 中断 _ 事件线可知,EXTI0 可以通过 AFIO 的外部中断配置寄存器 1(AFIO_EXTICR1) 的 EXTI0[3:0] 位选择配置为 PA0、PB0、PC0、PD0、PE0、PF0、PG0、PH0 或者 PI0
在这里插入图片描述
AFIO的主要作用:用于引脚复用功能的选择和重定义,在STM32中主要完成复用功能引脚重映射和中断引脚选择。
AFIO中断引脚选择:是一个中断引脚选择器可以在前面GPIO外设的16个引脚中选择一个连接到EXTI边沿检测及控制中所以相同的Pin不能同时触发中断,因为PA0,PB0,PC0通过AFIO选择后只有其中一个可以连接到EXTI的通道0上,PB1,PC1等也只有一个可以接入EXTI上。

在这里插入图片描述
两大功能:产生中断和产生事件
产生中断:
(1)输入线
EXTI有19个中断/事件输入线,中断输入可以来自GPIO,也可以来自外设。
(2)边沿检测电路
可以通过寄存器设置电路是上升沿触发(EXTI_RTSR)或下降沿触发(EXTI_FTSR)或两者皆触发。若检测到有效信号则输出高电平(1),否则低电平(0)。
(3)或门
输入分别是来自边沿检测电路和软件中断寄存器(EXTI_SWIER),只要有一个输入为高电平,输出即为高电平。
(4)与门
输入分别来自中断屏蔽寄存器(EXTI_IMR)和请求挂起寄存器(EXTI_PR),需要两个输入为高电平,输出才为高电平。
(5)输出至NVIC
将EXTI_PR寄存器内容输出到NVIC内,从而实现系统中断事件控制。以上均为NVIC路线。
产生事件:
(6)与门
输入分别来自事件屏蔽寄存器(EXTI_EMR)和或门输出,需要两个输入为高电平,输出才为高电平。
(7)脉冲发生器
当输入端,即与门(6)的输出端,是一个高电平就会产生一个脉冲;如果输入端是低电平就不会输出脉冲。
(8)产生事件
脉冲发生器产生的脉冲信号,是事件线路最终的产物,这个脉冲信号可以给其他外设电路使用。

1.8 中断开始前要进行些什么操作?stm32裸机如何处理中断(原理)?是谁收到的中断?中断处理流程?谁执行中断服务函数?中断函数如何执行?

中断开始前要进行些什么操作?
①使能中断
②设置优先级
③编写中断服务函数
④清除中断标志
stm32裸机如何处理中断(原理)?
①外设发出中断请求
②处理器暂停当前执行的任务,保护现场,将当前位置的程序计数器(PC)地址压栈。
③程序跳转到中断服务程序, 执行中断服务程序
④恢复现场, 将栈顶的值会送到PC
⑤跳转到被中断的位置执行下一个指令。

中断服务函数:相对于正常子函数,中断服务函数有以下需要注意的地方:
	1、中断服务函数不能传入参数;
	2、中断服务函数不能有返回值;
	3、中断服务函数应该做到短小精悍,快入快出,禁止延时性的过程。
	4、不要在中断函数中使用printf函数,会带来重入和性能问题,不要出现浮点运算。

是谁收到的中断?
答:外部中断是外部中断控制器(EXIT和NVIC)接收和处理的,异常是由内部的异常处理机制直接接收和处理的
中断处理流程?

中断请求
中断识别
优先级判断
中断使能
保护现场
执行中断服务例程
清除中断标志
恢复现场
中断返回

谁执行中断服务函数?
CPU
如果中断的响应优先级和抢占优先级都一样呢?谁先发生?
中断向量表的中断号,中断号越小,中断越优先发生
除了中断的响应优先级、抢占优先级、中断号,还有那些影响中断响应的因素呢?
中断处理函数的执行时间:如果执行时间很长,其他中断的请求有可能就被挂起,只有当前的中断处理函数执行完成,其他中断继续执行
中断屏蔽:前面简单介绍了几种中断,我们知道中断屏蔽某位置1,该中断就不能发生,即使优先级高也无法执行。
中断触发的原因只有中断产生了中断请求这一种情况吗?
通常情况下是这样,那不通常呢?具体要取决于处理器的架构和中断控制器的功能。有以下触发原因:
1.软件触发中断:有些处理器允许软件生成中断请求信号,触发中断。
2.异常或错误中断:处理器发生异常、错误、故障的情况下,可能触发响应的中断。
3.调试中断:程序在debug调试的时候暂停,跳转,会响应中断。
那么调试中断响应的是哪些中断?
1.调试监听中断
2.断点
3.数据观察暂停

1.9 定时器和中断处理有什么需要注意的吗?

中断处理时间,尽量避免在其中执行复杂或耗时较长的操作;
共享资源保护,注意保护这些共享资源的一致性;

1.10 Stm32是要中断嵌套的吗,什么时候需要什么时候不需要?

实时性要求高,多个外设同时触发需要。简单应用不需要;

1.11 中断和异常有何区别?

中断和异常都是CP对系统发生的某个事件做出的一种反应,但中断是由外因引起,异常是由CPU本身引起。
在这里插入图片描述

1.12 中断和轮询的区别是什么?

中断是由硬件来判断是否发生外部事件并通知CPU,然后采用专用的中断服务程序来处理事件。轮询是周期/连续的检查外部事件是否发生,需要消耗大量CPU的处理时间。

1.13 外部中断是什么?

由外部事件触发的中断。通常通过引脚上的信号来触发。
当外部中断产生时,触发信号会被外部中断控制器(EXIT)所接收和处理并转发到处理器核心的中断控制器(NVIC)中,NVIC会根据预设的优先级规则对收到的中断请求进行排序,在保护好现场后,程序会跳转执行优先级较高的中断服务程序,程序运行完后会清除中断并恢复现场最后返回到主程序运行。

  • 16
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值