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

如何更改SCB->;应用程序中的VTOR(stm32f4 HAL)?,c,embedded,stm32,bootloader,stm32f4,C,Embedded,Stm32,Bootloader,Stm32f4,我为STM32F4构建引导加载程序,并通过在system_stm32f4xx.c文件中手动更改SCB->VTOR的VECT_TAB_偏移值来构建用户应用程序,但如果我在应用程序中这样做的话。它不能正常工作 我在main()的开头调用了SCB->VTOR=0x8040000,但它不起作用。 STM32启动代码在main()之前调用SystemInit()SystemInit()设置SCB->VTOR值(以及其他内容)SystemInit()在供应商提供的文件system_stm32f4xx.c中实

我为STM32F4构建引导加载程序,并通过在system_stm32f4xx.c文件中手动更改SCB->VTOR的VECT_TAB_偏移值来构建用户应用程序,但如果我在应用程序中这样做的话。它不能正常工作

我在main()的开头调用了SCB->VTOR=0x8040000,但它不起作用。

STM32启动代码在
main()
之前调用
SystemInit()
SystemInit()
设置
SCB->VTOR
值(以及其他内容)
SystemInit()
在供应商提供的文件
system_stm32f4xx.c
中实现。通过编辑
VECT\u TAB\u OFFSET
的值,您可以自定义分配给
SCB-VTOR
的值,该值也在
系统stm32f4xx.c
中定义。(项目文件夹中应该有一份
system_stm32f4xx.c
,您可以为项目自定义。)

如果启动和应用程序需要不同的
VECT\u TAB\u OFFSET
值,则可以使用如下预处理器语句。(这允许引导程序和应用程序使用相同的
system_stm32fxx.c
。或者,您可以为每个程序使用不同的文件副本。)

#ifdef引导
#定义向量选项卡偏移量0x00/*!<向量表基偏移字段。
此值必须是0x200的倍数*/
#否则
#定义向量选项卡偏移量0x80000
#恩迪夫

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

__disable_irq();
SCB->VTOR = 0x8008000;
__DSB();
__enable_irq();
不要忘记在ld文件中保留引导加载程序内存窗口:

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

仅此而已,即使调试器在偏移量0x8008000的Stm32CubeIDE中不带引导加载程序也会运行此代码,但在闪存启动时不带引导加载程序。

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


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

我认为没有必要在main()中设置SCB->VTOR。在system_stm32f4xx.c中查找向量选项卡偏移量。您的SCB->VTOR值可能在SystemInit()函数中被覆盖。那么如何在SystemInit()函数之后调用它呢?我必须将SCB->VTOR语句放在哪里才能使执行正常?使用SystemInit()中已经存在的SCB->VTOR赋值。更改VECT_TAB_OFFSET的值以满足您的需要。感谢您的建议,但我有一个引导加载程序和两个应用程序空间,分别为app1和app2。最初工作的应用程序在app1中,当新的更新到达时,引导加载程序引导到app1,它存储在app2中,然后引导到app2,另一个更新存储在app1中,以此类推。这就是为什么我必须在运行时而不是在编译时更改VTOR。@suriyameras你的应用程序真的可以这样重新定位吗?你如何链接你的应用程序,使其可重新定位?通常,链接器需要在构建时知道应用程序将在何处执行。是的,我理解。我在问,“我可以在两个内存位置构建它吗?”即0x08020000和0x0806000。因为我不知道引导加载程序将在哪个地方编写新的更新应用程序。@suriyameras我不知道如何帮助您完成您描述的引导加载程序设计。但也许你应该重新考虑你的引导程序设计。将链接/定位应用程序以从预定义位置运行。因此,我认为在执行更新之前,需要将其复制到预定义的位置。我通常在flash中将更新下载到临时位置。下载完成并验证正确后,引导加载程序将删除旧应用程序并将更新应用程序复制到可执行位置。ok。非常感谢。就像你说的,我必须重新设计我的引导程序结构。主要是改变它,这是个糟糕的主意。引导加载程序应该在将控件传递给应用程序之前执行此操作。无论好坏,来自Stm32CubeMX/Stm32CubeIDE的模板都没有用户节可以轻松地进行更改。在main()之前,Startup*.s文件只有变量从Flash重新定位到RAM代码,而且一切正常。
FLASH    (rx)    : ORIGIN = 0x8008000,   LENGTH = 2048K - 0x8000