[低功耗MCU] HC32L110&HC32F003&HC32F005 HC32L130&HC32L136&HC32F030 系列 Flash 加锁方法

[复制链接]
110|0
wubangmi 发表于 2026-5-11 14:34 | 显示全部楼层 |阅读模式
本帖最后由 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模式解锁


您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

659

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部
0