Falsh的写入函数
int User_Read_flash(unsigned int address, void *pbuf, int NumByteToWrite)
{
hal_flash_read(address,pbuf,NumByteToWrite);
return MK_EOK;
}
int writer_flash(unsigned int address, void *pbuf, int len)
{
hal_flash_unlock();
hal_flash_write(address,pbuf,len);
hal_flash_lock();
return MK_EOK;
}
int User_Write_Page_Nocheck(unsigned int address,void *pbuf)
{
writer_flash(address,pbuf,2048);
return MK_EOK;
}
int User_Erase_Page(unsigned int address)
{
hal_flash_unlock();
if(hal_flash_erase(address,2048) == MK_EOK)
{
hal_flash_lock();
return MK_EOK;
}
return MK_ERR;
}
int User_Write_Flash(unsigned int address, void *pbuf, int NumByteToWrite)
{
uint8_t *buf = (uint8_t *)pbuf;
uint32_t secpos;
uint16_t secoff;
uint16_t secremain;
uint16_t i;
uint8_t *Buffer;
Buffer = rt_malloc(2048);
if (!Buffer)
{
LOG_E("%d[%s] malloc failed.", __func__, __LINE__);
return MK_ERR;
}
secoff = address % 2048;
secpos = address - secoff;
secremain=2048-secoff;
if(NumByteToWrite<=secremain)
secremain=NumByteToWrite;
User_Read_flash(secpos,Buffer,2048);
while(1)
{
for(i = 0;i < secremain;i++)
{
if(Buffer[secoff+i]!=0XFF)
break;
}
if(i<secremain)
{
User_Erase_Page(secpos);
for(i=0;i<secremain;i++)
{
Buffer[i+secoff] = buf[i];
}
User_Write_Page_Nocheck(secpos,Buffer);
}
else
writer_flash(address,buf,secremain);
if(NumByteToWrite==secremain)
break;
else
{
secpos++;
secoff=0;
buf+=secremain;
address+=secremain;
NumByteToWrite-=secremain;
if(NumByteToWrite>2048)secremain=2048;
else secremain=NumByteToWrite;
}
}
rt_free(Buffer);
return MK_EOK;
}