📄 复件 flash.c.bak
字号:
// exit criteria
*(FLASH_COMMON_X555) = 0xF0; // reset the flash array (short reset instruction)
OSTimeDly(3); // now delay 3 msec per dat sheet
}
return(done); // a successful flash erase returns 1, timeout error returns 0
}
/*Module: flash_reset
Resets the main Flash memory to Read Array mode.
After this reset, the Flash memory may be read like a ROM device.
You'll need to include the header files generated by PSDsoft
Express. */
/***************************************************************
函数名: flash_reset
功能描述: 复位主flash
参数 :
注意:
**************************************************************/
void flash_reset()reentrant // reset flash, read array mode
{
// Note: the following constants (FLASH_COMMON_XXXX)
// are declared type volatile in the header file
// so they are not optimized away by the compiler
EA = 0;
*(FLASH_COMMON_X555) = 0xAA; // unlock main flash, write 0xAA to addess 0xX555
*(FLASH_COMMON_XAAA) = 0x55; // unlock main flash, write 0x55 to addess 0xXAAA
*(FLASH_COMMON_X555) = 0xF0; // write 0xF0 command to reset
EA = 1;
// Flash memory to Read Array Mode
OSTimeDly(3); // now delay 3 msec per dat sheet
}
/***************************************************************
函数名: flash_erase_sector
功能描述: 擦除主flash的特定扇区
参数 : volatile unsigned char xdata* flash_bulk_erase_address 该地址
位于任何一个flash扇区中
注意: 传入的地址应该和flash存储器的分页关系无关,
否则,在调用该函数前,应给PSD中页寄存器赋正确的值.
要加锁
说明: 返回1成功;返回0 擦除失败,超时错误.
不加锁
**************************************************************/
unsigned char flash_erase_sector(
volatile unsigned char xdata * sector_erase_address)reentrant
{
char done;
unsigned char poll;
unsigned char error;
unsigned char err;
WDRST = 0x00; //清零看门狗
done = FALSE;
EA = 0;
*(FLASH_COMMON_X555) = 0xAA; // unlock main flash, write 0xAA to addess 0xX555
*(FLASH_COMMON_XAAA) = 0x55; // unlock main flash, write 0x55 to addess 0xXAAA
*(FLASH_COMMON_X555) = 0x80; // write 0x80 command
*(FLASH_COMMON_X555) = 0xAA; // continue unlock sequence
*(FLASH_COMMON_XAAA) = 0x55; // continue unlock sequence
*(sector_erase_address) = 0x30; // write 0x30 command to indicate sector erase command
EA = 1;
do // now use data polling method to verify successful erase
{
poll = *(sector_erase_address); // read flash status from any address
// within the flash address sector space
error = poll & NVM_ERROR; // save timeout error bit at DQ5
poll = poll & NVM_DATA_POLL; // look at D7
if (poll == NVM_DATA_POLL) // compare DQ7
done = TRUE; // erase OK,
// indicate successful exit criteria
else if (error == NVM_ERROR) // check for timeout error
err = TRUE; // indicate timeout error occurred
} while((done == FALSE) && (error == FALSE));
if (err == TRUE) // make sure timeout error and data poll didn't
// occur simultaneously
{
poll = *(sector_erase_address); // Read flash status again
poll = poll & NVM_DATA_POLL; // get DQ7 of poll byte read from flash
if (poll == NVM_DATA_POLL) // compare DQ7
done = TRUE; // the flash erased OK at the same
// time timout error occured, indicate successful
*(FLASH_COMMON_X555) = 0xF0; // reset the flash array (short reset instruction)
OSTimeDly(3);
} // exit criteria
return(done); // a successful flash erase returns 1, timeout error returns 0
}
/***************************************************************
函数名: flash_erase_the_sector
功能描述: 擦除主flash的给定的某个扇区扇区
参数 : unsigned char sector 取值为 0~7
注意: 要擦除某个扇区时给出扇区号既可
**************************************************************/
unsigned char flash_erase_the_sector(unsigned char sector)reentrant
{
switch(sector) //选择扇区 0~~7
{
case 0 :PSD8xx_reg.PAGE = SECTOR_0;
break;
case 1 :PSD8xx_reg.PAGE = SECTOR_1;
break;
case 2 :PSD8xx_reg.PAGE = SECTOR_2;
break;
case 3 :PSD8xx_reg.PAGE = SECTOR_3;
break;
case 4 :PSD8xx_reg.PAGE = SECTOR_4;
break;
case 5 :PSD8xx_reg.PAGE = SECTOR_5;
break;
case 6 :PSD8xx_reg.PAGE = SECTOR_6;
break;
case 7 :PSD8xx_reg.PAGE = SECTOR_7;
break;
default :
return (0); //越界
break;
}
flash_erase_sector(SECTOR_BASE_ADDRESS);
}
/***************************************************************
函数名: flash_read_id
功能描述: 读主flash标识
参数 :
注意: 传入的地址应该和flash存储器的分页关系无关,
否则,在调用该函数前,应给PSD中页寄存器赋正确的值.
**************************************************************/
unsigned char flash_read_id(volatile unsigned char *flash_id_address)reentrant // read flash identifier
{
unsigned char id;
EA = 0;
*(FLASH_COMMON_X555) = 0xAA; // unlock main flash, write 0xAA to addess 0xX555
*(FLASH_COMMON_XAAA) = 0x55; // unlock main flash, write 0x55 to addess 0xXAAA
*(FLASH_COMMON_X555) = 0x90; // write 0x90 command to get ID
EA = 1;
id = *(flash_id_address); // read flash status, address bit A6 = 0
// A1 = 0
// A0 = 1
*(FLASH_COMMON_X555) = 0xF0; // reset the flash array (short reset instruction)
OSTimeDly(3); // now delay 3 msec per dat sheet
return (id); // return byte ID value
}
/******************************数据转移处理***************************/
void Move (unsigned char *src, unsigned char *dest, int len) reentrant
{
if ( len <= 0 ) return;
if ( src < dest ) {
src += len;
dest += len;
do {
*--dest = *--src;
} while ( --len > 0 );
} else
do {
*dest++ = *src++;
} while ( --len > 0 );
}
/***************************************************************
函数名: Move_from_flash
功能描述: 读取flash中指定长度的数据
参数 : src 源地址,指向flash中数据;dest 目的地址,指向接受数据缓冲区.
注意: 传入的src地址应该和flash存储器的分页关系无关,
否则,在调用该函数前,应给PSD中页寄存器赋正确的值.
**************************************************************/
void Move_from_flash (unsigned char *src, unsigned char *dest, int len)reentrant
{
Move(src, dest, len);
}
/***************************************************************
函数名: Move_to_flash
功能描述: 写flash
参数 : src 源地址,指向数据缓冲区;dest 目的地址,指向flash.
注意: 传入的dest地址应该和flash存储器的分页关系无关,
否则,在调用该函数前,应给PSD中页寄存器赋正确的值.
成功返回1,失败返回0
**************************************************************/
unsigned char Move_to_flash (unsigned char *src, unsigned char *dest, int len)reentrant
{
// unsigned char xdata *temp;
// unsigned char dat;
// temp = dest;
WDRST = 0x00; //清零看门狗
if ( len <= 0 ) return (0);
if ( src < dest ) {
src += len;
dest += len;
do {
// --dest ;
// dat = *--src;
// *--temp = *--src;
// if(!(flash_write_with_poll(dest,dat))) return (0);
if(!(flash_write_with_poll(dest,*src))) return (0);
--dest;
--src;
} while ( --len > 0 );
} else
do {
// dest++;
// dat = *src++;
// if(!(flash_write_with_poll(dest,dat))) return (0);
if(!(flash_write_with_poll(dest,*src))) return (0);
dest++;
src++;
} while ( --len > 0 );
return (1);
}
/******************************/
void FlashLock(void)
{
while(MemLock == USED)
{
OSTimeDly(WAITFORFLASH); //延时多长时间??
}
MemLock = USED;
}
/********************************/
/******************************/
void FlashUnLock(void)
{
MemLock = UNUSED;
}
/*******************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -