首页 > 解决方案 > Arm Cortex Bootloader 调试技巧

问题描述

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

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

传入的二进制文件正在保存到 address #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)]

这会损坏二进制文件吗?

感谢任何调试提示/建议/见解。

标签: pythoncuartbootloader

解决方案


推荐阅读