代碼在非零等待區(qū)運行,一寫flash就死機請問怎么解決?

我的芯片是ch32v208,根據(jù)我的需求,對設(shè)備進行了分區(qū),分別是164K,156K,156K,后分別是bootloader,app1與app2。

bootloader能正常通過藍牙對app1與app2進行更新,但是我的業(yè)務還有可能app1與app2相互更新(app1通過網(wǎng)線對app2進行更新,app2通過網(wǎng)線對app1進行更新)。根據(jù)分區(qū)情況來看,整個app1與app2都在非零等待區(qū)中。

現(xiàn)在現(xiàn)象是無論app1還是app2,只要對對方分區(qū)進行更新就會死機。但是如果把相同的代碼編譯到零等待區(qū)就能正常工作。

目前我做了如下實驗:

1.把相同的代碼編譯到零等待區(qū)就能正常工作。(修改Link.ld文件)

2.操作flash前手動主動開啟hsi,無效果,開啟代碼如下:

RCC_HSICmd(ENABLE);
temp?=?0;
while?(RCC_GetFlagStatus(RCC_FLAG_HSIRDY)?==?RESET?&&?temp?<?250)
{
????temp++;
????Delay_Ms(20);
}
if?(temp?>=?250)
{
????return?-2;
}

3.操作flash前手動將hclk改為1/4分頻,默認是1/2分頻,主動關(guān)閉增強讀模式以及將FLASH時鐘分頻,無效果,修改代碼如下:

FLASH_Enhance_Mode(DISABLE);
RCC_HCLKConfig(RCC_SYSCLK_Div4);
FLASH_Access_Clock_Cfg(FLASH_Access_SYSTEM_HALF);
FLASH_Unlock();
FLASH_Unlock_Fast();

請問在非零等待區(qū)進行flash的操作到底要注意哪些細節(jié)?方不方便告知一下?這也太讓人絕望了。



icon_rar.gifFLASH_TEST.zip

附件是我基于官方FLASH_TEST修改的代碼,改動非常小,很容易讀懂。與我反饋的問題有相同的現(xiàn)象,請協(xié)助看如何解決。

改動內(nèi)容:

  1. 主頻從96MHz改為了120MHz。

  2. 修改了測試的flash地址,改為了如果在29000,就擦寫50000。如果在50000,就擦除29000,通過77000的內(nèi)容進行判斷。默認在50000,擦除29000。

  3. 將啟動代碼改為了D8W,因為我用的是ch23V208。

現(xiàn)象是如果程序本身在0地址,能正常擦寫FLASH,但是如果程序在29000或是50000,那么打印到FLASH Test是最后一條log,應該是死在了FLASH_ErasePage這個函數(shù)中。


你好,目前復現(xiàn)了該問題,問題原因待查,你可先將這幾個快速編程函數(shù)放到零等待區(qū)域,經(jīng)測試是可以的。將函數(shù)放零等待方法見鏈接:https://www.cnblogs.com/liaigu/p/17330342.html?


目前我自己已經(jīng)將問題解決,解決方法如下:

  1. 由于bootloader能正常工作,可以肯定bootloader關(guān)于flash的函數(shù)是在0等待區(qū),其他部分的程序如果能成功調(diào)用到bootloader中的函數(shù),則改問題解決,因此將bootloader中相關(guān)函數(shù)的地址在bootloader中讀取出來,然后保存到flash的特定扇區(qū)中。

    截圖_選擇區(qū)域_20231112013002.png

  2. 在app中改寫flash.c文件,讀取特定扇區(qū)的內(nèi)容,然后跳轉(zhuǎn)到bootloader中的0等待區(qū)函數(shù)中去。

    截圖_選擇區(qū)域_20231112012750.png

再額外加上關(guān)閉中斷等的操作,目前來看是可以正常對芯片進行ota的。

其核心思路是,雖然app整個都在非0等待區(qū),但是bootloader的相關(guān)函數(shù)在0等待區(qū),因此想辦法讓app調(diào)用bootloader中的函數(shù)去做想做的事情即可。


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

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