flash.c 2.72 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;	
}

void STMFLASH_Write(u32 WriteAddr,u32 *pBuffer,u32 NumToWrite)	
{ 
	FLASH_Status status = FLASH_COMPLETE;
	u32 addrx=0;
	u32 endaddr=0;	
	if(WriteAddr%4)
		return;	//非法地址
		
	FLASH_Unlock();									//解锁 
	FLASH_DataCacheCmd(DISABLE);//FLASH擦除期间,必须禁止数据缓存
 		
	addrx  	= WriteAddr;				//写入的起始地址
	endaddr	= WriteAddr + NumToWrite;	//写入的结束地址
	
	if(addrx<0X1FFF0000)			//只有主存储区,才需要执行擦除操作!!
	{
		if(addrx == APP_RUN_ADDR)
		{
			status = FLASH_EraseSector(FLASH_Sector_4,VoltageRange_3);//VCC=2.7~3.6V之间!!
			status = FLASH_EraseSector(FLASH_Sector_5,VoltageRange_3);
		}
		else if (addrx == FLAG_BASE_ADDR)
		{
			status = FLASH_EraseSector(FLASH_Sector_1,VoltageRange_3);
		}
		
	}
	
	if(status==FLASH_COMPLETE)
	{
		while(WriteAddr<endaddr)//写数据
		{
			if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)//写入数据
			{ 
				break;	//写入异常
			}
			WriteAddr+=4;
			pBuffer++;
		} 
	}
	
	FLASH_DataCacheCmd(ENABLE);	//FLASH擦除结束,开启数据缓存
	FLASH_Lock();//上锁
}






#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();
}
#endif