本文是对江科大32视频内容进行的总结与讲解,用作个人学习记录以及帮助大家理解相关知识。
目录
6. 为什么为什么触发中断时需要通过请求挂起寄存器,但是触发事件时不用呢?
1. 什么是中断
之所以设计中断系统,是因为许多嵌入式系统需要对外部事件进行实时响应,比如传感器触发、按键输入、通信数据到达等。通过中断系统,系统可以立即暂停当前的执行,转而处理来自外部设备的事件,确保对事件的实时响应。
如果没有中断系统,那么程序就只能依靠函数一直执行监听任务,无法继续下面的任务。
2. 中断执行流程
中断函数一般放在子程序中,当中断来临时自动调用该函数,无需手动显示调用。
3. 中断向量表
中断向量表中地址的作用是什么呢?
由于中断函数的地址是由编译器来自动分配的,是不固定的。但是受硬件的限制,中断跳转只能跳转到固定的地址执行程序,所以为了能让硬件跳转到不固定的中断函数中,需要在内存中定义一个固定地址的列表。中断发生后跳转到固定的地址,在这个固定地址中,加上编译器和一个跳转到中断函数的代码就能跳转到任何地方了。
4. 嵌套中断向量控制器(NVIC)
4.1 NVIC介绍
在STM32中,NVIC是内核外设,理解成CPU的小助手,用来统一分配中断优先级和管理中断。
在中断向量表中可以看到STM32有很多中断,如果全部与CPU直接连接需要引出很多线,这样会设计很麻烦,并且一旦出现很多中断同时申请,CPU就不知道该咋办了,毕竟CPU是负责运算的,所以中断分配就交给NVIC了。
NVIC有很多输入口(输入线上斜杠n的意思是一个外设可能会占用多个中断通道),比如EXTI外部中断、TIM中断等等,但只有一个输出口。NVIC根据每个中断的优先级分配中断先后顺序,通过右边的输出口告诉CPU此刻该处理哪个中断。
4.2 NVIC优先级分组
数字越小,优先级越高。
抢占优先级比响应优先级更牛,当CPU正在处理A中断时,如果B中断也发起了中断申请并且中断优先级比A高的话,CPU先暂停A去处理B。
5. EXTI
5.1 EXTI简介
相同的pin不能同时触发中断,比如PA0和PB0不能同时触发中断,但是PA1和PA2可以,下面会讲原因。
中断响应:申请中断,让CPU执行中断函数。
事件响应:当外部中断检测到引脚电平变化时,正常会选择触发中断,让CPU执行中断函数;但是STM32中也可以选择触发事件,选择触发事件的话,外部中断信号不会通向CPU,而是通向其它外设,触发其它外设操作,进行外设之间的联合工作。
5.2 EXTI基本结构
最左边是GPIO口的外设,每个GPIO外设有16个引脚,所以输入16条线。
在EXTI简介图片中提到EXTI只有16个通道,但是每个GPIO外设就有16通道,通道显然不够用。
所以出现了AFIO(高级功能IO),作用是:1. 复用功能引脚重映射 2. 中断引脚选择。
AFIO本质上是一个数据选择器,它可以从每个GPIO外设的16个引脚中选择一个连接到后面的EXTI通道中。
从图中也可以看出来,从PA0、PB0...PA15中只能选择一条线,那么PA0和PB0不能同时触发中断,但是PA1和PA2可以。
配置外部中断的本质实质配置的是中断线,PA1、PB1、PC1等等同一pin口的配置只是选择了中断线信号的来源,将PA1搭到EXTI_Line1上,那么PB1、PC1等等剩余的同一pin口就浮空了;如果你在程序里先配置了PA1又PB1,那么最后只有PB1会触发EXTI_Line1上的中断,你相当于把PA1这根线先和EXTI_Line1系在一起,又解开,再把PB1和EXTI_Line1系在一起了
注意外部中断的9-5会触发同一个中断函数,15-10也会触发同一个中断函数。编程的时候需要在函数再根据标志位区分是哪个中断进来的。
5.3 EXTI框图
流程如下:
- 最右边20根输入线进入边沿检测电路,选择上升沿、下降沿和双边沿出发3种模式,将边沿检测电路输出与软件中断通过或门,只要有一个为1,就能通过。所以EXTI简介中提到EXTI触发方式有上升沿、下降沿、双边沿和软件触发4种。
- 触发信号通过或门后兵分两路,上面触发中断,下面触发事件。
触发中断时,中断会置请求挂起寄存器,相当于中断标志位,通过读取这个寄存器判断是哪个通道触发的中断,该通道置1时,触发信号可以通过,此时和中断屏蔽器共同进入与门。与门本质上是开关(1与任意数x等于任意数x本身,0与任意数x等于0)。如果中断屏蔽器置1,另一个输入直接输出,如果中断屏蔽器置0,另一个输入无法输出。 - 下面触发事件时,输入信号与时间屏蔽寄存器进入与门,通过脉冲发生器发出脉冲使能其他外设。
6. 为什么为什么触发中断时需要通过请求挂起寄存器,但是触发事件时不用呢?
以下回答来自GPT