1. 概述
本文主要介绍BOOTLOADER的通讯协议及整体软件流程。
2. 启动过程
启动过程主要参考官方自带的串口IAP程序。用户程序起始地址存储的是栈顶指针,如果烧写了用户程序的话,则应用程序起始地址处必然是写入了栈顶指针,所以可通过查看值否位于SRAM地址范围来判断是否已经烧写了用户程序。STM32F1VET6的SRAM开始的地址为0x20000000,长度为0x10000个字节,所以可以通过检测栈顶指针是否落在膛0x20000000 ~ 0x2000ffff这个区域里面来判断是否烧写了应用程序。代码如下
BKPSRAM_RdHalfWord(BKPSRAM_ADDR, &bl_dat); // 读入备份寄存器数据
if (RUN_IN_BL != bl_dat) { // 判断运行在BOOTLOADER 或者 应用程序里面;
if (((*(__IO uint32_t*)APP_FLASH_START_ADDR) & 0x2FFE0000) == 0x20000000) { // 判断是否烧写应用程序
JumpAddress = *(__IO uint32_t*) (APP_FLASH_START_ADDR + 4);
Jump_To_Application = (pFunction)JumpAddress;
__set_MSP(*(__IO uint32_t*) APP_FLASH_START_ADDR);
Jump_To_Application(); // 跳转到应用程序;
}
}
3. 软件协议及流程
3.1 进入退出BOOTLOADER
协议和流程如下:

怎么从外部去判断程序是运行在BOOTLOADER中还是在应用程序中呢,笔者使用两个LED进行显示,在BOOTLOADER中的时候,其中一个LED进行闪烁;而在应用程序中,前一个LED灭,另一个LED进行闪烁。STM32对于进入和退出BOOTLOADER的指令不进行应答。
3.2 FLASH烧写
协议和流程如下:

上位机接收到STM32应答数据之后,通过应答数据的状态,判断下一步的操作,是否继续操作还是中断报错。
4. 参考资料
- AN040-IAP程序跳转说明
5. 结语
5.1 该项目的优缺点
该项目的优点在于通用性很强,只需要改变数据接收的接口,就可以实现诸如CAN BOOTLOADER或者ETH BOOTLOADER ,只需要将接收的数据转存到协议解析的缓存中就可以了。
另一个优点在于扩展性比较好,可以在这个协议上进行相应的扩展,例如把部分用户需要保存的数据保存到芯片的内部FLASH中,减少外部FLASH的接入。
如果在系统中有多片STM32,可以利用协议中的ID对不同的芯片进行区分,再通过485的接口对实现一对多的程序刷新。(这部分还没有调试,目前只是一个设想,但我觉得应该是可以实现的)
这个项目主要的一个缺点是FLASH烧写时没有数据重发的机制,但是在实现使用的过程,这个好像也没有太大的影响。
5.2 项目涉及的代码
本项目所有的源代码(包括上位机和STM32的程序),可以参考
https://download.csdn.net/download/Cesaroy/90029227
450

被折叠的 条评论
为什么被折叠?



