我希望我的 STM32 闪存中有两个应用程序,一个基本上是启动应用程序,另一个是“主”应用程序。我已经弄清楚如何将它们分别加载到闪存的不同区域,并且在进行内存转储后,一切看起来都在正确的位置。

因此,当我进行重置时,它会加载启动,此时启动所做的所有操作都是跳转到应用程序。调试启动,这一切似乎工作正常。然而,在我跳转到应用程序后,问题就出现了,它只执行一条指令(汇编),然后跳回到启动。它应该无限期地保留在应用程序中。

那么我的问题是,我应该“跳转”到应用程序中的哪里?

似乎有一些潜在的地方,例如中断向量、重置处理程序、应用程序的主要功能。事实上我已经尝试了所有这些都没有成功。

希望这是有道理的,如果没有,我会更新问题。

感谢您的帮助!理查德

更新:

  • 我在调试器中进行了尝试,并手动将程序计数器更改为应用程序的主要部分,这很有效,所以这让我觉得我的跳转有问题,为什么程序计数器不继续运行跳跃后?
  • 实际上,这似乎是 PSR,“T”在跳转时重置,如果我在跳转后再次设置它,它会按照我的意愿继续使用应用程序
  • 好的找到了一个解决方案,似乎你需要在执行分支时将 PC LSB 设置为 1,否则它会进入“ARM”模式(32 位指令而不是“拇指”模式中的 16 位指令。一个很晦涩的小问题,谢谢你让我和你分享!
有帮助吗?

解决方案

确保跳转到 LSB 为 1 的地址。请参阅此网站的解释:http://www.embedded.com/columns/beginerscorner/15200241?_requestid=162471

其他提示

您可能想要搜索 IAP(应用内编程器),它允许您从 stm32 上的 RS232 psort 引导加载代码。我开始使用,因为它提供了源代码,所以根据您的目的修改它非常简单。基本上,重置后,您可以对 IAP 进行编码,以从地址 0x08002000 或地址 0x08003000 进行引导加载。那么您所要做的就是在应用程序代码中设置一个标志,然后说重新启动,然后新的应用程序将运行我希望这会有所帮助。

理查德,

我试图做你成功的同样的事情,但遇到了问题。我使用 IAR IDE 并更新了 *.icf 文件(在“proj”目录中),将我的应用程序放在 0x08002000 处,并在 0x08000000 处加载了一个单独的项目,该项目只是跳转到 0x08002004 处的复位向量处的地址。启动代码启动并且似乎跳转到应用程序启动,但应用程序在 IAR 初始化期间有时失败,最终出现非法指令陷阱。

单步执行应用程序代码后,我发现我忘记将中断向量基地址设置为应用程序的基地址。它仍然指向 0x08000000,因此代码变得疯狂。在启用任何中断之前添加一个调用来设置向量地址解决了我的问题,如果您希望将应用程序转移到闪存中,则需要这样做。

伊拉。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top