使用 CubeMX 时,PlatformIO 中为 STM32 定义 NVIC 的文件在哪里?

Where are the files defining NVIC for STM32 in PlatformIO when using CubeMX?

我最近改用 PlatformIO 来使用以下工作流程为 STM32 进行开发:

总的来说,这很有效。然而,我之前在 ST 的 CubeMX IDE 中使用 CubeMX 代码生成,它在源目录中放置了一个 .s 文件,(据我所知)定义了 NVIC,以及用于的默认函数exceptions/interrupts 未明确定义(即,由其默认的弱实现处理的那些。)我看不到它在新工作流中的何处定义。这是作为构建过程的一部分动态生成的吗?

我问的原因是(除了想更好地了解整个过程),我想为 EXTI0 编写一个中断处理程序,但将其作为软件中断触发,而不是分配一个引脚给它。如果那是不可能的,那么也许整个观点都没有实际意义。

我找到了答案。这些步骤可能对遇到此问题的其他人有用。这是在 MacOS 上完成的,但应该与其他操作系统的过程类似。

构建过程中,可以看到文件名。它将以 startup_ 开头,后跟您正在开发的特定芯片的名称。在我的例子中,这条线是

Compiling .pio/build/disco_f072rb/FrameworkCMSISDevice/gcc/startup_stm32f072xb.o

在我的用户目录的 .platformio 文件夹中搜索,我找到了匹配的 .s 文件,在我的例子中是 .platformio/packages/framework-stm32cube/f0/Drivers/CMSIS/Device/ST/STM32F0xx/Source/Templates/gcc/startup_stm32f072xb.s

文件路径的结构表明了我使用的硬件和框架的细节:STM32Cube框架、F0系列芯片和GCC编译器。找到这个文件的最简单方法,以及我是如何找到它的,是使用终端中的 find 命令来搜索 PlatformIO 目录。

阅读这个文件给出了我正在寻找的行,定义了用于异常和中断处理的函数的名称,例如:

.weak      EXTI0_1_IRQHandler
.thumb_set EXTI0_1_IRQHandler,Default_Handler

看起来,当我为某些驱动程序使用 CubeMX HAL 时,基本启动代码是使用 CMSIS 完成的,因此对于基于 HAL、LL 或 CMSIS 的构建应该是相同的。