NXP MCU 技术论坛
直播中

打马过草原

9年用户 884经验值
擅长:可编程逻辑 电源/新能源
私信 关注
[问答]

S32K148引导加载程序未跳转到应用程序是怎么回事?

我已经从 nxp 的网站下载了标准的引导加载程序代码。构建代码并加载到 Eval 板中。
它似乎没有跳到应用程序。无法追踪确切的问题。
我使用了以下引导加载程序代码。
代码:
#include "timeout.h"
#include "comm.h"
#include "clock.h"
/* 引导加载程序定义 */
/* 引导加载程序接收的应用程序的起始地址
* 应用程序向量表应从该地址开始
* */
#define APP_START_ADDRESS 0x1000
/* 全局变量 */
uint8_t boot_from_comm = 0; /* 用于在 comm 通道上发出活动信号 */
/* 原型 */
void JumpToUserApplication( unsigned int userSP, unsigned int userStartup);
/* 主应用程序 */
int main(void)
{
/* 初始化时钟 */
clock_initi();
/* 初始化通信接口 */
init_comm();
/* 初始化超时 */
init_timeout();
/* 检查是否接收到引导启动或是否发生超时 */
do{
uint8_t word_received = comm_status_rx();
如果(word_received){
boot_from_comm = 1;
comm_download_app();
}
} while((!timeout()) & (!boot_from_comm));
/* 禁用所有系统并让设备保持复位状态 */
disable_timeout();
禁用通信();
重置时钟();
/* 检查是否加载了有效的应用程序并跳转到它 */
JumpToUserApplication(*((uint32_t*)APP_START_ADDRESS), *((uint32_t*)(APP_START_ADDRESS + 4)));
/* 永远不应该从应用程序代码中返回 */
for (;;) {};
/* 永远不要离开 main */
return 0;
}
/**
* 用于跳转到用户应用程序的入口点
* 用户应用程序的向量表必须位于 0x1000
*
* */
void JumpToUserApplication( unsigned int userSP, unsigned int userStartup)
{
/* 检查入口地址被擦除,如果被擦除则返回 */
if(userSP == 0xFFFFFFFF){
return;
}
/* 设置堆栈指针 */
__asm("msr msp, r0");
__asm("msr psp, r0");
/* 重定位向量表 */
S32_SCB->VTOR = (uint32_t)APP_START_ADDRESS;
/* 跳转到应用程序 PC (r1) */
__asm("mov pc, r1");
}
////////////////////////////////////////////// /////////////////////////////
// EOF
//////////////// //////////////////////////////////////////////// //////////////





































回帖(1)

张秀兰

2024-6-3 17:24:56
可能有几个原因导致引导加载程序未能跳转到应用程序:

1. 应用程序的起始地址不正确。请确保应用程序的向量表从正确的地址开始。

2. 应用程序未正确加载到正确的地址。请确保应用程序已正确构建,并已正确地加载到目标设备的内存中。

3. 引导加载程序中的代码存在错误。请确保引导加载程序中的代码没有语法错误或逻辑错误,并已正确构建。

4. 目标设备的硬件或软件出现问题。请确保目标设备的硬件和软件环境正常,没有出现任何异常问题。

为了更好地调试这些问题,您可以尝试使用调试器来检查代码的执行情况,以及查看目标设备的状态和数据。您也可以添加一些调试代码,例如打印调试消息或将变量的状态写入串口或调试接口。这些调试技巧可以帮助您快速排除问题并找出引导加载程序未跳转到应用程序的原因。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分