写一个STM32 BootLoader-4

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. 参考资料

  1. 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值