@WCH
把现象详细说明一下:用户App将FLASH最后64K用于保存数据,在正常供电下,读、写结果都正确,用户App也正常;但是在写的过程中突然断电,就死机(变砖),反复上电也没用,似乎是用户App被冲了。
@WCH
把现象详细说明一下:用户App将FLASH最后64K用于保存数据,在正常供电下,读、写结果都正确,用户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后面的空间可以做数据,我测试过也可以跑程序,只是用MRS下载会异常,自己做个bootloader的话,后面的空间就可以尽量利用,那样你可以预先擦除,掉电操作能省多少时间是多少,看看这样有没有帮助