2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
#include "flash_manager.h"
|
|
|
|
|
#include "mymem.h"
|
|
|
|
|
#include "spi_flash.h"
|
|
|
|
|
#include "string.h"
|
|
|
|
|
#ifndef BOOTLOADER
|
|
|
|
|
# include "rtthread.h"
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ʹ<><CAB9><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD>FLASH<53>ķ<EFBFBD><C4B7>ʽ<EFBFBD><CABD>б<EFBFBD><D0B1><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
|
|
|
|
|
#ifndef BOOTLOADER
|
|
|
|
|
|
|
|
|
|
static struct rt_semaphore g_flash={0};
|
|
|
|
|
static rt_err_t g_flash_err=RT_ERROR;
|
|
|
|
|
|
|
|
|
|
#define FLASH_ENTER_USED() {while (g_flash_err==RT_ERROR) \
|
|
|
|
|
{g_flash_err=rt_sem_init(&g_flash,"g_flash",1,RT_IPC_FLAG_PRIO);}\
|
|
|
|
|
rt_sem_take (&g_flash,RT_WAITING_FOREVER);\
|
|
|
|
|
}
|
|
|
|
|
#define FLASH_EXIT_USED() {rt_sem_release (&g_flash);}
|
|
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
#define FLASH_ENTER_USED() {}
|
|
|
|
|
#define FLASH_EXIT_USED() {}
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
int FLASH_ReadData (uint8_t* pBuffer, uint32_t ReadAddr , uint32_t NumByteToRead )
|
|
|
|
|
{
|
|
|
|
|
FLASH_ENTER_USED();
|
|
|
|
|
sFLASH_ReadBuffer (pBuffer,ReadAddr,NumByteToRead);
|
|
|
|
|
//SPI_Flash_Read (pBuffer,ReadAddr,NumByteToRead);
|
|
|
|
|
//W25QXX_Read (pBuffer,ReadAddr,NumByteToRead);
|
|
|
|
|
FLASH_EXIT_USED();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int FLASH_WriteData (uint8_t* pBuffer, uint32_t WriteAddr, uint32_t NumByteToWrite)
|
|
|
|
|
{
|
|
|
|
|
FLASH_ENTER_USED();
|
|
|
|
|
sFLASH_WriteBuffer (pBuffer,WriteAddr,NumByteToWrite);
|
|
|
|
|
//SPI_Flash_Write_NoCheck (pBuffer,WriteAddr,NumByteToWrite);
|
|
|
|
|
//W25QXX_Write_NoCheck (pBuffer,WriteAddr,NumByteToWrite);
|
|
|
|
|
FLASH_EXIT_USED();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int FLASH_EraseOneSector (uint32_t SectorAddr)
|
|
|
|
|
{
|
|
|
|
|
FLASH_ENTER_USED();
|
|
|
|
|
sFLASH_EraseSector (SectorAddr);
|
|
|
|
|
//SPI_Flash_Erase_Sector (SectorAddr);
|
|
|
|
|
//W25QXX_Erase_Sector(SectorAddr);
|
|
|
|
|
FLASH_EXIT_USED();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int FLASH_EraseAllSector (void)
|
|
|
|
|
{
|
|
|
|
|
FLASH_ENTER_USED();
|
|
|
|
|
sFLASH_EraseBulk();
|
|
|
|
|
//SPI_Flash_Erase_Chip ();
|
|
|
|
|
//W25QXX_Erase_Chip();
|
|
|
|
|
FLASH_EXIT_USED();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>FLASH<53><48><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>洢<EFBFBD><E6B4A2>ַ<EFBFBD>ʹ<EFBFBD>С<EFBFBD><D0A1>Ϣ<EFBFBD>洢<EFBFBD><E6B4A2><EFBFBD>ļ<EFBFBD>ͷ<EFBFBD><CDB7>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>û<EFBFBD>н<EFBFBD><D0BD>е<EFBFBD>ַ<EFBFBD>Ƿ<EFBFBD><C7B7>غϵ<D8BA><CFB5>жϣ<D0B6><CFA3><EFBFBD>ʹ<EFBFBD><CAB9>FLASH_GetUsed()<29><><EFBFBD><EFBFBD>ȡ<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ʹ<EFBFBD>õĵ<C3B5>ַ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int FLASH_AddFile (char *fileName,u32 address,u32 fileSize)
|
|
|
|
|
{
|
|
|
|
|
FLASH_HeaderStruct *flashHeader=0;
|
|
|
|
|
u32 flashHeaderSize=4096;
|
|
|
|
|
flashHeader=mymalloc(flashHeaderSize);
|
|
|
|
|
FLASH_ReadData((u8*)flashHeader,0,flashHeaderSize);
|
|
|
|
|
for (int i=0;i<flashHeaderSize;i++) {if (((u8*)flashHeader)[i]==0xff) ((u8*)flashHeader)[i]=0;}
|
|
|
|
|
flashHeader->File[flashHeader->FileNumber].Address=address;
|
|
|
|
|
flashHeader->File[flashHeader->FileNumber].FileSize=fileSize;
|
|
|
|
|
mymemcpy(flashHeader->File[flashHeader->FileNumber].FileName,fileName,strlen(fileName)+1);
|
|
|
|
|
flashHeader->FileNumber++;
|
|
|
|
|
FLASH_CheckErase(0,4096);
|
|
|
|
|
FLASH_WriteData((u8*)flashHeader,0,4096);
|
|
|
|
|
myfree(flashHeader);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>FLASH<53>д洢<D0B4><E6B4A2><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ŀ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int FLASH_GetFileNum (void)
|
|
|
|
|
{
|
|
|
|
|
int ret=0;
|
|
|
|
|
FLASH_HeaderStruct *flashHeader=0;
|
|
|
|
|
u32 flashHeaderSize=4096;
|
|
|
|
|
flashHeader=mymalloc(flashHeaderSize);
|
|
|
|
|
FLASH_ReadData((u8*)flashHeader,0,flashHeaderSize);
|
|
|
|
|
for (int i=0;i<flashHeaderSize;i++) {if (((u8*)flashHeader)[i]==0xff) ((u8*)flashHeader)[i]=0;}
|
|
|
|
|
ret=flashHeader->FileNumber;
|
|
|
|
|
myfree(flashHeader);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0<EFBFBD><30><EFBFBD>ɹ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int FLASH_GetFileInfo (int index,FLASH_FileStruct *file)
|
|
|
|
|
{
|
|
|
|
|
int ret=0;
|
|
|
|
|
FLASH_HeaderStruct *flashHeader=0;
|
|
|
|
|
u32 flashHeaderSize=4096;
|
|
|
|
|
flashHeader=mymalloc(flashHeaderSize);
|
|
|
|
|
FLASH_ReadData((u8*)flashHeader,0,flashHeaderSize);
|
|
|
|
|
for (int i=0;i<flashHeaderSize;i++) {if (((u8*)flashHeader)[i]==0xff) ((u8*)flashHeader)[i]=0;}
|
|
|
|
|
if (index<flashHeader->FileNumber)
|
|
|
|
|
{
|
|
|
|
|
mymemcpy (file, &flashHeader->File[index],sizeof (FLASH_FileStruct));
|
|
|
|
|
}
|
|
|
|
|
else { ret=-1; }
|
|
|
|
|
myfree(flashHeader);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ɾ<><C9BE>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int FLASH_DeleteFile (int index)
|
|
|
|
|
{
|
|
|
|
|
int ret=0;
|
|
|
|
|
FLASH_HeaderStruct *flashHeader=0;
|
|
|
|
|
u32 flashHeaderSize=4096;
|
|
|
|
|
flashHeader=mymalloc(flashHeaderSize);
|
|
|
|
|
FLASH_ReadData((u8*)flashHeader,0,flashHeaderSize);
|
|
|
|
|
for (int i=0;i<flashHeaderSize;i++) {if (((u8*)flashHeader)[i]==0xff) ((u8*)flashHeader)[i]=0;}
|
|
|
|
|
if (index<flashHeader->FileNumber)
|
|
|
|
|
{
|
|
|
|
|
flashHeader->FileNumber=index;
|
|
|
|
|
u32 sizeUsed=FLASH_GetUsed();
|
|
|
|
|
FLASH_CheckErase(0,4096);
|
|
|
|
|
FLASH_WriteData((u8*)flashHeader,0,4096);
|
|
|
|
|
u32 addrToDelete =FLASH_GetUsed();
|
|
|
|
|
u32 sizeToDelete=sizeUsed-addrToDelete;
|
|
|
|
|
FLASH_CheckErase (addrToDelete,sizeToDelete);
|
|
|
|
|
}
|
|
|
|
|
else { ret=-1; }
|
|
|
|
|
myfree(flashHeader);
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ȡFLASH<53><48><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u32 FLASH_GetFlashSize (void)
|
|
|
|
|
{
|
|
|
|
|
return 16*1024*1024;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>FLASH<53>Ѿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>˶<EFBFBD><CBB6>ٴ洢<D9B4>ռ<EFBFBD>
|
|
|
|
|
//<2F>˷<EFBFBD><CBB7><EFBFBD>ֵ<EFBFBD><D6B5>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC>Ĵ洢<C4B4><E6B4A2>ַ
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u32 FLASH_GetUsed (void)
|
|
|
|
|
{
|
|
|
|
|
FLASH_HeaderStruct *flashHeader=0;
|
|
|
|
|
u32 flashHeaderSize=4096;
|
2025-07-05 19:47:28 +08:00
|
|
|
|
u32 usedBluk=1;//<2F>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
flashHeader=mymalloc(flashHeaderSize);
|
|
|
|
|
FLASH_ReadData((u8*)flashHeader,0,flashHeaderSize);
|
|
|
|
|
for (int i=0;i<flashHeaderSize;i++) {if (((u8*)flashHeader)[i]==0xff) ((u8*)flashHeader)[i]=0;}
|
|
|
|
|
if (flashHeader->FileNumber<20)
|
|
|
|
|
{
|
|
|
|
|
for (int i=0;i<flashHeader->FileNumber;i++)
|
|
|
|
|
{
|
|
|
|
|
usedBluk+=flashHeader->File[i].FileSize/4096+1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
myfree(flashHeader);
|
|
|
|
|
return usedBluk*4096;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><>ȡָ<C8A1><D6B8><EFBFBD>ļ<EFBFBD>,<2C><><EFBFBD>سɹ<D8B3><C9B9><EFBFBD>ȡ<EFBFBD>Ĵ<EFBFBD>С
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int FLASH_ReadFile (char *fileName,u32 offset,u8 *recvBuff,u32 readLength)
|
|
|
|
|
{
|
|
|
|
|
int ret=0;
|
|
|
|
|
u32 file_size=0;
|
|
|
|
|
u32 file_addr=FLASH_FindFile (fileName,&file_size);
|
|
|
|
|
if (file_addr)
|
|
|
|
|
{
|
|
|
|
|
int read_block=0;
|
|
|
|
|
if (readLength>file_size-offset) readLength=file_size-offset;
|
|
|
|
|
ret=readLength;
|
|
|
|
|
while (readLength)
|
|
|
|
|
{
|
|
|
|
|
if (readLength>4096) read_block=4096;
|
|
|
|
|
else read_block=readLength;
|
|
|
|
|
FLASH_ReadData (recvBuff,file_addr+offset,read_block);
|
|
|
|
|
offset+=read_block;
|
|
|
|
|
readLength-=read_block;
|
|
|
|
|
recvBuff+=read_block;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
ret=0;
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>,<2C><><EFBFBD>ط<EFBFBD>0ʧ<30><CAA7>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int FLASH_SaveFile (char *FileName,u8 *data,u32 size)
|
|
|
|
|
{
|
|
|
|
|
int ret=-1;
|
|
|
|
|
if (FLASH_FindFile(FileName,0)==0)
|
|
|
|
|
{
|
|
|
|
|
u32 flash_write_addr=FLASH_GetUsed();
|
|
|
|
|
u32 save_size=0;
|
|
|
|
|
FLASH_CheckErase(flash_write_addr,size);
|
|
|
|
|
FLASH_AddFile(FileName,flash_write_addr,size);
|
|
|
|
|
while(size)
|
|
|
|
|
{
|
|
|
|
|
if (size>4096)
|
|
|
|
|
{
|
|
|
|
|
save_size=4096;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
save_size=size;
|
|
|
|
|
}
|
|
|
|
|
FLASH_WriteData(data,flash_write_addr,save_size);
|
|
|
|
|
size-=save_size;
|
|
|
|
|
flash_write_addr+=save_size;
|
|
|
|
|
data+=save_size;
|
|
|
|
|
}
|
|
|
|
|
ret=0;
|
|
|
|
|
}
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><DEB7><EFBFBD>0<EFBFBD><30><EFBFBD>з<EFBFBD><D0B7><EFBFBD>ƫ<EFBFBD>Ƶ<EFBFBD>ַ
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>size<7A><65><EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD>Сʱ<D0A1>˲<EFBFBD><CBB2><EFBFBD>ӦΪ0
|
2025-06-27 00:32:57 +08:00
|
|
|
|
u32 FLASH_FindFile (char *fileName,u32 *size)
|
|
|
|
|
{
|
|
|
|
|
FLASH_HeaderStruct *flashHeader=0;
|
|
|
|
|
u32 flashHeaderSize=4096;
|
|
|
|
|
u32 ret=0;
|
|
|
|
|
flashHeader=mymalloc(flashHeaderSize);
|
|
|
|
|
FLASH_ReadData((u8*)flashHeader,0,flashHeaderSize);
|
|
|
|
|
for (int i=0;i<flashHeaderSize;i++) {if (((u8*)flashHeader)[i]==0xff) ((u8*)flashHeader)[i]=0;}
|
2025-07-05 19:47:28 +08:00
|
|
|
|
if (flashHeader->FileNumber>20)//<2F><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10˵<30><CBB5><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD>ƻ<EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
{
|
|
|
|
|
FLASH_EraseAllSector();
|
|
|
|
|
flashHeader->FileNumber=0;
|
|
|
|
|
}
|
|
|
|
|
for (int i=0;i<flashHeader->FileNumber;i++)
|
|
|
|
|
{
|
|
|
|
|
if (strcmp(flashHeader->File[i].FileName,fileName)==0)
|
|
|
|
|
{
|
|
|
|
|
ret=flashHeader->File[i].Address;
|
|
|
|
|
if (size) *size=flashHeader->File[i].FileSize;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
myfree(flashHeader);
|
|
|
|
|
return ret;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//У<><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//У<><D0A3>FLASH<53><48>ָ<EFBFBD><D6B8><EFBFBD>洢<EFBFBD>ռ<EFBFBD><D5BC>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>û<EFBFBD>н<EFBFBD><D0BD>е<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>룬<EFBFBD>뱣֤<EBB1A3><D6A4><EFBFBD><EFBFBD>addrΪ4096<39><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int FLASH_CheckErase (u32 addr,u32 size)
|
|
|
|
|
{
|
|
|
|
|
u8* flash_mem=mymalloc (4096);
|
|
|
|
|
u32 check_size=size/4096;
|
|
|
|
|
if (size%4096) check_size++;
|
|
|
|
|
for (int i=0;i<check_size;i++)
|
|
|
|
|
{
|
|
|
|
|
FLASH_ReadData(flash_mem,addr,4096);
|
|
|
|
|
for (int j=0;j<4096;j++)
|
|
|
|
|
{
|
|
|
|
|
if (flash_mem[j]!=0xff)
|
|
|
|
|
{
|
|
|
|
|
FLASH_EraseOneSector(addr);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
addr+=4096;
|
|
|
|
|
}
|
|
|
|
|
myfree(flash_mem);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-07-05 19:47:28 +08:00
|
|
|
|
//ѭ<><D1AD>д<EFBFBD><D0B4>,<2C><><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>
|
2025-06-27 00:32:57 +08:00
|
|
|
|
int FLASH_LoopWrite (u32 addr,u32 size ,int (*pGetData)(u8 *buff,u32 size))
|
|
|
|
|
{
|
|
|
|
|
if (pGetData==0) return -1;
|
|
|
|
|
u8* flash_mem=mymalloc (4096);
|
|
|
|
|
u32 check_size=0;
|
|
|
|
|
while (size)
|
|
|
|
|
{
|
|
|
|
|
if (size>4096)
|
|
|
|
|
{
|
|
|
|
|
check_size=4096;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
check_size=size;
|
|
|
|
|
}
|
|
|
|
|
pGetData(flash_mem,check_size);
|
|
|
|
|
FLASH_WriteData(flash_mem,addr,check_size);
|
|
|
|
|
addr+=check_size;
|
|
|
|
|
size-=check_size;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|