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才能正常初始化。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值