把這段代碼加入到你的工程里,可以實現(xiàn)不斷電,不下拉PB22,直接進入ISP模式做USB升級。
void?run_romisp(void) { ????//?這里讀一下CSR,?觸發(fā)異常進入機器模式。 ????//?如果已經(jīng)是機器模式則繼續(xù)運行。 ????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); ????//?設置運行環(huán)境并跳轉(zhuǎn) ????__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); }
另外經(jīng)測試:
Bootloader并沒有檢測復位類型,即非上電復位也可進入ISP。
ISP超時時間是1分鐘,而不是10s。