我正在使用 S32K118 处理器创建我的第一个引导加载程序,但我似乎无法正确跳转到我的应用程序。
我想要做的是首先使用调试配置在 MCU 上刷新我的应用程序。之后,我在不擦除应用程序的情况下刷新引导加载程序。当运行我的引导加载程序时没有问题,但是当它试图跳转到应用程序时,我在 IDE 中打开一个新选项卡并在地址 0x346c 的断点处停止调试器。
如果我正在查看我的应用程序的 .map 文件,哪个是我的重置处理程序?(见地图文件)但我不执行任何代码。当它在没有调试器的情况下运行时,它似乎在没有执行应用程序的情况下挂在同一点。
我的问题:
- 我是否遗漏了什么,我的 main.c 代码是否正确?(参见 main.c)
- 设置、链接器文件是否正确以跳转到应用程序或我是否需要不同的地址?(请参阅链接器文件)
- 如何正确跳转到应用程序?
- 需要采取什么步骤?(也许我忘记了什么。)
提前感谢您的帮助!
我在用什么:
- S32K 设计工作室
- S32K118 SDK RTM 4.0.1 带有两个独立的 hello world 示例项目,用于闪烁的 LED。
- 带有 S32K118 MCU 的服装 PCB
- Multilink 通用调试器/编程器,带有与 MCU 的 SWD 连接。
主程序:
#define APP_RESET_ADDRESS 0x00003410
Boot_JumpToApp(APP_RESET_ADDRESS);
void Boot_JumpToApp(const uint32_t i_AppAddr)
{
if((*((uint32_t*)i_AppAddr)) != 0xFFFFFFFF)
{
/* 重定位向量表 */
S32_SCB->VTOR = (uint32_t)0x00003000;
JumpToUserApplication(*((uint32_t*)i_AppAddr), *((uint32_t*)(i_AppAddr + 4)));
}
}
void JumpToUserApplication( unsigned int userSP, unsigned int userStartup)
{
/* 设置堆栈指针 */
DISABLE_INTERRUPTS();
__asm("msr msp, r0");
__asm("msr psp, r0");
ENABLE_INTERRUPTS();
/* 跳转到应用程序 PC (r1) */
AppAddr resetHandle = (AppAddr)(userStartup);
(重置句柄)();
//__asm("mov pc, r1");
}