单片机学习小组
直播中

一刀两断

8年用户 1011经验值
私信 关注

STM32的“外部中断”/“异常”和“事件”到底是什么意思?

STM32的“外部中断”/“异常”和“事件”到底是什么意思?

回帖(1)

卢灏

2022-2-10 10:51:01
一、Cortex-M3 处理器内核 vs 基于Cortex-M3的MCU

Cortex-M3 处理器内核是由 ARM 公司设计的,传统意义上的 ARM7/ARM9(简称A7/A9) 也是处理器内核,也是 ARM 公司设计的。
Cortex‐M3处理器内核:故名思意就是单片机(MCU)的核心,是单片机的中央处理单元(CPU)
完整的基于CM3的MCU还需要很多其它组件。在芯片制造商得到CM3处理器内核的使用授权后,它们就可以把CM3内核用在自己的硅片设计中,添加存储器,外设, I/O以及其它功能块。不同厂家设计出的单片机会有不同的配置,包括存储器容量、类型、外设等都各具特色。
二、中断和异常

中断属于异常的一种。所有能打断正常执行流的事件都称为异常
CM3 的所有中断机制都由 NVIC 实现。除了支持 240 条中断之外, NVIC 还支持 16‐4‐1=11 个内
部异常源(保留了 4+1 个档位),可以实现 fault 管理机制。结果, CM3 就有了 256 个预定义的异常类型。其中编号为 1-15 的对应系统异常,大于等于 16 的则全是外部中断。
类型编号为 1-15 的系统异常如表 7.1 所示(注意: 没有编号为 0 的异常),从 16 开始的外部中断类型如表 7.2 所示


虽然 CM3 是支持 240 个外中断的,但具体使用了多少个是由芯片制造商决定。 CM3 还有一个NMI(不可屏蔽中断)输入脚。当它被置为有效( assert)时, NMI 服务例程会无条件地执行。
三、STM32外部中断(EXTI )

STM32F103 是基于 CM3 内核设计的,ST 公司(芯片制造商)在原有 CM3 内核基础上,添加了储如定时器、串口、DMA等外设,最终组合成一个STM32单片机。其中 CM3 内核是整个单片机的核心部分,相当于CPU(大脑)
所以 STM32 根据原有 NVIC 中断,从中选择性添加了部分中断,并重新命名与排序。下图是STM32的中断向量表:

从表中可以看出,STM32 对上文中 CM3 内核的系统异常/外部中断表重新进行了编排和删减,把编号从-3 至 6 的中断向量定义为系统异常。从编号 7 开始将原本 CM3 所描述的外部中断又分成了若干中断类型:外部中断(EXTI)、定时器中断、DMA中断等等。
细心的朋友可能已经发现了这里有一个概念冲突:外部中断。释义如下:

  CM3 内核描述中的外部中断均是相对于内核而言的,比如串口中断、定时器中断等等都是(内核的)外部中断!而这里提到的STM32的外部中断(EXTI)指的是芯片的外部中断,主要是由芯片外部事件触发的中断,不是内核的外部中断!
STM32的外部中断(EXTI)属于内核的外部中断一部分。在STM32手册中外部中断(EXIT)均是指芯片的外部中断加粗样式,也就是上表中的 EXIT0-9。
这里的 内外部 就是物理空间的内外部。
所以当阅读 STM32 参考手册时,外部中断(EXTI)指的均是芯片外部(IO引脚)事件触发的中断。而当阅读网络文章时,则要注意区分。为了避免混淆,都会加 (EXTI) 以区分。
这里还有一个概念:软件中断 ,下文中再详述。
另外 STM32 是没有 内部中断 这个概念的,

四、中断/事件关系

MCU运行过程,其中会有许多各种各样的事件,比方:管脚电平变化、计数器溢出、DMA空、FIFO非空、AD转换结束、超时、外设使能、初始化等等。
其中有些事件本身是不会导致中断产生的,比方外设使能或部分初始化动作是不会导致中断发生的;有些事件则可能导致中断发生,比方计数器溢出,AD转换结束等,这些就是中断事件。当然这些中断事件最终能否触发后续中断,还需要对中断事件进行配置。
先说结论



  • 中断:处理器运行的一个状态,该状态会打断处理器当前正常的进程。
  • 事件:就是事件。其可能触发中断。
  • 中断事件:触发中断的事件,而且软件上也有中断函数的,叫中断事件
  • 中断是中断事件发生的结果,中断事件属于事件,事件可分为中断事件或非中断事件

我们可以借助 STM32 MCU的GPIO的外部事件与中断控制器的框图来理解上述结论。

  这张图的在 STM32中文手册 中是错误的,英文版的是对的。因而网上很多文章此处的配图都有误,我这里重置了。

我们先关注两个寄存器:中断屏蔽寄存器和事件屏蔽寄存器。这两个寄存器决定了从编号1、2、3输入进来的事件最终会输出脉冲发生器(不产生中断)还是 NVIC 中断控制器(产生中断)。从而决定了输入的事件是中断事件还是非中断事件。
MCU参考手册里在谈到事件的触发方式时引入了事件模式和中断模式两个概念。这里的不同模式就是通过控制这两个寄存器实现的。

  例子:
比方STM32的GPIO口的电平跳变是可能触发外部中断(EXIT)的。但在具体配置时,可以根据需要来决定启用还是禁用相关脚的中断功能,从而选择不同的事件触发方式,即:外部事件模式和外部中断模式。如果不希望电平跳变事件触发中断,就配置为事件模式,反之,配置为中断模式
接下来详细说明 EXIT 执行过程。
上图中信号线上划有一条斜线,旁边标志 19字样的注释,表示相同的这样的中断线路共有19条。EXTI中有一个边沿检测电路(编号②)监视着输入线(编号①),并分别与上升沿和下降沿选择寄存器对比。 如果在这两个寄存器中相应的中断线检测开启了,那么当中断线上有上升沿或者下降沿时边沿检测电路就会产生一个事件触发信号给后继的或门。
除了边沿检测电路的输出外,或门(编号 ③)还接受一个软件中断事件寄存器的输入。 软件中断事件寄存器的存在使得我们可以通过软件的形式直接触发某一个中断线上的事件。

  我们可以通过程序控制此处的软件中断事件寄存器,人为的通过或门(编号 ③)输入一个外部事件,从而不需要真实的外部输入,就能产生一个可能触发中断的事件,相当与模拟该中断线上的事件。
  诸如ADC、串口、定时器之类产生的中断,就叫 名称+中断,如:定时器中断、串口中断、ADC中断。并不属于这里的软件中断范畴,STM32手册中唯一提到软件中断这个词的就是指这个寄存器,不要混淆了。
或门的输出接到了两个与门(编号 ④、⑤)上,一方面与中断屏蔽寄存器求与编号(④)触发中断, 另一方面与事件屏蔽寄存器求与(⑤)触发事件。 中断屏蔽寄存器控制了相应的中断是否开启了,如果开启了中断将会产生一个中断触发信号,置位中断请求寄存器, 同时将中断触发信号提交给中断控制器(NVIC)。 同样的道理,事件屏蔽寄存器控制事件是否开启,如果开启则直接产生一个脉冲通知后继的功能模块处理事件,例如通知DMA读写内存等。
从这张图上我们也可以知道,从外部激励信号来看,中断和事件的产生源都可以是一样的。之所以分成2个部分,因为中断是需要CPU参与的,需要软件的中断服务函数才能完成中断后产生的结果;但是事件,是靠脉冲发生器产生一个脉冲,进而由硬件自动完成这个事件产生的结果,当然相应的联动部件需要先设置好,比如引起DMA操作,AD转换等;

  简单举例: 外部I/O触发AD转换,来测量外部物品的重量;
  

  • 如果使用传统的中断通道,需要I/O触发产生外部中断(EXIT),外部中断(EXIT)服务程序启动AD转换,AD转换完成中断服务程序提交最后结果;
  • 要是使用事件通道,I/O触发产生事件,然后联动触发AD转换,AD转换完成中断服务程序提交最后结果;

相比之下,后者不要软件参与启动AD转换,并且响应速度也更块;要是再使用事件触发DMA操作,就完全不用软件参与(AD转换后操作)就可以完成某些联动任务了。
总结:



  • 事件触发:机制提供了一个完全由硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法;
  • 中断触发:由软件控制,CPU 参与。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分