把这段代码加入到你的工程里,可以实现不断电,不下拉PB22,直接进入ISP模式做USB升级。
void run_romisp(void) { // 这里读一下CSR, 触发异常进入机器模式。 // 如果已经是机器模式则继续运行。 PRINT("mstatus=%08x\n", read_csr(mstatus)); PFIC->IRER[0] = 0xffffffff; PFIC->IRER[1] = 0xffffffff; // 复制固件代码到ram memcpy((void*)0x20003800, (void*)0x000780a4, 0x2500); // 0x200038be是检测PB22的。这里让它强制返回1,跳过检测。 *(uint16_t*)0x200038be = 0x4505; // li a0, 1 // 清BSS memset((void*)0x20005c18, 0, 0x04a8); // 设置运行环境并跳转 __asm__("la gp, 0x20006410\n"); __asm__("la sp, 0x20008000\n"); write_csr(mstatus, 0x88); write_csr(mtvec, 0x20003801); write_csr(mepc, 0x20004ebc); __asm__("mret"); __asm__("nop"); __asm__("nop"); } void HardFault_Handler(void) { run_romisp(); while(1); }
另外经测试:
Bootloader并没有检测复位类型,即非上电复位也可进入ISP。
ISP超时时间是1分钟,而不是10s。