STM32 BOOTLOADER 全流程详解

 思路:加入代码,实现SPI,Flash,串口驱动,复位防止寄存器异常,APP启动地址,大小,配置keil内存令启动地址正常,中断向量,生成bin文件

bLoadHasNop参数 初始化时=True,那么每次进入都可以等待3秒来串口更新,如果为false就直接进入文件校验,而不会等待更新。

1.bootloader文件移植:首先创建一个cube项目,然后将bootloader文件移植到项目里,然后添加到工程,需要这些文件:

创建项目目录flash,platform,utility,然后添加文件进去。

2.实现底层通讯接口,SPI,串口

task.c中修改串口号

platform_seeprom.c中修改spi接口

3.通过bootloader文件大小计算APP地址:修改bootloader的地址和APP的启动地址,比如bootloader文件大小是0x5000,那么其中bootloader文件大小+0x1000的app配置信息就等于0x8006000的APP启动地址,然后修改APP的文件大小,以及spi flash中的保存地址

4.实现内部flash读写函数 

实现 BSP_FlashErase,BSP_FlashWrite,BSP_FlashRead,要注意的是,不同的芯片类型可能只支持扇区写入或页写入,因此需要修改HAL_FLASH_Program函数传入参数结构体,根据芯片类型决定扇区还是页写入,以及写入的字节是双字节还是单字节,写入字节长度不同就需要修改字节长度。

for(i=0; (i<length)&&(result==FLASHIF_OK); i+=8)
	{
		uint64_t data=0;
		data=*(uint64_t*)(p_source+i);
		if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, destination,data) == HAL_OK)
		{
			if (*(uint64_t*)destination != data)
				
				result = FLASHIF_WRITING_ERROR;

			destination += 8;
			
		}

5.keil配置APP地址和大小,根据loader文件大小和配置计算APP起始地址,然后用flash大小-起始得到size

6.创建项目镜像,添加宏定义修改中断向量表

7.在bootloader项目中,添加宏定义 以及创建热变量,用来实现bootloader重启后判断变量直接进入APP

重启是为了清除bootloader初始化的一些寄存器,否则直接进入APP将会产生错误

8.在main函数中添加判断热变量,进入APP的代码,进入当bootloader重启系统复位时,通过判断热变量进入APP,APP才能正常初始化。

作者:falali162

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 BOOTLOADER 全流程详解

发表回复