Arm Cortex引导加载程序调试提示

2024-10-01 05:02:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为定制板上的Cortex-M4 MCU(ATSAME51N20A)编写一个串行引导程序。我目前正在通过SWD使用Jlink进行闪烁/调试

当前架构:我有一个python脚本,它读取二进制文件,将其分解为512字节的块,通过UART发送到MCU,最后对整个过程执行CRC32,并检查以确保接收端的CRC匹配。这一切工作正常,发送数据,两端的CRC匹配

传入的二进制文件正在保存到地址#define APPLICATION_START_ADDRESS 0x8000。引导加载程序收到最后一个块后,将调用以下代码:

void jumpToApplication(void)
{
    uint32_t applicationMainStackPointer = *(volatile uint32_t *) (APPLICATION_START_ADDRESS);
    __set_MSP(applicationMainStackPointer);

    void (*applicationResetHandler)(void);
    uint32_t applicationResetHandlerAddress = *(volatile uint32_t *) (APPLICATION_START_ADDRESS + 4);
    applicationResetHandler = (void *) applicationResetHandlerAddress;
    applicationResetHandler();
}

问题:应用程序在引导加载程序之后没有运行。我应该看到一些Hello, World!的弹出窗口,但什么都没有发生

我认为在连接了JLink的情况下跳转到应用程序可能会导致问题,所以我尝试在没有连接JLink的情况下运行所有程序,但仍然无法运行

我的问题:

  1. 这里可能出了什么问题?要继续调试此问题,我可以研究什么

  2. 我已经测试了通过JLink闪烁发送的二进制文件,但是我实际闪烁的文件是一个.elf文件。据我所知,.bin文件应该也能正常工作,但也许这就是我出错的地方

  3. 在Python中,我对二进制文件进行如下格式化:

   data = [x for x in open(path, 'rb').read()]
   blocks = [data[i:i + PAGE_SIZE] for i in range(0, len(data), PAGE_SIZE)]

这会破坏二进制文件吗

任何调试提示/建议/见解都将不胜感激


Tags: 文件程序dataapplicationaddress二进制startcrc