我正在为 stm32f4 目标处理两个不同的 Platformio 项目:引导加载程序和应用程序。最终,引导加载程序应该能够通过网络更新应用程序代码,但现在我想构建构建系统,以便我可以方便地使用编程器刷新芯片进行开发。 通过创建单独的 .elf 映像并刷新应用程序映像,然后使用 OpenOCD 手动刷新引导加载程序映像,我能够正确执行这两个部分。但是,只有当我先刷新应用程序,然后使用 OpenOCD 的
flash erase_sector
和 flash write_image
命令手动擦除并写入引导加载程序扇区时,它才会运行。
我的目标是拥有一个灵活的设置,使我能够方便地刷新 MCU,并在将来网络更新发挥作用时生成单独的二进制文件。
我对如何进行有一些想法,但我不确定最好的前进方法是什么:
a) 继续构建单独的图像并研究
objcopy/objdump
来切片和合并 .elf 文件,以便能够创建一个易于上传到目标 MCU 的组合图像,或者
b) 使用 PlatformIO 脚本,以便我链接两个项目的
.pio/build
目录中的目标文件的组合图像。
我还想知道我是否可以在 PlatformIO 框架内工作,而不是围绕两个完全独立的项目编写脚本。
欢迎任何意见。
我找到了一种与 PlatformIO 配合使用且方便的方法:
arm-none-eabi-objcopy -O binary
将 PlatformIO 创建的 .elf 文件转换为 .bin 文件(我已将其作为 PlatformIO 的 post 操作 包含在内)。openocd
的脚本进行 Flash。这里重要的部分是以二进制形式而不是 .elf 形式上传图像。这需要提供闪存中的地址:openocd <target-specifics copied from Platformio> --command 'program { <path/to/bootloader.bin> 0x08000000 verify' --command 'program {path/to/app.bin} 0x08020000 verify' --command reset --command shutdown
这会保留调试符号并与 VSCode 中的调试器一起使用。