擦除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拉低的方式进入;


浙公网安备 33010602011771号