我正在为 MPC57485G 开发串行引导加载程序。该过程的流程很简单,每次打开控制器
电源后都会进入引导加载程序代码等待 1 秒以通过串行 uart 接收文件。如果收到新文件,则将文件写入应用程序区域,并在完成后跳转到应用程序代码。如果未收到文件,则直接跳转到
现有应用程序代码。我的应用程序很简单,就是 LED 切换。
我按照以下方式划分了闪存,并为引导加载程序制作了 2 个单独的项目,
并附上了相同的应用程序文件。
/*引导程序*/
SRAM_SIZE = 256K;
/* 定义 SRAM 基地址 */
SRAM_BASE_ADDR = 0x40000000;
内存
{
flash_rchw:org = 0x00FA0000,len = 0x4
cpu0_reset_vec:org = 0x00FA0000+0x10,len = 0x4 cpu1_reset_vec:org = 0x00FA0000+0x14,len
= 0x4 cpu2_reset_vec :org = 0x00FA0000+0x04 len
m_text:org = 0x014C0000,len = 256K
m_vectors_ram:org = 0x40000000,len = 0xC00
m_data:org = 0x40000000+0xC00,len = 256K-0xC00
}
/*应用*/
SRAM_SIZE = 256K;
/* 定义 SRAM 基地址 */
SRAM_BASE_ADDR = 0x40000000;
内存
{
flash_rchw:org = 0x00FA4000,len = 0x4
cpu0_reset_vec:org = 0x00FA4000+0x10,len = 0x4 cpu1_reset_vec:org = 0x00FA4000+0x14,len = 0x4 cpu2_reset_vec:org = 0x00FA4000+0x404
len
m_text:org = 0x01000000,len = 4800K
m_vectors_ram:org = 0x40000000,len = 0xC00
m_data:org = 0x40000000+0xC00,len = 256K-0xC00
}
我使用以下 asm 代码跳转到应用程序代码
//跳转到应用程序地址 0x01000000
asm("e_lis %r12,0x0100");
asm("e_or2i %r12,0x0000");
asm("mtlr %r12");
asm("se_blrl");
我正在使用 S32 IDE 和 MPC57485G Devkit 板进行开发,并使用开放式 SDA 进行调试。
我通过在应用程序代码中提供引导加载程序 elf 对象文件引用,将应用程序和引导加载程序一起加载。
我面临一个问题,每当我执行从引导加载程序跳转到应用程序时,它需要一些时间来配置
应用程序中的核心时钟,并且每当我尝试配置任何其他模块(如 uart)时,它都会出现硬故障(IVOR6_handler)并且只保留在那里参考下图的详细信息和突出显示的代码从那里转到 IVOR6_handler。每当我初始化任何其他模块时也是如此。
但是,如果我从应用程序中删除所有模块并只保留时钟和引脚初始化,虽然在这里配置时钟也需要一些时间,
但应用程序按预期工作
我还有以下疑问
1.是否有任何限制,核心时钟速度必须我在引导加载程序和应用程序代码中相同,因为
我需要在应用程序中以不同的方式完全重新初始化完整的控制器。
2.在跳转到应用程序之前是否需要完成任何强制性的内务处理工作(如休息一些重要的寄存器、模块等)。如果
有任何内容,请告诉我相同的任何参考。
3.如果是的话,是否也必须为这种用例划分 ram,而不是任何参考,这样做真的很有帮助
4.flash的划分方法是否正确
0