Arm STM32F2引导加载程序问题

Arm STM32F2引导加载程序问题,arm,stm32,bootloader,Arm,Stm32,Bootloader,我已经编写了一个引导加载程序来跳入我的应用程序。 首先,我尝试了一个简单的闪烁led应用=>我能够从引导加载程序跳入应用程序 现在我想跳进我真正的应用程序。应用程序单独运行良好,但当我从引导加载程序跳转到应用程序时,一旦中断被启用,应用程序就会崩溃,我的跳转代码: __disable_irq(); SCB->VTOR = (uint32_t)0x0800BA00; JumpAddress = *(__IO uint32_t*) (0X0800BA04); JumpToApplicat

我已经编写了一个引导加载程序来跳入我的应用程序。 首先,我尝试了一个简单的闪烁led应用=>我能够从引导加载程序跳入应用程序

现在我想跳进我真正的应用程序。应用程序单独运行良好,但当我从引导加载程序跳转到应用程序时,一旦中断被启用,应用程序就会崩溃,我的跳转代码:

__disable_irq();
 SCB->VTOR = (uint32_t)0x0800BA00;
 JumpAddress = *(__IO uint32_t*) (0X0800BA04);
 JumpToApplication = (pFunction) JumpAddress;
__set_MSP(*(__IO uint32_t*) 0X0800BA00);
 JumpToApplication();
我不知道是什么错了,为什么激活中断会使应用程序崩溃


感谢您的帮助

在跳转到应用程序之前,您应该取消启动加载程序中初始化的所有内容。如果引导加载程序在中断时使用USART,则应禁用此USART(例如使用
RCC->AHBxRST
/
RCC->APBxRST
寄存器)并禁用其中断。您还应该在启用中断的情况下跳转到应用程序。你的应用程序应该得到芯片,就像正常复位后一样

如果您的应用程序使用ST中名为SPL或HAL的垃圾代码,那么请确保此代码不会将SCB->VTOR重置为0或0x8000000,因为通常它在
SystemInit()
中执行此操作,这是在
main()
之前从
reset\u Handler()
调用的


顺便说一句,你对你的申请地址绝对确定吗?您通常将应用程序放在页面边界处,而您的代码并不表示-
0x800ba00
(46.5kB)距离最近的页面边界32kB和48kB相当远…

在跳转到应用程序之前,您应该取消启动加载程序中初始化的所有内容。如果引导加载程序在中断时使用USART,则应禁用此USART(例如使用
RCC->AHBxRST
/
RCC->APBxRST
寄存器)并禁用其中断。您还应该在启用中断的情况下跳转到应用程序。你的应用程序应该得到芯片,就像正常复位后一样

如果您的应用程序使用ST中名为SPL或HAL的垃圾代码,那么请确保此代码不会将SCB->VTOR重置为0或0x8000000,因为通常它在
SystemInit()
中执行此操作,这是在
main()
之前从
reset\u Handler()
调用的


顺便说一句,你对你的申请地址绝对确定吗?您通常将应用程序放在页面边界处,而您的代码并不表示-
0x800ba00
(46.5kB)距离最近的页面边界32kB和48kB相当远…

设置引导代码和应用程序代码的时钟设置相同

设置引导代码和应用程序代码的时钟设置相同

谢谢您的回答。我已禁用所有外围设备和相关中断。我还需要按照你的建议重置它们?我还重新启用了跳跃前的常规中断。在SystemInit()中,我已经将VECT_TAB_偏移量设置为0xBA00。当应用程序激活中断时,它仍然不起作用。你还有别的想法吗?关于地址,我确信我写的链接器应用程序文件适合这些地址是好的。@caius-您可以指示链接器将您的应用程序设置为0x800ba00,但请注意,将该应用程序刷新到该地址将擦除0x8008000(32kB)的内存。如果它仍然不起作用,那么我想你应该试着调试你的问题-验证适当寄存器的值,看看到底什么是“崩溃”(“不按预期工作”或“跳入硬故障”或其他)等等。再次感谢你的时间。我将尝试调试它,但我不知道如何做后跳入应用程序。关于地址,我将按照您的建议从0x8008000中删除。要了解如果我不删除它有什么风险?@caius如果你不删除整个页面-从0x8008000到0x800bff-应用程序无法在那里写入。确保引导加载程序没有放在那里。要调试这个问题,只需以您喜欢的任何方式刷新应用程序,并启动应用程序的调试会话(而不是引导加载程序),但启动它时不要同时刷新它。闪烁应该是一个单独的步骤。好的,没有在应用程序中的中断激活,我可以跳入它并执行它,所以我猜应用程序的写入不是一个问题,但为了安全,我会先擦除它。我的引导加载程序在新页面之前停止。调试还可以,但我的应用程序在闪存并在不启动的情况下启动时运行良好。但是我不确定我的IDE是否分别完成了这两个步骤,我会检查一下。谢谢你的回答。我已禁用所有外围设备和相关中断。我还需要按照你的建议重置它们?我还重新启用了跳跃前的常规中断。在SystemInit()中,我已经将VECT_TAB_偏移量设置为0xBA00。当应用程序激活中断时,它仍然不起作用。你还有别的想法吗?关于地址,我确信我写的链接器应用程序文件适合这些地址是好的。@caius-您可以指示链接器将您的应用程序设置为0x800ba00,但请注意,将该应用程序刷新到该地址将擦除0x8008000(32kB)的内存。如果它仍然不起作用,那么我想你应该试着调试你的问题-验证适当寄存器的值,看看到底什么是“崩溃”(“不按预期工作”或“跳入硬故障”或其他)等等。再次感谢你的时间。我将尝试调试它,但我不知道如何做后跳入应用程序。关于地址,我将按照您的建议从0x8008000中删除。要了解如果我不删除它有什么风险?@caius如果你不删除整个页面-从0x8008000到0x800bff-应用程序无法在那里写入。确保引导加载程序没有放在那里。要调试这个问题,只需以您喜欢的任何方式刷新应用程序,并启动应用程序的调试会话(而不是引导加载程序),但启动它时不要同时刷新它。闪烁应该是一个单独的步骤。好的,没有激活