feat(boot): 升级改造为A/B分区(新固件先下B区整包校验后搬运A区)

分区: Boot 32KB | A区0x8000(29扇区232KB,运行) | B区0x42000(29扇区232KB,暂存) | 参数区0x7C000不变
流程: 仅擦B区下载→CRC32(B)通过→逐扇区搬运B→A→CRC32(A)通过→擦B区→置APP_BOOT_UPGRADE_FLAG复位
防变砖: 下载超时/CRC失败/AppSize非法均恢复APP_START_FLAG复位回老App; 断电续传靠重启后B区CRC判定
其他: GetCrc32/AppWriteFlash/EraseFlash基址参数化, FlashWrite尾字节0xFF补齐, 0x82增加状态守卫
协议与boot_para_t结构不变, 主机升级工具无需修改
This commit is contained in:
2026-09-23 11:16:47 +08:00
parent ffaf7a55a6
commit 48ed25015d
4 changed files with 140 additions and 38 deletions
+6 -6
View File
@@ -402,7 +402,7 @@ void BSP_Init(void)
/*****************************************************************************************
* Flash操作
****************************************************************************************/
void FlashWrite(uint32_t Addr, uint32_t *wData, uint8_t wLen)
void FlashWrite(uint32_t Addr, uint32_t *wData, int wLen)
{
EFM_Unlock();
EFM_FlashCmd(Enable);
@@ -415,7 +415,7 @@ void FlashWrite(uint32_t Addr, uint32_t *wData, uint8_t wLen)
EFM_Lock();
}
static void FlashRead(uint32_t u32Addr, uint32_t *rData, uint8_t rLen)
static void FlashRead(uint32_t u32Addr, uint32_t *rData, int rLen)
{
for(int i = 0; i < rLen / 4; i++) {
rData[i] = *((volatile uint32_t*)(u32Addr + i * 4));
@@ -449,15 +449,15 @@ void WriteBootPara(BootPara wData)
EFM_Lock();
}
void EraseFlash(void)
void EraseFlash(uint32_t BaseAddr, uint32_t SectorCnt)
{
EFM_Unlock();
EFM_FlashCmd(Enable);
while(Set != EFM_GetFlagStatus(EFM_FLAG_RDY)) { ; }
/* 只擦APP区, 不擦参数区(BOOT_PARA_ADDRESS) */
for(int Addr = APP_ADDRESS; Addr < BOOT_PARA_ADDRESS; Addr += FLASH_SECTOR_SIZE) {
EFM_SectorErase(Addr);
/*从BaseAddr起连续擦除SectorCnt个扇区(A/B区通用), 不碰参数区*/
for(uint32_t i = 0; i < SectorCnt; i++) {
EFM_SectorErase(BaseAddr + i * FLASH_SECTOR_SIZE);
FeedDog();
}
EFM_Lock();