📄 flash.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 + -