国外课栈 - 国外电子信息技术

深入探索STM32硬件抽象层 - 中断

 二维码 13
文章附图

背景知识视频教程

NVIC控制器

NVIC(嵌套向量中断控制器)是基于Cortex-M的微控制器内部的专用硬件单元,负责异常处理。

下图显示了NVIC单元,处理器内核和外围设备之间的关系。 在这里,我们必须区分两种类型的外围设备:Cortex-M内核外部但STM32 MCU内部的外围设备(例如定时器,UARTS等)以及MCU外部的外围设备。 来自最后一种外围设备的中断源是MCU I / O,既可以配置为通用I / O(例如,将触觉开关连接到配置为输入的引脚),也可以驱动外部高级外围设备 (例如,配置为通过RMII接口与以太网交换数据的I / O)。 专用的可编程控制器称为外部中断/事件控制器(EXTI),负责外部I / O信号与NVIC控制器之间的互连,如下所示。

如前所述,ARM区分源自CPU内核内部的系统异常和来自外部外设的硬件异常,也称为中断请求(IRQ)。 程序员通过使用特定的ISR来管理异常,这些ISR是在较高级别编码的(大多数情况下使用C语言)。 借助包含中断服务程序存储器中地址的间接表,处理器知道了这些程序的位置。 该表通常称为向量表,每个STM32微控制器都定义自己的表。

矢量表

所有Cortex-M处理器都定义了一组固定的异常(对于Cortex-M3 / 4/7内核为十五个,对于Cortex-M0 / 0 +内核为十三个),这是所有Cortex-M系列所共有的,因此是所有STM32系列所共有的。在这里,为方便起见,您可以找到同一张表(下表)。 快速浏览这些异常是个好主意。

  • Reset:CPU复位后立即引发此异常。 它的处理程序是正在运行的固件的真正入口。 在STM32应用程序中,所有操作均从此异常开始。 处理程序包含一些旨在初始化执行环境的汇编代码功能,例如主堆栈,.bss区域等。
  • NMI:这是一个特殊的例外,它在“重置一个”之后具有最高优先级。 与Reset异常一样,它不能被屏蔽(被禁用),并且可以与关键和不可延迟的活动关联。 在STM32微控制器中,它链接到时钟安全系统(CSS)。 CSS是一种自我诊断的外围设备,可检测HSE的故障。 如果发生这种情况,则会自动禁用HSE(这意味着会自动启用内部HSI),并且会引发NMI中断,以通知软件HSE出了点问题。
  • Hard Fault:是通用故障异常,因此与软件中断有关。 禁用其他故障异常后,它将充当所有类型异常的收集器(例如,如果未启用“总线故障”,则对无效位置的内存访问会引发“硬故障”异常)。
  • Memory Management:执行代码尝试访问非法位置或违反内存保护单元(MPU)的规则时会发生。
  • Bus Fault:当AHB接口收到来自总线从站的错误响应时发生(如果是指令提取,也称为预取中止;如果是数据访问,则称为数据中止)。 也可能由其他非法访问(例如,访问不存在的SRAM存储器位置)引起。
  • Usage Fault:发生程序错误时,例如非法指令,对齐问题或尝试访问不存在的协处理器。
  • SVCCall:这不是故障情况,在调用Supervisor Call(SVC)指令时引发。 实时操作系统使用它在特权状态下执行指令(需要执行特权操作的任务执行SVC指令,并且OS执行所请求的操作-这与其他OS中的系统调用相同)。
  • Debug Monitor:当处理器内核处于监视器调试模式时发生软件调试事件时,会引发此异常。 当使用基于软件的调试解决方案时,它还用作诸如断点和观察点之类的调试事件的异常。
  • PendSV:这是与RTOS相关的另一个例外。 与在执行SVC指令后立即执行的SVCall异常不同,可以延迟PendSV。 这样,RTOS可以以更高的优先级完成任务。
  • SysTick:此异常通常也与RTOS活动有关。 每个RTOS都需要一个计时器来定期中断当前代码的执行并切换到另一个任务。 所有STM32微控制器均在Cortex-M内核内部提供SysTick定时器。 即使可以使用其他所有定时器来安排系统活动,专用定时器的存在也可以确保在所有STM32系列之间的可移植性(由于与MCU内部芯片相关的优化原因,并非所有定时器都可用作外部外围设备)。 此外,即使我们不在固件中使用RTOS,也要记住,ST CubeHAL使用SysTick计时器执行与时间相关的内部活动(并且还假定SysTick计时器配置为生成 每1毫秒中断一次)。

可以为给定MCU定义的其余异常与IRQ处理有关。 Cortex-M0 / 0 +内核最多允许32个外部中断,而Cortex-M3 / 4/7内核则允许芯片制造商定义多达240个中断。

STM32微控制器的数据表无疑是有关可用中断的主要来源。 但是,我们可以简单地在其HAL中引用ST提供的向量表。 该表是在我们的MCU的启动文件中定义的,该汇编文件以.S结尾。 打开该文件,我们可以找到该MCU的整个向量表,大约从第140行开始。

即使向量表包含处理程序例程的地址,Cortex-M内核也需要一种在内存中查找向量表的方法。 按照惯例,向量表从所有基于Cortex-M的处理器中的硬件地址0x0000 0000开始。 如果向量表位于内部闪存中(通常会发生这种情况),并且由于所有STM32 MCU中的闪存都是从0x0800 0000地址映射的,因此它是从0x0800 0000地址开始放置的,在以下情况下别名为0x0000 0000 CPU启动。

下图显示了向量表在内存中的组织方式。 该阵列的零入口是SRAM内部主堆栈指针(MSP)的地址。 通常,该地址与SRAM的末尾相对应,即其基址+大小。 从该表的第二个条目开始,我们可以找到所有异常和中断处理程序。 这意味着对于基于Cortex-M0 / 0 +的微控制器,向量表的长度等于48;对于Cortex-M3 / 4/7,向量表的长度等于256。

弄清楚向量表的某些内容很重要

  • 异常处理程序的名称只是一个约定,如果您愿意使用其他名称,则可以完全自由地对其进行重命名。 它们只是符号(程序中的变量和函数也是如此)。 但是,请记住,CubeMX软件旨在生成具有这些名称的ISR,这是ST的约定。 因此,您也必须重命名ISR名称。
  • 如前所述,向量表必须放在处理器希望在其中找到的闪存的开头。 这是一个链接编辑器作业,在绝对文件生成期间将向量表放置在闪存数据的开头,该绝对文件是我们上传到闪存的二进制文件。

启用中断

外部线路和NVIC

使用CubeMX启用中断

中断生命周期

中断优先级

Cortex-M0/0+

Cortex-M3/4/7

在CubeMX中设置中断优先级

中断重入

一次或优先屏蔽所有中断

阅读完整文档

文章分类: 嵌入式STM32
分享到: