中断硬件框架

339 阅读3分钟

本文已参与【新人创作礼】活动,一起开启掘金创作之路。

一、中断路径上的3个部件

  • 中断源:中断触发的源多种多样,比如GPIO、定时器、UART、DMA等等。它们都有自己的对应的中断控制寄存器,可以进行相关设置:使能、获取状态、设置中断类型等等。
  • 中断控制器:把各种中断源发出的中断信号,汇聚到中断控制器。可以在中断控制器中设置各个中断的优先级。CPU收到中断信号后,可以读取中断控制器的寄存器,判断哪个中断有先解决。
  • CPU:没执行完一条指令,都会判断一下是否有中断发生了。CPU也有自己的寄存器,用来使能/禁止中断,这是中断处理的总开关。

在这里插入图片描述

CPU的中断来源不止中断控制器

二、各个芯片的中断线路

STM32的中断控制器是NVIC,用来处理外部中断。它会从多个中断源中获取出优先级最高的中断,向CPU发出中断信号。 在这里插入图片描述

STM32MP157的中断控制器,通用中断控制器(GIC)。 该控制器包括一组用于管理单核或多核系统中的中断的硬件资源。GIC提供了内存映射寄存器,可用于管理中断源和行为,以及(在多核系统中)用于将中断路由到各个CPU核。它使软件能够屏蔽,启用和禁用来自各个中断源的中断,以(在硬件中)对各个中断源进行优先级排序和生成软件触发中断。它还提供对TrustZone安全性扩展的支持。GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。 在这里插入图片描述

IMX6ULL中没有EXTI控制器,GPIO中断配置、控制都在GPIO模块内部实现。IMX6ULL的GIC和STM32MP157的GIC是类似的。 在这里插入图片描述

各类芯片的中断寄存器

GPIO

STM32F103是先通过GPIO控制器,设置外部中断。有一点比较特殊的是一些引脚只能同时使用一个中断。 在这里插入图片描述

EXTI

从GPIO外部中断控制器,中断信号会接着到EXTI控制器,可以设置中断触发的方式,是否需要屏蔽中断。 在这里插入图片描述 沿着上面框图中的红线,我们要设置:

  • Falling trigger selection register:是否选择下降沿触发
  • Rising trigger selection register:是否选择上升沿触发
  • Interrupt mask register:是否屏蔽中断

NVIC

最后众多的中断汇聚到NVIC,它会从多个中断源中取出优先级最高的中断,向CPU发出中断信号。 中断处理后,程序可以对NVIC的寄存器写入,清除中断。 在这里插入图片描述

CPU

cortex M3/M4的处理器一般都有PRIMASK、FAULTMASK、BASEPRI寄存器

  • PRIMASK:可以屏蔽所有优先级可配置的中断
  • FAULTMASK:除了一般的中孤单外,可以把HardFault都禁止
  • BASEPRI:用来屏蔽中断,只有优先级大于或等于BASEPRI,才可以使用指令来设置它。