如何在应用程序(stm32f4 HAL)中更改 SCB->VTOR?

How to change SCB->VTOR in app (stm32f4 HAL)?

我为 STM32F4 构建引导加载程序并构建用户应用程序,并在 system_stm32f4xx.c 文件中为 SCB->VTOR 手动更改 VECT_TAB_OFFSET 值,但如果我在应用程序中执行此操作。运行不正常。

我在 main() 的开头调用了 SCB->VTOR = 0x8040000,但没有成功。BOOTLOADER USER APPLICATION

STM32启动代码在main()之前调用了SystemInit()SystemInit() 设置 SCB->VTOR 值(除其他外)。 SystemInit() 在供应商提供的文件 system_stm32f4xx.c 中实现。您可以通过编辑 VECT_TAB_OFFSET 的值来自定义分配给 SCB-VTOR 的值,该值也在 system_stm32f4xx.c 中定义。 (您的项目文件夹中应该有一个 system_stm32f4xx.c 的副本,您可以为您的项目自定义。)

如果您的引导程序和应用程序需要不同的 VECT_TAB_OFFSET 值,那么您可以使用这样的预处理器语句。 (这允许引导程序和应用程序使用 system_stm32fxx.c 的相同副本。或者,您可以为每个程序使用文件的不同副本。)

#ifdef BOOT
#define VECT_TAB_OFFSET  0x00 /*!< Vector Table base offset field.
                                   This value must be a multiple of 0x200. */
#else
#define VECT_TAB_OFFSET  0x80000
#endif

只需将此代码添加到任何其他初始化之前的第一行,在 HAL_Init 之前或 /* USER CODE BEGIN 1 / / USER CODE END 1 * 之间/

__disable_irq();
SCB->VTOR = 0x8008000;
__DSB();
__enable_irq();

不要忘记在 ld 文件中保留引导加载程序内存 window:

FLASH    (rx)    : ORIGIN = 0x8008000,   LENGTH = 2048K - 0x8000

就是这样,即使调试器也会运行此代码w/o Stm32CubeIDE 中偏移量为 0x8008000 的引导加载程序,但是 w/o 调试器您必须在闪存开始处有引导加载程序。

删除启动文件中设置的VTOR。它不应该在那里。

在将控制权传递给应用程序之前,在引导加载程序中设置 VTOR