CH582運行時進入ISP的方法

把這段代碼加入到你的工程里,可以實現(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)測試:

  1. Bootloader并沒有檢測復位類型,即非上電復位也可進入ISP。

  2. ISP超時時間是1分鐘,而不是10s。

運行時跳入boot,可以通過將FLASH前4字節(jié)擦除,則認為芯片無APP代碼,并在boot中等待10s,可以使用軟復位。

超時時間為1min,是使用了有數(shù)據(jù)線的供電如typec給開發(fā)板供電,因此boot等待了1min。如果僅供電無數(shù)據(jù)線傳輸則等待時間為10s。

用戶程序跳轉(zhuǎn)進入boot參考:

CH573 CH582 用戶程序跳轉(zhuǎn)進BOOT - debugdabiaoge - 博客園 (cnblogs.com)


弄這個主要是考慮到,內(nèi)置電池供電的產(chǎn)品,用戶無法實現(xiàn)斷電再上電的操作。如果擦除了flash又沒有及時升級,產(chǎn)品就廢了。我這個方式是安全的。

之前有搜索到這個帖子: http://www.findthetime.net/bbs/thread-91177-1.html


直接調(diào)用軟復位,就可以進入到原廠的boot。務必注意FLASH擦除的返回值判斷是否生效。

針對產(chǎn)品開發(fā)功能,建議是寫一個iap升級程序,然后根據(jù)功能進行調(diào)整。原廠的boot會有超時時間,超時時間到則會退出boot,需要重新上電才會進入。因此如果需要一直在boot中可以自己寫一個iap升級,參考例程iap,這也是我們所推薦的方式。


很好的經(jīng)驗


只有登錄才能回復,可以選擇微信賬號登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频