⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash_management.c

📁 SST39VF160驱动,平台:ZLG EaryARM
💻 C
字号:
/*
+FHDR------------------------------------------------------------------
Copyright (c),
Tony Yang –51,AVR,ARM firmware developer  
Contact:qq 292942278  e-mail:tony_yang123@sina.com.cn

Abstract:
$Id: flash_management.c,v 1.1.1.1 2007/02/24 07:59:45 yangwenbin Exp $
-FHDR-------------------------------------------------------------------
*/

#include "include\types.h"
#include "include\flash_management_cfg.h" 
void  SendByte(u8 data);
static u8 buf[4096];  
/*
===============================================================================
函数 
read flash sector
入口: buf:数据缓冲区首地址,sector_address:flash扇区地址
出口: SUCC
===============================================================================
*/  
u8 read_flash_sector(u8 *buf_,u32 sector_address)
{  
 
#if RAM_DISK
   u32 address;
   u16 i;
   
   address = 0x80000000 + sector_address * 512 + 70 * 512;
   for(i = 0; i < 512; i++)
   {
     buf_[i] = *((volatile u8 *)(address + i));
   
   }

  return(SUCC);; 
#else  
   //u16 j; 
   u16 i;
   u32 address;
   address = 0x81000000 + sector_address * 512;
   for(i = 0; i < 512; i++)
   {
     buf_[i] = *((volatile u8 *)(address + i));
     //for(j = 0; j < 20;j++);
   }

  return(SUCC);  
     
 #endif
}   


/*
===============================================================================
函数 
Poll_Toggle_Bit
入口: 无
出口: 无
===============================================================================
*/
static void Poll_Toggle_Bit(void)
{
   u16 PreByte,CurByte;
   //u16 i;
  // for(i = 0;i<5;i++);
   PreByte = *((volatile u16 *)(0x81000002)); 
   do{
       CurByte = *((volatile u16 *)(0x81000002)); 
       if((CurByte & 0x40) == (PreByte &0x40))
          break;
       PreByte = CurByte;   
   }while(1);


}


/*
===============================================================================
函数 
write flash sector
入口: buf:数据缓冲区首地址,sector_address:flash扇区地址
出口: SUCC
===============================================================================
*/  
u8 write_flash_sector(u8 *buf_,u32 sector_address)
{

#if RAM_DISK
   u32 address;
   u16 i;
   
   address = 0x80000000 + sector_address * 512 + 70 * 512;
   for(i = 0; i < 512; i++)
   {
     *((volatile u8 *)(address + i)) = buf_[i];
   
   }
  return(SUCC);
  
#else  
      
   u32 address; 
   
   u16 i; 
   u16 j;  
   
   /*  2K word sector save */
    
   address = 0x81000000 + ((sector_address) / 8) * 4096  ;
   for(i = 0; i < 4096; i+=2)
      {buf[i] = (u8)(*((volatile u16 *)(address + i)) & 0xff);
      buf[i+1] = (u8)(*((volatile u16 *)(address + i)) >> 8 & 0xff); 
     }
      
   /*  2K word sector erased  */
    
   address = 0x81000000 + sector_address * 512;
   *((volatile u16 *)(0x81000000+0x5555 * 2)) = 0xaa;

   *((volatile u16 *)(0x81000000+0x2AAA * 2)) = 0x55;

   *((volatile u16 *)(0x81000000+0x5555 * 2)) = 0x80;

   *((volatile u16 *)(0x81000000+0x5555 * 2)) = 0xaa;

   *((volatile u16 *)(0x81000000+0x2AAA * 2)) = 0x55;

   *((volatile u16 *)(address)) = 0x30;
  Poll_Toggle_Bit();

   
   
   /*  Write back sector 2k word  */ 

   address = (sector_address % 8) * 512;
   for(i = 0;i < 512;i++)  
   {
     buf[address + i] = buf_[i];
   }
   address = 0x81000000 + ((sector_address) / 8) * 4096;
   for( i = 0;i < 4096;i += 2 )
   {
       *((volatile u16 *)(0x81000000 + 0x5555 * 2)) = 0xaa;
       *((volatile u16 *)(0x81000000 + 0x2AAA * 2)) = 0x55;
       *((volatile u16 *)(0x81000000 + 0x5555 * 2)) = 0xa0;

       *((volatile u16 *)(address)) =* (u16*)( buf + i);
       address += 2;
       Poll_Toggle_Bit();
   }
   return(SUCC);
   
                                                     
  #endif  

} 

/*
+FFTR--------------------------------------------------------------------

$Log: flash_management.c,v $

-FFTR--------------------------------------------------------------------
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -