我有一个引导加载程序和一个固件,其中从引导加载程序到固件的初始跳转像魔术一样起作用,但是当我遇到从应用程序跳转回来的场景时,请做一些事情然后跳转回我的应用程序。在那里,我遇到了一些奇怪的问题,但最终都以硬伤告终。如果我将通过IAR的__enable_interrupts()激活中断,则会出现此问题。
什么是清除并重置所有正确的寄存器? 我已将MSP和PC设置为应用程序/引导程序的开头。
出于这个目的,我不必使用NVIC_Systemreset。
希望有人可以帮助我解决这个问题吗?
答案 0 :(得分:3)
有一个ST application note关于引导程序。
除上述模式外,用户还可以执行引导加载程序 通过执行从用户代码到系统内存的跳转。跳之前 引导加载程序的用户必须:
- 禁用所有外设时钟
- 禁用已使用的PLL
- 禁用中断
- 清除待处理的中断
这就是为什么当您激活中断时引导加载程序崩溃的原因。
编辑
要解决@Clifford的想法,STM32系统引导程序会退出,并使用go命令跳转到主定义地址。该地址应该是复位向量而不是main,以便正确初始化堆,堆栈和FW。之后,您可以将system_reset设置为已知的硬件状态,或者必须完全配置在应用程序中使用的外围设备,因为在引导加载程序使用它们后,它们并未设置为重置状态。
注意:如果您选择执行Go命令,则外围设备 引导加载程序使用的寄存器未初始化为默认值 在跳转到用户应用程序之前重置值。他们应该是 如果已使用,则在用户应用程序中重新配置。所以,如果IWDG 在应用程序中使用IWDG预分频器值 适应了应用程序的要求(因为 预分频器设置为其最大值)。对于某些产品,并非全部 设置重置值。有关更多信息,请参阅已知的 每个产品的引导程序版本的限制都已详细说明。
答案 1 :(得分:0)
很抱歉,迟到了。
更多调查后,我发现了问题所在。 有关我所做工作的更多说明,您的评论中也提到了一些要点。
不幸的是,我忘记了提到我们使用embOS。 这就是这里的问题。有CORE寄存器http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/CHDBIBGJ.html
在CONTROL寄存器中设置了一个位:SPSEL 如果将此位设置为“ 1”,则embOS会出现正常运行问题。 解决方案很简单:
__ set_CONTROL(0x0);
这种情况称为从embOS到Bootloader的跳转,再回到embOS的完美运行。