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

📄 flash.c

📁 VxWorks BSP for S3C2510A
💻 C
字号:
#define FLASH_BASE		0x80000000
#define FLASH_TOP		0x80400000

int SetIODir(unsigned long Px, unsigned long dir);
unsigned long ReadIO(unsigned long Px);
int WriteIO(unsigned long Px, unsigned long data);
void WriteFlash(unsigned long lAddress, unsigned short data);
void EraseUserFlash( unsigned long lAddress );
/******************************************************************
 * 函数功能:设置IO接口方向
 * 输入参数:Px-IO接口编号;
 *           dir-方向,0表示输出,1表示输入
 * 输    出:0-成功;非零-出错
 *
 *****************************************************************/
int SetIODir(unsigned long Px, unsigned long dir)
{  
	if(dir)
	{
		if((Px>=0)&&(Px<32))
			*(unsigned long *)(0xF0030000) |= 1<<Px;
		else if((Px>=32)&&(Px<64))
			*(unsigned long *)(0xF0030004) |= 1<<(Px-32);
		else
		    return (-1);
	}
	else
	{
		if((Px>=0)&&(Px<32))
			*(unsigned long *)(0xF0030000) &= ~(1<<Px);
		else if((Px>=32)&&(Px<64))
			*(unsigned long *)(0xF0030004) &= ~(1<<(Px-32));
		else 
			return (-1);
	}
	
	return 0;
	
}
/******************************************************************
 * 函数功能:读IO接口值
 * 输入参数:Px-IO接口编号; 
 * 输    出:IO接口值
 *
 *****************************************************************/
unsigned long ReadIO(unsigned long Px)
{
	if((Px>=0)&&(Px<32))
		return ((*(unsigned long *)(0xF003001C))&(1<<Px));
	else if((Px>=32)&&(Px<64))
		return ((*(unsigned long *)(0xF0030020))&(1<<(Px-32)));
	else 
		return (-1);
}

/******************************************************************
 * 函数功能:设置IO接口值
 * 输入参数:Px-IO接口编号;
 *           data-IO接口值(0或1)   
 * 输    出:0-成功;非零-出错
 *
 *****************************************************************/
int WriteIO(unsigned long Px, unsigned long data)
{
    if(data)
    {
		if((Px>=0)&&(Px<32))
		*(unsigned long *)(0xF003001C) |= data<<Px;
		else if((Px>=32)&&(Px<64))
		*(unsigned long *)(0xF0030020) |= data<<(Px-32);
	    else 
		return (-1);
	}		
	else
    {
		if((Px>=0)&&(Px<32))
		*(unsigned long *)(0xF003001C) &=~(1<<Px);
		else if((Px>=32)&&(Px<64))
		*(unsigned long *)(0xF0030020) &=~(1<<(Px-32));
	    else 
		return (-1);
	} 
	return 0;
}

void WriteFlash(unsigned long lAddress, unsigned short data)
{
    int j;
    
	if ( (lAddress<FLASH_BASE) || (lAddress>FLASH_TOP) )
		return;
	
    /* Word Program */
	*(unsigned short *)( FLASH_BASE + (0x5555<<1) ) = 0x00AA; /* equals flash address 0x5555 */
    *(unsigned short *)( FLASH_BASE + (0x2AAA<<1) ) = 0x0055; /* equals flash address 0x2AAA */
    *(unsigned short *)( FLASH_BASE + (0x5555<<1) ) = 0x00A0; /* equals flash address 0x5555 */
	*(unsigned short *)(lAddress) = data;
    /* DQ7 != true value */
	DelayUs(20);
}

void EraseUserFlash( unsigned long lAddress )  
{
	int i;

	if ( (lAddress<FLASH_BASE) || (lAddress>FLASH_TOP) )
		return;

	/*printf( "Erase Flash sector = 0x%X\n", lAddress );*/
	*(unsigned short *)( FLASH_BASE + (0x5555<<1) ) = 0x00AA;
	*(unsigned short *)( FLASH_BASE + (0x2AAA<<1) ) = 0x0055;
	*(unsigned short *)( FLASH_BASE + (0x5555<<1) ) = 0x0080;
	*(unsigned short *)( FLASH_BASE + (0x5555<<1) ) = 0x00AA;
	*(unsigned short *)( FLASH_BASE + (0x2AAA<<1) ) = 0x0055;
	*(unsigned short *)( lAddress )                  = 0x0030;
	DelayMs(25);
}    

⌨️ 快捷键说明

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