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

标签 c embedded stm32 bootloader stm32f4

我为 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值,那么您可以使用这样的预处理器语句。 (这允许 Bootstrap 和应用程序使用 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

关于c - 如何在应用程序(stm32f4 HAL)中更改SCB->VTOR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58217994/

相关文章:

c - 用 C 打开和读取文件

erlang - 使用Erlang进行嵌入式开发是否可行?

在开关盒中类型转换成更大的类型

c - 与外部 SPI 闪存通信时是否应该禁用中断?

stm32f4discovery - OpenOCD - telnet 上传演示程序

c++ - 无法让 RTC 工作

使用 GCC 生成连续的 Hex 文件

c++ - C和C++不完全数组指针转换规则的区别

c - ncurses 终端大小

c++ - C/C++ XMPP 库适用于 Android (NDK) 和 iOS