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

📄 flash.cpp

📁 基于ARM 44b0的启动应到程序
💻 CPP
字号:

#include "includes.h"

int CheckBlank(UINT32 addr,UINT32 WordSize) 
{
	UINT32 i,temp;
	for (i=addr;i<(addr+WordSize);i++)
	{
		temp=*((volatile UINT16 *)(BaseFlash+i<<1));
		if(temp!=0xffff)
			return 0;
	}
	return 1;	
}

int WaitForEnd( ) 
{
	int iWait,iResult;//超时计数

	/*iWait = 500000;//超时计数
	while(iWait)//检测FLASH状态,若准备好进行下一步操作则退出循环
	{
		iWait--;
		if((iResult = iGetFlashStatus()) == 0)
		{
			break;
		}
	}*/
	uchar d, t,i;

	// 从任意地址读取数据
	d = *(volatile ushort *)BaseFlash+0x100;
	while(1)
	{
		t = *(volatile ushort *)BaseFlash+0x100;
		if((t&0x40)==(d&0x40))
			break;
		else
			d = t;
	}
	return 0;
}

int iGetFlashStatus()
{
	uchar d, t,i;

	// 从任意地址读取数据
	d = *(volatile ushort *)BaseFlash+0x100;
	i = 10;
	while(i--);
	// 再次读取
	t = *(volatile ushort *)BaseFlash+0x100;
	if (d == t) 
		return 0;

	if ((t & 0x40) != (d & 0x40)) //DQ6
	{
		if (t & 0x20) //DQ5
		{
			return -3;//超时
		}
		else if ((t & 0x04) != (d & 0x04)) //DQ2
		{
			return -1;//忙
		}
		return -2;//挂起
	}
	else if (t & 0x80) // DQ7
	{
		return -2;//挂起
	}
	else
		return -1; //忙
}

int iFlashReset(void)
{
	int iWait;//超时计数

	//写入复位命令
	*((volatile ushort *)(BaseFlash+0x200)) = 0xF0;

	/*iWait = 500000;//超时计数
	while(iWait)//检测FLASH状态,若准备好进行下一步操作则退出循环
	{
		iWait--;
		if(iGetFlashStatus() == 0)
		{
			break;
		}
	}

	//判断是否正确执行操作
	if(iWait > 0)
	{
		//操作正确完成,返回0
		return 0;
	}
	else
	{
		//操作没有正确执行,返回(-1)
		return (-1);
	}*/
	WaitForEnd();
	return 0;
}

int iGetFlashID()
{
	int id;
	
	WriteFlash(0x555,0xAA);
	WriteFlash(0x2AA,0x55);
	WriteFlash(0x555,0x90);
	// 获取ID
	id = ReadFlash(0x01);
	
	return id;	
}

int WriteWord(UINT32 addr,UINT16 dat)
{
	WriteFlash(0x555,0xAA);
	WriteFlash(0x2AA,0x55);
	WriteFlash(0x555,0xA0);
	// 写数据
	WriteFlash(addr,dat);
	if( WaitForEnd() < 0 )
	{
		vUartPrintf("Write Err!\n");
		return -1;
	}
	if( iFlashReset() < 0 )
	{
		vUartPrintf("Write Reset Err!\n");
		return -1;
	}
	return 0;	
}

int  EraseSector(UINT32 addr)
{
	WriteFlash(0x555,0xAA);
	WriteFlash(0x2AA,0x55);
	WriteFlash(0x555,0x80);
	WriteFlash(0x555,0xAA);
	WriteFlash(0x2AA,0x55);
	WriteFlash(addr,0x30);
	if( WaitForEnd() < 0 )
	{
		vUartPrintf("Erase Err!\n");
		return -1;
	}
	//复位
	if( iFlashReset() < 0 )
	{
		vUartPrintf("Erase Reset Err!\n");
		return -1;
	}
	return 0;
		
}

void TestFlash()
{
	int i;
	UINT16 temp;
	
	if( EraseSector(0x0) <0 )
	{
		vUartPrintf("Sector erase Err!\n");
		return;
	}
	vUartPrintf("Sector erase Ok!\n");
    
	for(i=0;i<256;i++)
	{
		if(WriteWord(i,0x55AA) == 0)
	   	{
	   		SLEEP(1);
	   	}
	   	else
	   	{
	   	  	vUartPrintf("adr=%d,Write Error\n",i);
	   	  	return;
	   	}
	}
	vUartPrintf("Write OK! Begin to Verify... \n");   
    for(i=0;i<256;i++)
    {
    	temp = ReadFlash(i);
    	if(temp!= 0x55AA)
    	{
     		vUartPrintf("ADR=%4d,TEMP = %4x Verify Error!\n",i,temp);	      
	       	//break;
	       	return;
	   	}
	}
	 vUartPrintf("Verify OK!\n");

}

⌨️ 快捷键说明

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