CH579 IAP時中斷向量表如何重定向?使用自己的BOOT+APP方式

在論壇里看到?RB_ROM_CODE_OFS置一使用32K作為BOOT,執(zhí)行時跳轉(zhuǎn)直接卡死

? ? R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;

? ? R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;

? ? R8_RESET_STATUS |= RB_ROM_CODE_OFS;

? ? R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG0;


如下代碼可以跳轉(zhuǎn)到0x8000,但是中斷向量表未重定向

? ? ?pFunction Jump_To_Application;

? ? ?u32 JumpAddress;

? ? ?DisableAllIRQ();

? ? ?JumpAddress = *(u32 *)entry_add;

? ? ?Jump_To_Application = (pFunction)(JumpAddress);

? ? ?Jump_To_Application();


看了藍牙的OTA例程,是拷貝APP?FLASH的第一塊拷到0x00000000地址中,這會對自己的BOOT造成影響?BOOT有以太網(wǎng)進行OTA的程序


有官方人員?RB_ROM_CODE_OFS?這怎么用?能告訴一下?項目著急呀


有人來解答一下?


CH579不支持中斷向量重映射,

可以在程序中直接跳到boot去升級,見EnterCodeUpgrade()函數(shù);

RTX截圖未命名.png


也可以使用軟件的方式中轉(zhuǎn)一下中斷向量跳轉(zhuǎn),具體可參考附件的代碼,

icon_rar.gifIAP.zip


解決了:

BOOT區(qū) ,APP區(qū)


在BOOT區(qū)定義一個標志位在RAM中

__IO uint32_t?CODE_FLAG __attribute__((at(0x20000000)));

CODE_FLAG? = 1;


將所用的APP所用到的中斷函數(shù)定義好,

中斷函數(shù)中判斷標識跳轉(zhuǎn)到APP中斷函數(shù)的地址入口


跳轉(zhuǎn)后到APP區(qū)將,標志位改變

CODE_FLAG? = 2;// *(uint32_t *)(0x20000000);









上面可以直接使用芯片的復位保持寄存器做標志位


跳轉(zhuǎn)到BOOT后,然后通過USB或者串口用貴司的ISP軟件進行新APP的下載嗎?


如果是我們出廠自帶的引導程序boot,是可以通過我們的ISP工具完成下載的。如果是自制的boot,用ISP是下不了的,自制的boot可以自定義接口以及下載協(xié)議。


明白您的意思。

但是芯片內(nèi)置的BOOT是不公開給客戶修改的吧?

沒有搞懂CH579的IAP該怎么實現(xiàn),ST-M3中斷向量可以重新定位,ST-M0可以將中斷向量指向RAM,而貴司的邏輯是???

如果跳轉(zhuǎn)到貴司內(nèi)置的BOOT來實現(xiàn)IAP,那其它人拿到我的hex是不是就可以直接復制產(chǎn)品了?


@沁恒支持

最近看IAP升級的時候也看到了RB_ROM_CODE_OFS這個寄存器,了解到CH579無法實現(xiàn)中斷地址遷移,也無法實現(xiàn)內(nèi)存啟動。所以做IAP的時候我就像Snail一樣嘗試設置R8_RESET_STATUS |= RB_ROM_CODE_OFS(前提我已經(jīng)把用戶程序拷貝到0x8000起始的flash里)以期望程序?qū)崿F(xiàn)正常跳轉(zhuǎn),支持中斷。但是我測試發(fā)現(xiàn)和Snail一樣會卡住,我比較好奇我們有這么個寄存器,初衷是用來做IAP嗎?要如何實現(xiàn)呢?


利用RB_ROM_CODE_OFS 做IAP我在一年多前已經(jīng)實現(xiàn)了,大致思路如下:

RB_ROM_CODE_OFS 跳轉(zhuǎn)到后面32k執(zhí)行是能用的,只不過需要變通一下。 因為給這個寄存器寫入后會直接卡死,但實際上已經(jīng)生效了,而且是復位有效。所以只要我們先開看門狗,讓看門狗復位后就自然從32K之后開始執(zhí)行了。


RB_ROM_CODE_OFS 有個特性,一般的復位并不會使它失效,需要用LowPower_Shutdown()下電,用RTC定時器喚醒后就會重新從0x0開始執(zhí)行,利用這個特性和上面的看門狗復位,可以自由的在自定義的Bootloader和APP之間跳轉(zhuǎn)。



謝謝,有時間我測試下


@vtte ,沁恒支持,我測試了看門狗復位的方案,發(fā)現(xiàn)無法實現(xiàn)跳轉(zhuǎn),以下是代碼,幫忙看一下,利用jumptoapp可以跳轉(zhuǎn),用戶程序燒錄在0x8000處


CH57xNET_SocketClose(SocketId,1);

DelayMs(100);

//NVIC_DisableIRQ(0xFFFFFFFF);//關閉所有中斷

//SET_APPJUMP_FLAG(1);

//Jump_To_APP();

WWDG_ResetCfg( ENABLE );

? ? R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG1;


? ? R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG2;


? ? R8_RESET_STATUS |= RB_ROM_CODE_OFS;


? ? R8_SAFE_ACCESS_SIG = SAFE_ACCESS_SIG0;



有沁恒的支持人員幫忙看一下嗎?


這個帖子來結(jié)一下,按照vtte的思路,確實是沒有問題的,但是有一個細節(jié)的地方需要修改,就是keil工程的flash起始地址。需要改成0x0000開始。這樣就可以正常跳轉(zhuǎn)。但是要注意一個問題,如果這樣實現(xiàn)跳轉(zhuǎn)到話,后期在應用程序里觸發(fā)boot程序就比較困難了,按照規(guī)格書來說需要用GRWSM 復位來做;當然,如果系統(tǒng)可以做掉電復位也是沒有問題的。

捕獲.PNG


image.png
CH579應用程序跳BOOT,可以調(diào)用這個函數(shù),就可以實現(xiàn)


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

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