论坛元老
 
- 积分
- 4467
- 金钱
- 4467
- 注册时间
- 2013-6-27
- 在线时间
- 565 小时
|

楼主 |
发表于 2017-7-6 08:11:59
|
显示全部楼层
中心思想:先在RAM开辟一个flash扇区大小的数据,写入修改先在RAM操作,然后对flash擦除,再将RAM缓存搬运到flash。
读就直接flash地址读就行;
[mw_shl_code=applescript,true]#define MCU_PAGE_SIZE 0x00000400 /* 1KB */
u8 FlashBuffer[MCU_PAGE_SIZE];
GLOBAL bool UpDataToFlash(u32 FlashAddr,u16 length)
{
volatile FLASH_Status FLASHStatus;
u32 *DataBuf;
// InterruptDisable(); //关中断
if(length > MCU_PAGE_SIZE)
return FALSE;
FLASH_Unlock(); //解锁
FLASHStatus = FLASH_COMPLETE;
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
FLASHStatus = FLASH_ErasePage(FlashAddr);
FLASH_Unlock();//Unlock the Flash
DataBuf = (u32*)FlashBuffer;
if(length%4)
length+=4;
length>>=2;
while(length--)
{
FLASH_ProgramWord(FlashAddr, *DataBuf);//在指定地址编写半字
if(FLASH_GetStatus()==FLASH_COMPLETE) //获取Flash状态
{
// length--;
FlashAddr += 4;
DataBuf++;
}
else
{
FLASH_Lock();
return FALSE;
}
}
FLASH_Lock();
// InterruptEnable(); //开中断
return TRUE;
}
GLOBAL void WriteByteFlashEeprom(u16 addr,u8 val)
{
if(addr < MCU_PAGE_SIZE)
FlashBuffer[addr] = val;
}
GLOBAL u8 ReadByteFlashEeprom(u32 addr)
{
u8 *pcData;
pcData = (u8 *)(addr);
return(*pcData);
}
[/mw_shl_code] |
|