陆续给手里若干型号的stm32写过bootloader. 每次换新型号都得重新折腾一遍, 太麻烦了. 某次水木网友spadger提到他做的一个bootloader, 支持N多型号, 只要改下配置文件就能适应不同型号;此外还提供了简单的命令解释器, 可以在串口命令行实现查看/擦除任意位置flash, 模拟eeprom读写(与app共享)等功能. 是不是挺实用? 于是打算自己也实现一个.
先给出github地址:https://github.com/tomzbj/zbootgithub.com
目前已经支持的mcu有: stm32f072cb, stm32f303cc, gd32f350cb, stm32f030c8, stm32f103rc. 前面三者均实测可用. 在flash每页1k的mcu上共占用8k flash, 其中eeprom占1页, 提供256字节eeprom空间; 在flash每页2k的mcu上共占用10k flash, 提供512字节eeprom空间.
串口波特率定为500kbps, 因为为了时钟配置简单起见, bootloader在8M HSI时钟运行.
使用时只需要选择对应型号的Makefile, 并在usart.c里修改用到的usart外设和管脚即可.
上位机见根目录的iap.py, 用python3执行, 需要zlib和bincopy两个第三方库.
app这边需要做的:写入bootloader后在串口命令行执行## sysinfo, 取得app区的入口地址, 应该是0x08002000或0x08002800.
修改链接文件(.ld或.lds, 在不同开发环境下可能不同), 把flash区的起始地址改为上面的入口地址, length要根据页大小减去8k或10k.
Makefile或者其他类似指定了flash大小的场合,要减去8k或10k.
main.c在最前面加上两行, 其中VECT_TAB_OFFSET的值是0x2000或0x2800.
NV