Cortex M3从应用程序跳回到引导加载程序,再回到应用程序

时间:2019-08-21 15:11:06

标签: embedded bootloader iar firmware cortex-m3

我有一个引导加载程序和一个固件,其中从引导加载程序到固件的初始跳转像魔术一样起作用,但是当我遇到从应用程序跳转回来的场景时,请做一些事情然后跳转回我的应用程序。在那里,我遇到了一些奇怪的问题,但最终都以硬伤告终。如果我将通过IAR的__enable_interrupts()激活中断,则会出现此问题。

什么是清除并重置所有正确的寄存器? 我已将MSP和PC设置为应用程序/引导程序的开头。

出于这个目的,我不必使用NVIC_Systemreset。

希望有人可以帮助我解决这个问题吗?

2 个答案:

答案 0 :(得分:3)

有一个ST application note关于引导程序。

  

除上述模式外,用户还可以执行引导加载程序   通过执行从用户代码到系统内存的跳转。跳之前   引导加载程序的用户必须:

     
      
  • 禁用所有外设时钟
  •   
  • 禁用已使用的PLL
  •   
  • 禁用中断
  •   
  • 清除待处理的中断
  •   

这就是为什么当您激活中断时引导加载程序崩溃的原因。

编辑

要解决@Clifford的想法,STM32系统引导程序会退出,并使用go命令跳转到主定义地址。该地址应该是复位向量而不是main,以便正确初始化堆,堆栈和FW。之后,您可以将system_reset设置为已知的硬件状态,或者必须完全配置在应用程序中使用的外围设备,因为在引导加载程序使用它们后,它们并未设置为重置状态。

  

注意:如果您选择执行Go命令,则外围设备   引导加载程序使用的寄存器未初始化为默认值   在跳转到用户应用程序之前重置值。他们应该是   如果已使用,则在用户应用程序中重新配置。所以,如果IWDG   在应用程序中使用IWDG预分频器值   适应了应用程序的要求(因为   预分频器设置为其最大值)。对于某些产品,并非全部   设置重置值。有关更多信息,请参阅已知的   每个产品的引导程序版本的限制都已详细说明。

答案 1 :(得分:0)

很抱歉,迟到了。

更多调查后,我发现了问题所在。 有关我所做工作的更多说明,您的评论中也提到了一些要点。

  • 禁用所有外围设备
  • Disbaled PLL
  • 禁用所有中断
  • 清除所有待处理的中断

不幸的是,我忘记了提到我们使用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的完美运行。