中级会员
 
- 积分
- 220
- 金钱
- 220
- 注册时间
- 2017-3-22
- 在线时间
- 46 小时
|

楼主 |
发表于 2017-8-21 10:40:26
|
显示全部楼层
[mw_shl_code=applescript,true]#include "stm32f0xx.h"
#include "delay.h"
#include "iflash.h"
#define FLASH_PAGE_SIZE 1024
u8 FLASH_BUF[FLASH_PAGE_SIZE];
u8 Read_BUF[FLASH_PAGE_SIZE];
//±ØDëè·±£ËùD′μÄμØÖ··¶Î§ÄúμÄêy¾Yè«2¿Îa0XFF,·ñÔòÔú·Ç0XFF′|D′èëμÄêy¾Y½«ê§°ü!
//¾ßóD×Ô¶ˉ»»ò31|Äü
//ÔúÖ¸¶¨μØÖ·¿aê¼D′èëÖ¸¶¨3¤¶èμÄêy¾Y,μ«êÇòaè·±£μØÖ·2»Ô½½ç!
//pBuffer:êy¾Y′æ′¢Çø
//WriteAddr:¿aê¼D′èëμÄμØÖ·(24bit)
//NumByteToWrite:òaD′èëμÄ×Ö½úêy(×î′ó65535)
u8 Flash_Write_Check(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u16 i;
u32 RamSource;
RamSource =(u32)pBuffer;
for(i=0;i<NumByteToWrite;i+=4)
{
FLASH_ProgramWord(WriteAddr, *(u32*)RamSource);
if (*(u32*)WriteAddr != *(u32*)RamSource)
{
return 1;
}
WriteAddr += 4;
RamSource += 4;
}
return 0;
}
//2á3yò»¸öéèÇø
//Dst_Addr:éèÇøμØÖ·
//2á3yò»¸öé½ÇøμÄ×îéùê±¼ä:150ms
void Flash_Erase_Sector(u32 Dst_Addr)
{
Dst_Addr*=FLASH_PAGE_SIZE;
FLASH_ErasePage(Dst_Addr);
}
void Flash_Read(u8* pBuffer,u32 ReadAddr,u16 NumByteToRead)
{
u16 i;
u8 *p;
p = (u8*)ReadAddr;
for(i=0;i<NumByteToRead;i++)
{
pBuffer=*p++; //Ñ-»·¶áêy
}
}
u8 Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)
{
u32 secpos;
u16 secoff;
u16 secremain;
u16 i;
u8 ret;
secpos=WriteAddr/FLASH_PAGE_SIZE;//éèÇøμØÖ·
secoff=WriteAddr%FLASH_PAGE_SIZE;//ÔúéèÇøÄúμÄÆ«òÆ
secremain=FLASH_PAGE_SIZE-secoff;//éèÇøê£óà¿Õ¼ä′óD¡
if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//2»′óóú1024¸ö×Ö½ú
while(1)
{
Flash_Read(FLASH_BUF,secpos*FLASH_PAGE_SIZE,FLASH_PAGE_SIZE);//¶á3öÕû¸öéèÇøμÄÄúèY
/*
if(secoff!=0)
{
for(i=0;i<secremain;i++)//D£Ñéêy¾Y
{
if(FLASH_BUF[secoff+i]!=0XFF)break;//Dèòa2á3y
}
}
*/
//if(secoff==0 || i<secremain)//Dèòa2á3y
{
FLASH_ErasePage(secpos*FLASH_PAGE_SIZE);//2á3yÕa¸öéèÇø
delay_ms(3);
for(i=0;i<secremain;i++) //¸′ÖÆ
{
FLASH_BUF[i+secoff]=pBuffer;
}
//ret = Flash_Write_Check(FLASH_BUF,secpos*FLASH_PAGE_SIZE,FLASH_PAGE_SIZE);//D′èëÕû¸öéèÇø
ret = Flash_Write_Check(FLASH_BUF,secpos*FLASH_PAGE_SIZE,FLASH_PAGE_SIZE);
if(ret!=0) //wangxl@20170218 DÂÔö
{
ret = Flash_Write_Check(FLASH_BUF,secpos*FLASH_PAGE_SIZE,FLASH_PAGE_SIZE); //wangxl@20170218 DÂÔöÔùD′ò»′Î
}
if(ret!=0) break; //wangxl@20170218 DÂÔöD′èë3ö′ííË3ö
delay_ms(1);
}
/*
else
{
ret=Flash_Write_Check(pBuffer,WriteAddr,secremain);//D′òѾ-2á3yáËμÄ,Ö±½óD′èëéèÇøê£óàÇø¼ä.
}
*/
if(NumByteToWrite==secremain)break;//D′èë½áêøáË
else//D′èëÎ′½áêø
{
secpos++;//éèÇøμØÖ·Ôö1
secoff=0;//Æ«òÆÎ»ÖÃÎa0
pBuffer+=secremain; //Ö¸ÕëÆ«òÆ
WriteAddr+=secremain;//D′μØÖ·Æ«òÆ
NumByteToWrite-=secremain; //×Ö½úêyμY¼õ
if(NumByteToWrite>FLASH_PAGE_SIZE)secremain=FLASH_PAGE_SIZE; //ÏÂò»¸öéèÇø»1êÇD′2»íê
else secremain=NumByteToWrite; //ÏÂò»¸öéèÇø¿éòÔD′íêáË
}
}
return ret;
}
u8 Flash_Copy(u32 ReadAddr,u32 WriteAddr,u16 NumByteToWrite)
{
u32 writepos,readpos;
u16 i;
u16 times;
u8 ret=1;
//writepos=WriteAddr/FLASH_PAGE_SIZE;//éèÇøμØÖ·
// readpos = ReadAddr /FLASH_PAGE_SIZE;//éèÇøμØÖ·
times = ((NumByteToWrite-1)/ FLASH_PAGE_SIZE) + 1; //×ü′Îêy
readpos = ReadAddr;
writepos = WriteAddr;
for(i=0;i<times;i++)
{
Flash_Read(Read_BUF,readpos,FLASH_PAGE_SIZE);//¶á3öÕû¸öéèÇøμÄÄúèY
ret = Flash_Write(Read_BUF,writepos,FLASH_PAGE_SIZE);
// FLASH_ErasePage(writepos*FLASH_PAGE_SIZE);//2á3yÕa¸öéèÇø
// ret = Flash_Write_Check(FLASH_BUF,writepos*FLASH_PAGE_SIZE,FLASH_PAGE_SIZE);
// writepos++;//éèÇøμØÖ·Ôö1
// readpos++;
readpos+=FLASH_PAGE_SIZE;
writepos+=FLASH_PAGE_SIZE;
}
return ret;
}
[/mw_shl_code] |
|