STM32
直播中

李红

7年用户 1238经验值
私信 关注
[问答]

如何去使用STM32F103C8T6微控制器

NVIC是什么?

如何去使用STM32F103C8T6微控制器?

回帖(1)

李飞凤

2021-9-30 14:35:57
  背景知识视频教程
  STM32教程
  STM32Fx微控制器自定义引导程序开发
  使用Keil uVision学习C语言中的STM32F103C8T6微控制器
  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名称。
  如前所述,向量表必须放在处理器希望在其中找到的闪存的开头。 这是一个链接编辑器作业,在绝对文件生成期间将向量表放置在闪存数据的开头,该绝对文件是我们上传到闪存的二进制文件。
举报

更多回帖

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