
这几天在研究stm32F0的串口更新程序,原来都是用bootloader的,由于M0的内核不支持中断向量跳转,更新程序不能用bootloader, 所以直接采用了Flash更新的流程& e) ~' t% I1 L$ ]7 ?1 \ 1. 把更新程序拷贝到Flash的固定地址,最后一页. 2. 待更新的时候直接跳转到固定地址开始擦除前面的程序并接收串口程序进行更新. 需要注意以下几点:) y3 e1 h: d, ~$ m; A 1.函数的地址直接取值的时候是奇数地址,需要手动减一,跳转的时候需要加一.) _0 l7 ~0 B' `1 q; `4 F% L 2.跳转函数前要关中断.! O' H; _+ ~. M$ {; M# z# g 3.在更新函数中不要调用其他函数. 更新协议如下:6 t9 c1 d8 U8 f" E7 Z2 `6 Y 1. 启动更新 : 上位机向设备发送 0xAA 0xBB 0xCC 0xDD 0xEE 0xFF+ n& C/ \8 {, s 2. 设备回应 : 设备收到发送0xAA, 改变到快速波特率,关中断,进入Flash中的更新程序,擦除原程序Flash后,发送0xBB 3. 开始更新 : 设备收到0xAA后改变到快速波特率 4. 发送数据 : 设备收到0xBB后发送128个字节(长度可设定). 5. 写Flash : 设备收到128个字节后发送0xBB.) ?- h" u# V. M+ t- I 6. 更新结束 : 循环4,5两步直到程序发送完成(最后一包不足128个字节时也发送128个字节,后面用0xFF填充).2 R: D6 d9 W! P" w6 \: W( a0 _ 0 m: {7 A3 `* `, d 附件是更新的例程和对应的上位机软件, 在上位机选定编译出的新的bin文件即可更新. |