@WCH
把現(xiàn)象詳細說明一下:用戶App將FLASH最后64K用于保存數(shù)據(jù),在正常供電下,讀、寫結(jié)果都正確,用戶App也正常;但是在寫的過程中突然斷電,就死機(變磚),反復上電也沒用,似乎是用戶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的話,后面的空間就可以盡量利用,那樣你可以預先擦除,掉電操作能省多少時間是多少,看看這樣有沒有幫助