本帖最后由 wubangmi 于 2026-5-11 14:35 编辑
1. 加锁方法
1) .在地址 5*512+0x100000+0x1FC 和 5*512+0x100000+0x1F6 处写非 FF 值进行加密。
2) .解密需要通过串口发送解密命令。
2. Sample
#define LOCK_SWD_VAL ( 0xEC )
#define LOCK_SWD_ADDR ( REMAP_OFFSET + SECURE_BASE + 0x1FC ) //1byte
#define LOCK_PAGE5WRITE_ADDR ( REMAP_OFFSET + SECURE_BASE + 0x1F6 ) //1byte
void SetSecurity(stc_cmd_param_t *pstcCmdParam)
{
uint8_t u8CmpVal = 0;
uint8_t u8WriteData = LOCK_SWD_VAL;
Flash_WriteData8Bit(LOCK_SWD_ADDR, &u8WriteData, 1);
u8CmpVal = *((volatile uint8_t *)LOCK_SWD_ADDR);
if(0xFF != u8CmpVal) {
FLASH_OP_RESULT = EXE_PASS;
} else {
FLASH_OP_RESULT = EXE_FAIL;
return;
}
Flash_WriteData8Bit(LOCK_PAGE5WRITE_ADDR, &u8WriteData, 1);
u8CmpVal = *((volatile uint8_t *)LOCK_PAGE5WRITE_ADDR);
if(0xFF != u8CmpVal) {
FLASH_OP_RESULT = EXE_PASS;
} else {
FLASH_OP_RESULT = EXE_FAIL;
}
}
uint32_t Flash_WriteData8Bit(uint32_t u32WriteAddr,uint8_t *pu8WriteData,uint32_t u32Size)
{
uint32_t i;
M0P_FLASH->BYPASS = 0x5A5A;
M0P_FLASH->BYPASS = 0xA5A5;
M0P_FLASH->CR_f.OP = 0x1; //write
if(0 == (u32Size%4)) {
uint32_t *pu32WriteAddr = (uint32_t *)u32WriteAddr;
uint32_t *pu32WriteData = (uint32_t *)pu8WriteData;
while(u32Size) {
//Busy?
while (1 == M0P_FLASH->CR_f.BUSY);
//write data
*(pu32WriteAddr++) = *(pu32WriteData++);
u32Size-=4;
}
} else {
uint8_t *pu8WriteAddr = (uint8_t *)u32WriteAddr;;
for (i = 0; i < u32Size; i++) {
while (1 == M0P_FLASH->CR_f.BUSY);
*(pu8WriteAddr++) = *(pu8WriteData++);
}
}
while (1 == M0P_FLASH->CR_f.BUSY);
return EXE_PASS;
}
3. 注意事项
该系列加密后芯片会被锁死。只能通过Boot模式解锁。
|
|