中级会员 
   
	- 积分
 - 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] |   
 
 
 
 |