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



我有一个引导加载程序和一个固件,其中从引导加载程序到固件的初始跳转就像一个魅力,但是当我有场景从应用程序跳回时,做一些东西并跳回到我的应用程序。在那里,我遇到了一些奇怪的问题,最终以硬故障告终。如果我通过 IAR 的 __enable_interrupts(( 激活中断,就会出现此问题。

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

我有必要不为此目的使用NVIC_Systemreset。

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

有一个关于引导加载程序的ST应用笔记。

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

  • 禁用所有外设时钟
  • 禁用使用的锁相环
  • 禁用中断
  • 清除挂起的中断

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

编辑

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

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

很抱歉回复晚了。

经过更多的调查,我发现了问题所在。 为了进一步澄清我所做的事情,这里有一些要点,你的评论中也提到了这些要点。

  • 已禁用所有外围设备
  • 分布式锁相环
  • 已禁用所有中断
  • 清除所有挂起的中断

不幸的是,我忘了提到我们使用embOS。 这就是问题所在。有核心寄存器 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0552a/CHDBIBGJ.html

在控制寄存器中设置了一个位:SPSEL 如果此位设置为"1",则 embOS 在正常操作时遇到问题。 解决方案很简单:

__set_CONTROL(0x0(;

当这被称为从embOS跳到引导加载程序并返回embOS时,可以完美地工作。

相关内容

最新更新