關于CH32V307VCT6擦寫flash時,用戶APP死機(變磚)問題

@WCH

把現(xiàn)象詳細說明一下:用戶App將FLASH最后64K用于保存數(shù)據(jù),在正常供電下,讀、寫結(jié)果都正確,用戶App也正常;但是在寫的過程中突然斷電,就死機(變磚),反復上電也沒用,似乎是用戶App被沖了。

最后64K?是什么地址?


Link .id:


ENTRY( _start )


__stack_size = 2048;


PROVIDE( _stack_size = __stack_size );



MEMORY

{

FLASH (rx) : ORIGIN = 0x0000000000, LENGTH = 256K

RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K

}


APP:

#define PAGE_FAST_SIZE? (u16)0x100

#define PAGE_SIZE? (u32)0x1000

#define FLASH_SIZE? (u32)0x40000

#define FLASH_END? (u32)(0x08000000+FLASH_SIZE)?

#define EE_BASE_ADDRESS (FLASH_END-1*PAGE_SIZE)

#define BACK_ADDRES? ? ?(FLASH_END-2*PAGE_SIZE)

void write_fundata_fast(uint32_t Address)

{

? ? u16 i;

? ? u32 addr;


? ? FLASH_Unlock_Fast();


? ? mCRC=0;

? ? for(i=0;i

? ? {

? ? ? ? mCRC +=fundata.i[i];// Get mCRC

? ? }


? ? for(i=0;i

? ? {

? ? ? ? addr=Address+i*PAGE_FAST_SIZE;

? ? ? ? if( *(u32*)addr!=ERASED ) FLASH_ErasePage_Fast(addr);

? ? ? ? FLASH_ProgramPage_Fast(addr, &fundata.lparameter[i*PAGE_FAST_SIZE/4]);

? ? }


? ? FLASH_Lock_Fast();

}

void Power_Off_Store()

{

? ? write_fundata_fast(EE_BASE_ADDRESS);

}



#define FLASH_SIZE? (u32)0x40000


#define ERASED? 0xe339e339



掉電還要做擦除動作?本身掉電操作flash是很容易出問題的,你還多塊擦除編程,其實307是有480Kflash的,256K后面的空間可以做數(shù)據(jù),我測試過也可以跑程序,只是用MRS下載會異常,自己做個bootloader的話,后面的空間就可以盡量利用,那樣你可以預先擦除,掉電操作能省多少時間是多少,看看這樣有沒有幫助


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

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