之前的文章有说过Bootloader程序,现在补充之前没提到的一些细节:
之前文章讲到过flash分区,boot和app的工程文件的不同处理,这里会全部重新描述一遍
STM32F407VET6学习笔记7:Bootloader跳转APP程序_stm32 app跳转到bootloader-CSDN博客
目录[Flash 分区的管理:](#Flash 分区的管理:)
Flash 分区的管理:
首先查阅芯片手册,了解一下芯片的内存分区:
其中的扇区7~11 都是128k
512k的芯片 只有扇区0~7,1024的芯片就有扇区11了
这里扇区0适合放bootloader程序
扇区1~2适合放一些 掉电存储的标志位,
但有些频繁需要读写的数据,基于寿命因素 还是考虑使用eeprom为好
扇区4往后就可以考虑放app应用程序了,因为基本都足够大
分区安排:
为了
Bootloader工程的一些必要设定:
boot地址:
在魔棒这设定好boot的下载地址:
然后注意下载不能全擦:
boot跳转:
跳转代码:
cpp__asm void MSR_MSP (uint32_t ulAddr) { MSR MSP, r0 //set Main Stack value BX r14 } void app_jump() { uint32_t JumpAddress; __disable_irq();// 禁用所有中断 JumpAddress = *(__IO uint32_t*)(ApplicationAddress + 4); /* Jump to user application */ Jump_To_Application = (pFunction) JumpAddress; MSR_MSP(*(__IO uint32_t*) ApplicationAddress); Jump_To_Application(); }读取标志和跳转:
cpp#define FMC_UPDATE_INFO_ADDR 0x08004000 //标志 unsigned int update_flag = 0; //升级标志位 //读取标志 update_flag = *(__IO uint32_t*)FMC_UPDATE_INFO_ADDR; //update_flag = 0x06; if(update_flag == 0x06) { } else if(update_flag == 0x08)//跳转app { HAL_Delay(2000); app_jump(); }
写标志的注意项:
先擦flash再写:
因为标志位写在flash,所以需要先擦再写,不然写不进去:
cpp#define FMC_UPDATE_INFO_ADDR 0x08004000 //升级标志位 HAL_FLASH_Unlock(); // 写入更新标志到Flash __HAL_FLASH_CLEAR_FLAG((FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR)); FLASH_EraseInitTypeDef FLASH_EraseInitType; FLASH_EraseInitType.TypeErase = FLASH_TYPEERASE_SECTORS; FLASH_EraseInitType.Sector = FLASH_SECTOR_1; FLASH_EraseInitType.NbSectors = 1; FLASH_EraseInitType.VoltageRange = FLASH_VOLTAGE_RANGE_3; if (HAL_FLASHEx_Erase(&FLASH_EraseInitType, &SectorError) != HAL_OK) { } HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FMC_UPDATE_INFO_ADDR, 0x06); HAL_FLASH_Lock();
APP工程的一些设定:
APP地址:
1
APP固化bin文件:
fromelf --bin --output="$L@L.bin" "#L"







