我正在尝试利用
STM32F031K6 中的内置 UART 引导加载程序来执行固件更新。我已经阅读了 AN3155 和 AN2606 文档,但不幸的是,到目前为止,我在尝试通过引导加载程序将固件写入目标 MCU 的内部闪存时运气不佳。
到目前为止我所做的工作:
- 我可以通过 UART 接口与引导加载程序成功通信
- GET命令响应表示bootloader协议版本为3.1,支持以下命令:
- 0x01(获取版本和读取保护状态)
- 0x02(获取 ID)
- 0x31(写内存)
- 0x73(写取消保护)
- 0x92(读出解除保护)
- GET ID 命令响应指示 PID 为 0x401
以下对我不起作用:
- 我发送“写入内存”命令和校验和,例如 0x31、0xCE
- 我收到 ACK,例如 0x79
- 我发送 4 字节起始地址和校验和,例如 0x08、0x00、0x00、0x00、0x08
- 我希望收到 ACK 或 NACK 但引导加载程序没有响应
一些观察:
- 紧接着上面的一组步骤,我发送了“获取 ID”命令 + 校验和。它失败了,我收到两个 NACK(即 0x1F)
- 在 AN3155 文档中,它提到了以下内容:
“当使用不受支持的内存地址和正确的地址校验和(即地址 0x6000 0000)发出读取内存命令或写入内存命令时,引导加载程序设备会中止该命令,但不会将 NACK (0x1F) 发送到主机.因此,接下来的两个字节(即要读取/写入的字节数及其校验和)被视为新命令及其校验和“
我的问题:
- 我正在使用的起始地址和校验和是否无效(但对我来说看起来没问题)?
- 支持的命令列表看起来很奇怪,为什么缺少 GET 命令(即 0x00)?
- 设备PID也很奇怪,我在AN2606文档中找不到。事实上,根据章节“64 Device-dependent bootloader parameters”,第 326 页,STM32F03xx4/6 的 PID 应该是 0x444
也许我遗漏了一些明显的东西?我们将不胜感激地收到所有帮助和建议。