flash.c 5.41 KB
#include "flash.h"

u32 STMFLASH_ReadWord(u32 faddr)
{
	return *(vu32*)faddr; 
} 
uint16_t STMFLASH_GetFlashSector(u32 addr)
{
	if(addr<ADDR_FLASH_SECTOR_1)return FLASH_Sector_0;
	else if(addr<ADDR_FLASH_SECTOR_2)return FLASH_Sector_1;
	else if(addr<ADDR_FLASH_SECTOR_3)return FLASH_Sector_2;
	else if(addr<ADDR_FLASH_SECTOR_4)return FLASH_Sector_3;
	else if(addr<ADDR_FLASH_SECTOR_5)return FLASH_Sector_4;
	else if(addr<ADDR_FLASH_SECTOR_6)return FLASH_Sector_5;
	else if(addr<ADDR_FLASH_SECTOR_7)return FLASH_Sector_6;
	else if(addr<ADDR_FLASH_SECTOR_8)return FLASH_Sector_7;
	else if(addr<ADDR_FLASH_SECTOR_9)return FLASH_Sector_8;
	else if(addr<ADDR_FLASH_SECTOR_10)return FLASH_Sector_9;
	else if(addr<ADDR_FLASH_SECTOR_11)return FLASH_Sector_10; 
	return FLASH_Sector_11;	
}


uint32_t STM_FLASH_Erase(uint32_t addrx)
{
							
	FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
	FLASH_Unlock();				//解锁 		
	uint8_t ret = 1;
	switch(addrx)
	{
		case APP_RUN_ADDR:
		{
			if(FLASH_COMPLETE != FLASH_EraseSector(FLASH_Sector_4,VoltageRange_3))//VCC=2.7~3.6V之间!!
			{
				ret = 0;
				break;
			}
			if(FLASH_COMPLETE != FLASH_EraseSector(FLASH_Sector_5,VoltageRange_3))//VCC=2.7~3.6V之间!!
			{
				ret = 0;
				break;
			}	
			if(FLASH_COMPLETE != FLASH_EraseSector(FLASH_Sector_6,VoltageRange_3))//VCC=2.7~3.6V之间!!
			{
				ret = 0;
				break;
			}	
			if(FLASH_COMPLETE != FLASH_EraseSector(FLASH_Sector_7,VoltageRange_3))//VCC=2.7~3.6V之间!!
			{
				ret = 0;
				break;
			}				
		}
		break;		
		case FLAG_BASE_ADDR:
		{
			if(FLASH_COMPLETE != FLASH_EraseSector(FLASH_Sector_1,VoltageRange_3))//VCC=2.7~3.6V之间!!
			{
				ret = 0;
				break;
			}			
		}
		break;		
		case PARAM_BASE_ADDR:
		{
			if(FLASH_COMPLETE != FLASH_EraseSector(FLASH_Sector_2,VoltageRange_3))//VCC=2.7~3.6V之间!!
			{
				ret = 0;
				break;
			}			
		}
		break;		
		case APP_LOAD_ADDR:
		{
			if(FLASH_COMPLETE != FLASH_EraseSector(FLASH_Sector_8,VoltageRange_3))//VCC=2.7~3.6V之间!!
			{
				ret = 0;
				break;
			}		
			if(FLASH_COMPLETE != FLASH_EraseSector(FLASH_Sector_9,VoltageRange_3))//VCC=2.7~3.6V之间!!
			{			
				ret = 0;
				break;
			}
			if(FLASH_COMPLETE != FLASH_EraseSector(FLASH_Sector_10,VoltageRange_3))//VCC=2.7~3.6V之间!!
			{			
				ret = 0;
				break;
			}
			if(FLASH_COMPLETE != FLASH_EraseSector(FLASH_Sector_11,VoltageRange_3))//VCC=2.7~3.6V之间!!
			{			
				ret = 0;
				break;
			}			
		}
		break;
		default:break;
	}
	FLASH_Lock();		
	FLASH_DataCacheCmd(ENABLE);//FLASH擦除期间,必须禁止数据缓存		
	return ret;
}

uint32_t STM_FLASH_Get_Block_Size(uint32_t addrx)
{
	switch(addrx)
	{
		case APP_RUN_ADDR:
			return (384+64)*1024;	
		case FLAG_BASE_ADDR:
		case PARAM_BASE_ADDR:	
			return 16*1024;		
		case APP_LOAD_ADDR:
			return (384+128)*1024;		
		default:break;
	}
	return 0;
}

//FlashAddress: start address for writing data buffer
//Data: pointer on data buffer
//DataLength: length of data buffer (unit is 32-bit word)   
//return:
//      0=Data successfully written to Flash memory
//      1=Error occurred while writing data in Flash memory
uint32_t STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)	
{
	u32 endaddr=0;	
	if(WriteAddr%4)
		return 1 ;	//非法地址
	endaddr	= WriteAddr + NumToWrite;	//写入的结束地址	
	
	FLASH_Unlock();									//解锁 
	FLASH_DataCacheCmd(ENABLE);//FLASH擦除期间,必须禁止数据缓存
 		

	while(WriteAddr<endaddr)//写数据
	{
		if (FLASH_ProgramWord(WriteAddr, *pBuffer) == FLASH_COMPLETE)
		{
		/* Check the written value */
			if (STMFLASH_ReadWord(WriteAddr) != *pBuffer)
			{
			/* Flash content doesn't match SRAM content */			
//				FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
				FLASH_Lock();//上锁		
				return 1;
			}
			/* Increment FLASH destination address */
			WriteAddr+=4;
			pBuffer++;
		}
		else
		{
//			FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
			FLASH_Lock();//上锁			
			return 1;
		}
	}
//	FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();//上锁		
  return 0;
}
#define Tracy 0
#if Tracy
void flash_write(u32 addr,u16 data)
{
	FLASH_Unlock();
	FLASH_ProgramHalfWord(addr,data);
	FLASH_Lock();
}

void flash_write_string(u32 addr,u16* buff,u16 length)
{
	char i=0;
	FLASH_Unlock();
	if(length%2==0)
		length/=2;
	else
		length=length/2+1;
	for(i=0;i<length;i++)
	{
		FLASH_ProgramHalfWord(addr,buff[i]);
		addr+=2;
	}
	FLASH_Lock();
}


u16 flash_read(u32 addr)
{
	return *(u16 *)(addr);
}


u16 flash_read_halfword(u32 addr)
{
	return *(vu16*)addr; 
}

void flash_read_string(u32 addr,u16 *rbuff,u16 length)
{
	int i;
	if(length%2==0)
		length/=2;
	else
		length=length/2+1;
	for(i=0;i<length;i++)
	{
		rbuff[i]=flash_read_halfword(addr);
		addr+=2;
	}
}

void flash_erase(u32 addrx)
{
	FLASH_Unlock();
	FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
	FLASH_EraseSector(STMFLASH_GetFlashSector(addrx),VoltageRange_3);//VCC=2.7~3.6V之间!!
	FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();
}

uint32_t STM_FLASH_Erase(uint32_t StartSector)
{
  uint32_t UserStartSector = FLASH_Sector_1, i = 0;

  /* Get the sector where start the user flash area */
  UserStartSector = STMFLASH_GetFlashSector(StartSector);

  for(i = UserStartSector; i <= FLASH_Sector_5; i += 8)
  {
    /* Device voltage range supposed to be [2.7V to 3.6V], the operation will
       be done by word */ 
    if (FLASH_EraseSector(i, VoltageRange_3) != FLASH_COMPLETE)
    {
      /* Error occurred while page erase */
      return (1);
    }
  }
  
  return (0);
}

#endif