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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user