亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? eeprom.c

?? uPSD3200系列MCU的EEPROM的仿真實例
?? C
?? 第 1 頁 / 共 3 頁
字號:
		
	} while ( record.status == SUPERSEDED );

	last_address = address - (WORD)sizeof(record);

	// get next available address
	new_address = Find_Next_Address();
	if( new_address == SECTOR_FULL ) return SECTOR_FULL; // abort if sector is full

	// set old record to update in progress
	address = last_address;
	for ( i=0; i<sizeof(record); i++ )
	{
		ptr[i] = Boot_Flash_Read( address++ );
	}
	record.status = UPDATE_DATA;
	address = last_address;
	for ( i=0; i < sizeof(record); i++ )
	{
		if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
	}

	// write data to new address
	address = new_address;
	record.status = VALID_DATA;
	record.last_record_update = 0xFFFF;
	for ( i=0; i < EEPROM_RECORD_SIZE; i++ )
	{
		record.record_data[i] = data_buf[i];	// set data byte
	}
	address = new_address;
	for ( i=0; i < sizeof(record); i++ )
	{
		if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
	}

	// update old record to superseded
	address = last_address;
	for ( i=0; i<sizeof(record); i++ )
	{
		ptr[i] = Boot_Flash_Read( address++ );
	}
	record.status = SUPERSEDED;
	record.last_record_update = new_address;
	address = last_address;
	for ( i=0; i < sizeof(record); i++ )
	{
		if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
	}

	return 0;
}

/***** Boot_Flash_Write *****/
// Writes data byte to secondary flash.
// Accepts address in flash; data (byte).
// Returns 0 for successful write. If error, returns 1. 
BYTE Boot_Flash_Write(WORD address, BYTE data_byte)
{
	BYTE xdata readback;
	BYTE xdata done;
	BYTE xdata error;
	BYTE xdata err;
	BYTE xdata poll;
	BYTE xdata erase_flag_0 = 0;
	BYTE xdata erase_flag_1 = 0;
	static BYTE reentry_flag;

	// check for re-entrant call to this function
	if ( reentry_flag ) return FLASH_ACCESS_ERROR;

	reentry_flag = 1;

	// un-comment for re-entrancy test
	//EA = 1;		/* enable interrupts */

	done = FALSE;
   	err = FALSE;

	// suspend any erase in progress		
	if ( Eeprom_Sector_Erase_Status(SECTOR_0) )
    {
		if ( Eeprom_Sector_Erase_Suspend(SECTOR_0) ) return SECTOR_ERASE_ERROR;
		erase_flag_0 = 1;
	}
	if ( Eeprom_Sector_Erase_Status(SECTOR_1) )
    {
		if ( Eeprom_Sector_Erase_Suspend(SECTOR_1) ) return SECTOR_ERASE_ERROR;
		erase_flag_1 = 1;
	}

	// disable interrupts during flash write sequence
	EA = 0;

	// write data byte
	*((char xdata *) (SECTOR_0_BASE_ADDRESS + 0x0555)) = 0xAA;
	*((char xdata *) (SECTOR_0_BASE_ADDRESS + 0x0AAA)) = 0x55;
	*((char xdata *) (SECTOR_0_BASE_ADDRESS + 0x0555)) = 0xA0;
	*((char xdata *) address) = data_byte;

	// enable interrupts following write
	EA = 1;

	// now use dat polling method to verify successful write
	do
    {  
   		poll = *((char xdata *) address);	// Read the location that was just programmed
		error = poll & NVM_ERROR;		// save timeout error bit at DQ5
		poll = poll & NVM_DATA_POLL;	// get DQ7 of poll byte read from flash  

		if ((data_byte & NVM_DATA_POLL) == poll)	// compare DQ7 
			done = TRUE;		// dat byte programmed into flash OK, indicate successful exit criteria
		else if (error == NVM_ERROR)	// check for timeout error   
			err = TRUE;					// indicate timeout error occurred

    } while((done == FALSE) && (err == FALSE));

	// make sure timeout error and dat poll didn't occur simultaneously
	if (err == TRUE)                
	{
   		poll = *((char xdata *) address);	// Read location in flash again
		poll = poll & NVM_DATA_POLL;   				// get DQ7 of poll byte read from flash  

		if ((data_byte & NVM_DATA_POLL) == poll)	// compare DQ7 
			done = TRUE;	// dat byte programmed into flash OK at the same time timout 
							//error occured, indicate successful exit criteria

		*((char xdata *) (SECTOR_0_BASE_ADDRESS + 0x0555)) = 0xF0;
		//*((char xdata *) 0x0555) = 0xF0;	// reset the flash array (short reset instruction) 
	}	        							// now delay 3 msec per dat sheet

	// verify successful write by reading back data and comparing with original	
	readback = *((char xdata *) address);	// readback data from flash

	// resume any suspended erase
	if ( erase_flag_0 )
	{
		if ( Eeprom_Sector_Erase_Resume(SECTOR_0) ) return SECTOR_ERASE_ERROR;
	}
	if ( erase_flag_1 )
	{
		if ( Eeprom_Sector_Erase_Resume(SECTOR_1) ) return SECTOR_ERASE_ERROR;
	}

	reentry_flag = 0;

	return !(readback == data_byte);	// if valid return success
}

/***** Read_Record_Data_Structure *****/
// Reads an entire record structure from memory.
// Accepts record id number.
// Returns address of last record. If error, returns error message.
WORD Read_Record_Data_Structure(WORD id_number, BYTE* buffer)
{
	BYTE xdata valid_sector = 0xFF;
	xdata struct sector_header xdata header;
	xdata struct record_entry xdata record;
	BYTE i;
	BYTE *ptr;
	BYTE xdata *data_buf;
	WORD address;
	WORD xdata base_address;
	WORD xdata last_address;

	// get active sector
	valid_sector = Find_Active_Sector(F_READ);
	if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;

	// get pointer to data
	data_buf = buffer;

	// calculate base address of data
	base_address = 	SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE) + 
					(WORD)sizeof(header) + ( id_number * (WORD)sizeof(record) );

	// get base record
	ptr = (BYTE*) (&record);
	address = base_address;
	for ( i=0; i<sizeof(record); i++ )
	{
		ptr[i] = Boot_Flash_Read( address++ );
	}

	// get last record
	if ( record.last_record_update != 0xFFFF )
	{
		address = base_address;
		do	
		{
			ptr = (BYTE*) (&record);
			last_address = address;
			for ( i=0; i<sizeof(record); i++ )
			{
				ptr[i] = Boot_Flash_Read( address++ );
			}
			address = record.last_record_update;
		} while ( record.last_record_update != 0xFFFF );
	 }
	 else
	 {
	 	last_address = base_address;
	 }

	// Get last record
	for (i=0; i<sizeof(record); i++)
	{
		data_buf[i] = Boot_Flash_Read(last_address++);
	}

	// return address of last record
	return last_address - sizeof(record);
}

/***** Boot_Flash_Read *****/
// Reads data from secondary flash.
// Accepts address.
// Returns data at address. 
BYTE Boot_Flash_Read(WORD address)
{	
	BYTE xdata erase_flag_0 = 0;
	BYTE xdata erase_flag_1 = 0;
	BYTE data_byte;
	static BYTE xdata reentry_flag;

	// check for re-entrant call to this function
	if ( reentry_flag ) return FLASH_ACCESS_ERROR;

	reentry_flag = 1;

	// un-comment for re-entrancy test
	//EA = 1;		/* enable interrupts */

	// suspend any erase in progress		
	if ( Eeprom_Sector_Erase_Status(SECTOR_0) )
    {
		if ( Eeprom_Sector_Erase_Suspend(SECTOR_0) ) return SECTOR_ERASE_ERROR;
		erase_flag_0 = 1;
	}
	if ( Eeprom_Sector_Erase_Status(SECTOR_1) )
    {
		if ( Eeprom_Sector_Erase_Suspend(SECTOR_1) ) return SECTOR_ERASE_ERROR;
		erase_flag_1 = 1;
	}

	// read data byte from flash
	data_byte = *((char xdata *) address);

	// resume any suspended erase
	if ( erase_flag_0 )
	{
		if ( Eeprom_Sector_Erase_Resume(SECTOR_0) ) return SECTOR_ERASE_ERROR;
	}
	if ( erase_flag_1 )
	{
		if ( Eeprom_Sector_Erase_Resume(SECTOR_1) ) return SECTOR_ERASE_ERROR;
	}

	reentry_flag = 0;

	return data_byte;
}

/***** Eeprom_Sector_Erase *****/
// Erases one boot flash sector.
// Accepts sector number (0-3).
// Returns 0 for successful erasure. If error, returns 1. 
BYTE Eeprom_Sector_Erase(BYTE sector)
{
	BYTE xdata done;
 	BYTE xdata poll;
 	BYTE xdata error;
 	BYTE xdata err;

	done = FALSE;
   	err = FALSE;

	switch (sector)
	{
	case SECTOR_0:
		*(BOOT_FLASH_SECTOR_0_X555) = 0xAA;		// unlock main flash, write 0xAA to addess 0xX555
		*(BOOT_FLASH_SECTOR_0_XAAA) = 0x55;		// unlock main flash, write 0x55 to addess 0xXAAA
		*(BOOT_FLASH_SECTOR_0_X555) = 0x80;		// write 0x80 command to erase entire chip
		*(BOOT_FLASH_SECTOR_0_X555) = 0xAA;     // continue unlock sequence
		*(BOOT_FLASH_SECTOR_0_XAAA) = 0x55;		// continue unlock sequence
		*((volatile unsigned char xdata *)SECTOR_0_BASE_ADDRESS) = 0x30;// erase sector
		do		  			// now use dat polling method to verify successful erase
    	{  
			poll = *((volatile unsigned char xdata *)SECTOR_0_BASE_ADDRESS); 	// read flash status from any address
			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;		// bulk erase OK,
			else if (error == NVM_ERROR)	// check for timeout error   
				err = TRUE;		// indicate timeout error occurred
    	} while( (done == FALSE) && (err == FALSE) ); 
		if ( err == TRUE )			// make sure timeout error and dat poll didn't occur simultaneously
    	{
			poll = *((volatile unsigned char xdata *)SECTOR_0_BASE_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
			*(BOOT_FLASH_SECTOR_0_X555) = 0xF0;  // reset the flash array (short reset instruction) 
    	}
		break;
	case SECTOR_1:
		*(BOOT_FLASH_SECTOR_1_X555) = 0xAA;		// unlock main flash, write 0xAA to addess 0xX555
		*(BOOT_FLASH_SECTOR_1_XAAA) = 0x55;		// unlock main flash, write 0x55 to addess 0xXAAA
		*(BOOT_FLASH_SECTOR_1_X555) = 0x80;		// write 0x80 command to erase entire chip
		*(BOOT_FLASH_SECTOR_1_X555) = 0xAA;     // continue unlock sequence
		*(BOOT_FLASH_SECTOR_1_XAAA) = 0x55;		// continue unlock sequence
		*((volatile unsigned char xdata *)SECTOR_1_BASE_ADDRESS) = 0x30;// erase sector
		do		  			// now use dat polling method to verify successful erase
    	{  
			poll = *((volatile unsigned char xdata *)SECTOR_1_BASE_ADDRESS); 	// read flash status from any address
			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;		// bulk erase OK,
			else if (error == NVM_ERROR)	// check for timeout error   
				err = TRUE;		// indicate timeout error occurred
    	} while( (done == FALSE) && (err == FALSE) ); 
		if ( err == TRUE )			// make sure timeout error and dat poll didn't occur simultaneously
    	{
			poll = *((volatile unsigned char xdata *)SECTOR_1_BASE_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
			*(BOOT_FLASH_SECTOR_0_X555) = 0xF0;  // reset the flash array (short reset instruction) 
    	}
		break;
	case SECTOR_2:
		*(BOOT_FLASH_SECTOR_2_X555) = 0xAA;		// unlock main flash, write 0xAA to addess 0xX555
		*(BOOT_FLASH_SECTOR_2_XAAA) = 0x55;		// unlock main flash, write 0x55 to addess 0xXAAA
		*(BOOT_FLASH_SECTOR_2_X555) = 0x80;		// write 0x80 command to erase entire chip
		*(BOOT_FLASH_SECTOR_2_X555) = 0xAA;     // continue unlock sequence
		*(BOOT_FLASH_SECTOR_2_XAAA) = 0x55;		// continue unlock sequence
		*((volatile unsigned char xdata *)SECTOR_2_BASE_ADDRESS) = 0x30;// erase sector
		do		  			// now use dat polling method to verify successful erase
    	{  
			poll = *((volatile unsigned char xdata *)SECTOR_2_BASE_ADDRESS); 	// read flash status from any address
			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;		// bulk erase OK,
			else if (error == NVM_ERROR)	// check for timeout error   
				err = TRUE;		// indicate timeout error occurred
    	} while( (done == FALSE) && (err == FALSE) ); 
		if ( err == TRUE )			// make sure timeout error and dat poll didn't occur simultaneously
    	{
			poll = *((volatile unsigned char xdata *)SECTOR_2_BASE_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
			*(BOOT_FLASH_SECTOR_0_X555) = 0xF0;  // reset the flash array (short reset instruction) 
    	}
		break;
	case SECTOR_3:
		*(BOOT_FLASH_SECTOR_3_X555) = 0xAA;		// unlock main flash, write 0xAA to addess 0xX555
		*(BOOT_FLASH_SECTOR_3_XAAA) = 0x55;		// unlock main flash, write 0x55 to addess 0xXAAA
		*(BOOT_FLASH_SECTOR_3_X555) = 0x80;		// write 0x80 command to erase entire chip
		*(BOOT_FLASH_SECTOR_3_X555) = 0xAA;     // continue unlock sequence
		*(BOOT_FLASH_SECTOR_3_XAAA) = 0x55;		// continue unlock sequence
		*((volatile unsigned char xdata *)SECTOR_3_BASE_ADDRESS) = 0x30;// erase sector
		do		  			// now use dat polling method to verify successful erase
    	{  
			poll = *((volatile unsigned char xdata *)SECTOR_3_BASE_ADDRESS); 	// read flash status from any address
			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;		// bulk erase OK,
			else if (error == NVM_ERROR)	// check for timeout error   
				err = TRUE;		// indicate timeout error occurred
    	} while( (done == FALSE) && (err == FALSE) ); 
		if ( err == TRUE )			// make sure timeout error and dat poll didn't occur simultaneously
    	{
			poll = *((volatile unsigned char xdata *)SECTOR_3_BASE_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
			*(BOOT_FLASH_SECTOR_0_X555) = 0xF0;  // reset the flash array (short reset instruction) 
    	}
		break;
	default:
		return 1;
	}

   	return !(done);	
}

/***** Eeprom_Sector_Erase_Start*****/
// Start Erases one boot flash sector.
// Accepts sector number (0-3).
// Returns 0 for successful erasure. If error, returns 1. 
BYTE Eeprom_Sector_Erase_Start(BYTE sector)
{
	switch (sector)
	{
	case SECTOR_0:
		*(BOOT_FLASH_SECTOR_0_X555) = 0xAA;		// unlock main flash, write 0xAA to addess 0xX555

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
看片的网站亚洲| 日韩三级免费观看| 国产69精品久久99不卡| 激情欧美日韩一区二区| 六月丁香婷婷久久| 国内精品伊人久久久久av一坑| 久久国产精品色| 国产一区欧美日韩| 日本久久电影网| 91亚洲资源网| 欧美在线视频你懂得| 91精品久久久久久久91蜜桃| 欧美精品vⅰdeose4hd| 日韩午夜在线播放| 精品久久久久99| 欧美国产一区二区| 亚洲精品写真福利| 日韩av中文字幕一区二区三区| 经典三级视频一区| eeuss鲁一区二区三区| 欧美性感一区二区三区| 日韩视频免费直播| 国产欧美日韩三级| 亚洲香肠在线观看| 国产精品羞羞答答xxdd| 色综合色狠狠综合色| 91精品国产麻豆| 国产精品国产三级国产aⅴ入口 | 91在线观看下载| 欧美午夜精品久久久| 欧美大胆人体bbbb| 国产日韩欧美精品综合| 亚洲第一福利视频在线| 久久99在线观看| 色94色欧美sute亚洲线路二 | 欧美精品一二三四| 久久欧美一区二区| 亚洲一区二区三区中文字幕在线 | 夜夜嗨av一区二区三区四季av| 日本不卡一二三| 色中色一区二区| 精品sm在线观看| 亚洲午夜私人影院| 91在线观看免费视频| 91精品福利在线一区二区三区| 中文字幕一区免费在线观看| 免费精品视频在线| 在线免费视频一区二区| 国产精品丝袜久久久久久app| 日韩二区三区在线观看| 色婷婷综合久久久久中文一区二区 | 欧美日韩国产一二三| 国产精品欧美一区二区三区| 国产中文一区二区三区| 欧美三级电影一区| 国产精品成人网| 国产激情视频一区二区在线观看| 日韩欧美你懂的| 亚洲二区在线视频| 欧美亚洲一区二区在线观看| 国产精品网站在线观看| 九九视频精品免费| 日韩精品中文字幕在线一区| 日韩成人免费电影| 欧美日韩综合在线| 亚洲一区成人在线| 色综合久久88色综合天天免费| 国产精品免费久久久久| 成人一级视频在线观看| 久久久国产午夜精品| 国产一区二区三区四区五区美女 | 精品在线视频一区| 91精品国产91久久久久久一区二区 | 亚洲风情在线资源站| 在线观看亚洲成人| 亚洲乱码国产乱码精品精98午夜| 成人a免费在线看| 国产精品国产三级国产普通话蜜臀 | 国产精品素人视频| 99久久精品免费| 亚洲日本在线天堂| 欧洲激情一区二区| 日韩电影免费一区| 日韩视频一区二区在线观看| 另类小说一区二区三区| 2023国产精品自拍| 粉嫩高潮美女一区二区三区| 国产亚洲婷婷免费| 成人av电影免费观看| 一区二区在线看| 制服丝袜成人动漫| 韩国精品免费视频| 18成人在线视频| 欧美午夜一区二区三区 | 国产精品久久免费看| 91免费看`日韩一区二区| 一区二区免费看| 日韩一区二区精品在线观看| 国产精品综合久久| 国产精品欧美精品| 欧美在线免费观看亚洲| 免费在线观看不卡| 中文字幕在线观看一区二区| 欧美在线一区二区| 韩国欧美国产1区| 亚洲美女在线国产| 欧美一区二区三区免费| 国产成人av一区二区三区在线观看| 中文字幕一区在线观看视频| 91精品国产91久久久久久最新毛片 | 日本伊人午夜精品| 国产精品素人视频| 日韩一区二区三区视频在线观看| 国产精品 欧美精品| 亚洲高清久久久| 国产欧美日韩亚州综合| 欧美人与禽zozo性伦| 国产精品一区专区| 偷拍亚洲欧洲综合| 国产精品久久久久久久久图文区 | 中文av一区二区| 制服丝袜亚洲网站| 91亚洲资源网| 丁香婷婷深情五月亚洲| 日本系列欧美系列| 亚洲日本在线a| 久久久久久麻豆| 欧美久久免费观看| 一本一本大道香蕉久在线精品 | 色就色 综合激情| 大桥未久av一区二区三区中文| 欧美a一区二区| 午夜电影久久久| 一区二区三区在线观看网站| 337p日本欧洲亚洲大胆精品 | 国产成人午夜精品影院观看视频 | 人人超碰91尤物精品国产| 亚洲线精品一区二区三区| 中文字幕亚洲在| 中文久久乱码一区二区| 国产亚洲欧美色| 26uuu国产电影一区二区| 91精品国产91综合久久蜜臀| 欧美日韩国产高清一区二区| 欧洲亚洲精品在线| av不卡在线播放| av亚洲精华国产精华精| 成人福利电影精品一区二区在线观看| 久久成人av少妇免费| 免费久久99精品国产| 另类小说色综合网站| 精品一区二区三区免费播放| 秋霞av亚洲一区二区三| 亚洲成av人在线观看| 亚洲bt欧美bt精品777| 亚洲午夜一区二区| 日韩精品视频网站| 人妖欧美一区二区| 久久99精品视频| 国产91丝袜在线播放0| 国产69精品久久久久毛片| youjizz国产精品| 色猫猫国产区一区二在线视频| 在线观看中文字幕不卡| 欧美猛男超大videosgay| 欧美一区二区三区四区五区| 日韩欧美国产一区二区在线播放| 欧美精品一区二区三区蜜桃视频| 久久亚洲一级片| 日韩一区有码在线| 亚洲在线中文字幕| 麻豆精品视频在线观看视频| 激情五月播播久久久精品| 国产成人午夜高潮毛片| 91女厕偷拍女厕偷拍高清| 337p亚洲精品色噜噜| 久久久久久97三级| 亚洲精品国产成人久久av盗摄 | 亚洲欧洲精品一区二区精品久久久 | 欧美激情一区二区三区| 亚洲美女视频在线观看| 老鸭窝一区二区久久精品| 高清国产一区二区| 欧美日本免费一区二区三区| 久久亚洲影视婷婷| 亚洲国产日韩在线一区模特| 乱一区二区av| 欧美在线免费观看亚洲| 久久综合九色综合97婷婷女人 | 欧美理论片在线| 中文字幕欧美激情一区| 亚洲国产精品视频| 成人午夜激情在线| 欧美电影一区二区| 日韩一区中文字幕| 久久国产精品99久久人人澡| 在线观看一区二区精品视频| 久久精品视频一区二区| 三级不卡在线观看| 色悠久久久久综合欧美99|