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