擦除0地址codeflash营造空片现象_自动进入BootLoader程序

芯片在空片时,首次插入USB供电会直接在ISP工具中搜索到USB设备,可以进行首次烧录;原因是在0地址没有用户程序,所以会在停留在boot区域;

利用该特性,可以在固件中加入一些处理,比如USB OUT端点透传数据给芯片,解析成功后,使用FLASH_ROM_ERASE接口擦除0地址数据,此后给芯片完成下电后再上电,即可在ISP工具中找到该USB_BOOT设备;

CH582/CH592/CH585:

__HIGH_CODE
void APPJumpBoot(void)   //此段代码必须运行在RAM中
{
  while(FLASH_ROM_ERASE(0,4096))//块擦除
  {
    ;//ROM 擦4K1个单位,擦0地址起始
  }
  FLASH_ROM_SW_RESET();
  R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  SAFEOPERATE;
  R16_INT32K_TUNE = 0xFFFF;
  R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET;
  R8_SAFE_ACCESS_SIG = 0;//进入后执行复位,复位类型为上电复位
  while(1);//营造空片的现象,启动时就会停在BOOT,等烧写,超时时间10s
}

 CH572:

__HIGH_CODE
void APPJumpBoot(void)   //此段代码必须运行在RAM中
{
  while(FLASH_ROM_ERASE(0,4096))
  {
    ;//ROM 擦4K1个单位,擦0地址起始
  }
  FLASH_ROM_SW_RESET();
  R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;
  R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;
  SAFEOPERATE;
  R16_INT_LSI_TUNE = 0xFFFF;
  R8_RST_WDOG_CTRL |= RB_SOFTWARE_RESET;
  R8_SAFE_ACCESS_SIG = 0;//进入后执行复位,复位类型为上电复位
  while(1);//营造空片的现象,启动时就会停在BOOT,等烧写,超时时间10s
}

 

该处理利好于硬件空间紧张,boot引脚忘记引出或者拆壳困难的情景;

 

运行到APPJumpBoot后会,ISP会识别到boot设备,此后完成固件的重新烧录,不需要再通过PB22拉低的方式进入;

 

posted @ 2025-03-01 14:36  oTvTo  阅读(138)  评论(0)    收藏  举报