如何在应用程序(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
我为 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