/**************************************************************************************
* FunctionName : FLSEraseFlash()
* Description : Flash擦除
* EntryParameter : sAddr - 起始地址,eAddr - 结束地址,pageSize - 页大小
* ReturnValue : None
**************************************************************************************/
void FLSEraseFlash(u32 sAddr, u32 eAddr, u32 pageSize)
{
u8 i, maxPag;
volatile FLASH_Status fshStu = FLASH_COMPLETE;
maxPag = (eAddr - sAddr) / pageSize; // 页数
FLASH_Unlock(); // 解锁的闪存程序擦除控制器
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
for (i=0; ((i
{
fshStu = FLASH_ErasePage(sAddr + (pageSize * i)); // 擦除FLASH页
}
FLASH_Lock(); // 锁Flash
}
复制代码
/**************************************************************************************
* FunctionName : FLSWriteFlash()
* Description : 写Flash
* EntryParameter : wrtAddr - 写地址,pDat - 数据,len - 数据长度
* ReturnValue : 成功返回0,否则返回1
**************************************************************************************/
u8 FLSWriteFlash(u32 wrtAddr, u8 *pDat, u32 len)
{
u8 times = 0;
u16 i;
u32 wrtDat = 0, reaDat = 0; // 读写缓冲
u32 addr = wrtAddr;
FLASH_Unlock(); // 解锁的闪存程序擦除控制器
for (i=0; i
{
wrtDat = (pDat[i+0]<<0) + (pDat[i+1]<<8) + (pDat[i+2]<<16) + (pDat[i+3]<<24);
do
{
times++;
FLASH_ProgramWord(addr, wrtDat); // 写Flash
reaDat = FLSReadDword(addr); // 读Flash
} while ((reaDat != wrtDat) && (times < 5));
if (times == 0) // 读写错误
{
FLASH_Lock(); // 锁Flash
return 1;
}
times = 0;
addr += 4; // 偏移地址
}
FLASH_Lock(); // 锁Flash
return 0;
} |