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

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

?? eeprom.c

?? uPSD3200系列MCU的EEPROM的仿真實例
?? C
?? 第 1 頁 / 共 3 頁
字號:
		*(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
		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
		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
		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
		break;
	default:
		return 1;

	}
   	return 0;
}

/***** Eeprom_Sector_Erase_Suspend*****/
// Susupend Erases one boot flash sector.
// Accepts sector number (0-3).
// Returns 0 for successful erasure. If error, returns 1. 
BYTE Eeprom_Sector_Erase_Suspend(BYTE sector)
{
	switch (sector)
	{
	case SECTOR_0:
		*((volatile unsigned char xdata *)SECTOR_0_BASE_ADDRESS) = 0xB0;// Suspend erase sector
		break;
	case SECTOR_1:
		*((volatile unsigned char xdata *)SECTOR_1_BASE_ADDRESS) = 0xB0;// Suspend erase sector
		break;
	case SECTOR_2:
		*((volatile unsigned char xdata *)SECTOR_2_BASE_ADDRESS) = 0xB0;// Suspend erase sector
		break;
	case SECTOR_3:
		*((volatile unsigned char xdata *)SECTOR_3_BASE_ADDRESS) = 0xB0;// Suspend erase sector
		break;
	default:
		return 1;
	}


   	return 0;
}

/***** Eeprom_Sector_Erase_Resume*****/
// Resume Erases one boot flash sector.
// Accepts sector number (0-3).
// Returns 0 for successful erasure. If error, returns 1. 
BYTE Eeprom_Sector_Erase_Resume(BYTE sector)
{
	switch (sector)
	{
	case SECTOR_0:
		*((volatile unsigned char xdata *)SECTOR_0_BASE_ADDRESS) = 0x30;// Resume erase sector
		break;
	case SECTOR_1:
		*((volatile unsigned char xdata *)SECTOR_1_BASE_ADDRESS) = 0x30;// Resume erase sector
		break;
	case SECTOR_2:
		*((volatile unsigned char xdata *)SECTOR_2_BASE_ADDRESS) = 0x30;// Resume erase sector
		break;
	case SECTOR_3:
		*((volatile unsigned char xdata *)SECTOR_3_BASE_ADDRESS) = 0x30;// Resume erase sector
		break;
	default:
		return 1;
	}

   	return 0;
}

/***** Eeprom_Sector_Erase_Status *****/
// Gets status of sector erase.
// Accepts sector number (0-3).
// Returns 0 if erase cycle finished. Returns 1 if erase in progress. 
BYTE Eeprom_Sector_Erase_Status(BYTE sector)
{
	BYTE poll;

	switch (sector)
	{
	case SECTOR_0:
		poll = *((volatile unsigned char xdata *)SECTOR_0_BASE_ADDRESS);
		return !( poll & 0x80); 
	case SECTOR_1:
		poll = *((volatile unsigned char xdata *)SECTOR_1_BASE_ADDRESS);
		return !( poll & 0x80); 
	case SECTOR_2:
		poll = *((volatile unsigned char xdata *)SECTOR_2_BASE_ADDRESS);
		return !( poll & 0x80); 
	case SECTOR_3:
		poll = *((volatile unsigned char xdata *)SECTOR_3_BASE_ADDRESS);
		return !( poll & 0x80); 
	default:
		return 1;
	}
   	return 0;
}

/***** Find_Next_Address *****/
// Finds next available address for data record.
// Returns next available address. 
WORD Find_Next_Address(void)
{
	BYTE xdata valid_sector;
	xdata struct sector_header xdata header;
	xdata struct record_entry xdata record;
	WORD address;
	BYTE *ptr;
	WORD i;

	// Find valid sector
	valid_sector = Find_Active_Sector(F_WRITE);
	if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;

	// Get sector header
	ptr = (BYTE*) (&header);
	address = SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE);	
	for ( i=0; i<(WORD)sizeof(header); i++ )
	{
		ptr[i] = Boot_Flash_Read( address++ );
	}

	// Calculate address
	address = SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE) + 	// sector base address
	(WORD)sizeof(header) + 													// sector header
	(header.max_records * (WORD)sizeof(record));							// first instance of each record
	ptr = (BYTE*) (&record);
	for ( i=0; i < SECTOR_SIZE; i += sizeof(record) )
	{
		if ( Boot_Flash_Read( address ) == UNINITIALIZED ) return address;
		address += sizeof(record);
		if ( address >= (SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE) 
			+ SECTOR_SIZE - (WORD)sizeof(record)) ) return SECTOR_FULL;
	}
	return ADDRESS_ERROR;
}


/***** Find_Active_Sector *****/
// Finds active sector.
// Returns sector number. 
// If error, returns error code. 
BYTE Find_Active_Sector(BYTE io)
{
	xdata struct sector_header xdata header0;
	xdata struct sector_header xdata header1;
	WORD address;
	BYTE *ptr;
	BYTE i;

	// Check sector 0 for status	
	ptr = (BYTE*) (&header0);
	address = SECTOR_0_BASE_ADDRESS;
	for ( i=0; i < sizeof(header0); i++ )
	{
		ptr[i] = Boot_Flash_Read( address++ );
	}
	// Check sector 1 for status	
	ptr = (BYTE*) (&header1);
	address = SECTOR_1_BASE_ADDRESS;
	for ( i=0; i < sizeof(header1); i++ )
	{
		ptr[i] = Boot_Flash_Read( address++ ); 
	}	

	switch (io)
	{
	case F_WRITE: // write
		if( header0.sector_status == VALID__SECTOR )
		{
			if( header1.sector_status == RECEIVE_DATA )
			{
				return (SECTOR_1);
			} 
			else
			{
				return (SECTOR_0); 
			}
		}
		else if( header1.sector_status == VALID__SECTOR )			 
		{
			if( header0.sector_status == RECEIVE_DATA )
			{
				return (SECTOR_0);
			}
			else
			{
				return (SECTOR_1); 
			}
		}
	case F_READ:  // read  
		if( header0.sector_status == VALID__SECTOR )
		{	    
			return (SECTOR_0); 
		}
		else if( header1.sector_status == VALID__SECTOR )           
		{
			return (SECTOR_1); 
		}			 
	default: 
	        return (SECTOR_0); 		
	}
	return 1;
}


/***** Eeprom_Sector_Swap *****/
// Transfers data from full sector to empty one.
// Returns new sector number. 
 BYTE Eeprom_Sector_Swap(WORD inn, BYTE xdata *buf)
{
	xdata struct sector_header xdata sector_header_old;
	xdata struct sector_header xdata sector_header_new; 
	xdata struct record_entry xdata buffer; 		   	
	BYTE *ptr; 
	WORD xdata id;
	BYTE *ptr_old;
	BYTE *ptr_new;
	WORD address;
	BYTE xdata status;
	BYTE i;
	BYTE xdata valid_sector;
	WORD xdata new_sector; // place holder for the sector we are moving to
	WORD xdata old_sector; // place holder for the sector we are moving from
        
	// get active sector  (This is the sector we are moving from)
	valid_sector = Find_Active_Sector(F_READ);
		if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;

	if(valid_sector == SECTOR_1)
	{
		new_sector = SECTOR_0_BASE_ADDRESS;  // move data to this sector
		old_sector = SECTOR_1_BASE_ADDRESS;  // move data from this sector
		sector_header_new.sector = SECTOR_0;
	}
	else
	{
		new_sector = SECTOR_1_BASE_ADDRESS; // move data to this sector
		old_sector = SECTOR_0_BASE_ADDRESS; // move data from this sector
		sector_header_new.sector = SECTOR_1;
	}
		
	// Get old sector header
	ptr_old = (BYTE*) (&sector_header_old);
	address = old_sector;
	for ( i=0; i < sizeof(sector_header_old); i++ )
	{		
        ptr_old[i] = Boot_Flash_Read(address++);
	}

	// Verify new sector is erased
	if ( Eeprom_Sector_Erase(sector_header_new.sector) ) return SECTOR_ERASE_ERROR;

	sector_header_new.sector_checksum = ~(sector_header_new.sector);
	sector_header_new.max_records = sector_header_old.max_records;
	sector_header_new.rec_length = (WORD)EEPROM_RECORD_SIZE;
	sector_header_new.sector_status = RECEIVE_DATA;

	// mark receiving sector (new sector)      
	// mark new sector to receive 
	address = new_sector; 
	ptr_new = (BYTE*) (&sector_header_new);
	for ( i=0; i < sizeof(sector_header_new); i++ )
	{  
		if ( Boot_Flash_Write( address++, ptr_new[i] ) ) return FLASH_WRITE_ERROR;      
	}
                    
	for (id=0; id < sector_header_old.max_records; id++)
	{                       
		if(id == inn) 
		{ 
			ptr = buf; // add the new record as the data is swapped into the new sector 
			status = 0;
		}
		else
		{
			ptr = (BYTE*) (&buffer);
			status = Read_Record(id, ptr);
		}
		if( status != UNINITIALIZED ) Write_Record( id, ptr );			            
	}
      
	// mark good and bad sectors

	// mark old sector TRANSFER_COMPLETE BEFORE marking new sector ACTIVE 
	sector_header_old.sector_status =  TRANSFER_COMPLETE;                      
	address = old_sector; 
	for ( i=0; i < sizeof(sector_header_old); i++ )
	{  
		if ( Boot_Flash_Write( address++, ptr_old[i] ) ) return FLASH_WRITE_ERROR;      
	}

	// mark new sector ACTIVE AFTER marking old TRANSFER_COMPLETE   
	sector_header_new.sector_status =   VALID__SECTOR;      
	address = new_sector; 
	for ( i=0; i < sizeof(sector_header_new); i++ )
	{  
		if ( Boot_Flash_Write( address++, ptr_new[i] ) ) return FLASH_WRITE_ERROR;      
	}
	
	// Start erase of old sector
	if ( Eeprom_Sector_Erase_Start(valid_sector) ) return SECTOR_ERASE_ERROR;
			
	return 0;
}

/***** ERASE and FORMAT SECTOR *****/
// Erases and formats a sector.
// Accepts sector number, type of operation and max records allowed.
// Legal sectors are:
// 	SECTOR_0 for address 0x8000
//	SECTOR_1 for address 0xA000
// If error, returns error code.
BYTE E_andF_Sector(BYTE sector, WORD max_rec)
{                                          
	xdata struct sector_header xdata header;           
	BYTE i;
	WORD address;
	BYTE *ptr;

	header.sector_status = VALID__SECTOR;
	header.sector = sector;
	header.sector_checksum = ~(sector);
	header.max_records = max_rec;
	header.rec_length = (WORD)EEPROM_RECORD_SIZE;

	if(sector == SECTOR_0) address = SECTOR_0_BASE_ADDRESS;
	if(sector == SECTOR_1) address = SECTOR_1_BASE_ADDRESS;

	if ( Eeprom_Sector_Erase(sector) ) return SECTOR_ERASE_ERROR;

	ptr = (BYTE*) (&header);

	// write sector header		
	for ( i=0; i < sizeof( header ); i++ ) 
	{
		if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
	}

	return 0;
}

/***** Get_Sector_Status *****/
// Returns sector status.
// If error, returns INVALID_STATUS. 
BYTE Get_Sector_Status(BYTE sector)
{
	xdata struct sector_header xdata header;
	WORD address;
	BYTE *ptr;
	BYTE i;

	// Get sector header	
	ptr = (BYTE*) (&header);
	address = SECTOR_0_BASE_ADDRESS + (sector * SECTOR_SIZE);
	for ( i=0; i < sizeof(header); i++ )
	{
		ptr[i] = Boot_Flash_Read( address++ );
	}
	
	switch (header.sector_status)
	{
		case ERASED:
			return ERASED;
		case RECEIVE_DATA:
			return RECEIVE_DATA;
		case VALID__SECTOR:
			return VALID__SECTOR;
		case TRANSFER_COMPLETE:
			return TRANSFER_COMPLETE;
		default:
			return INVALID_STATUS;			
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
狠狠色丁香久久婷婷综| 日本高清免费不卡视频| 中文字幕日韩一区| 色天使色偷偷av一区二区| 丝袜亚洲另类欧美| 久久久99精品免费观看不卡| www.日韩精品| 美女脱光内衣内裤视频久久网站 | 风间由美性色一区二区三区| 1024国产精品| 日韩精品一区二区三区视频在线观看| 国产成人午夜高潮毛片| 五月天一区二区三区| 中文字幕不卡在线| 日韩美一区二区三区| 在线视频你懂得一区| 不卡的av在线| 懂色av中文字幕一区二区三区| 日韩和的一区二区| 成人18视频在线播放| 日韩高清欧美激情| 国精产品一区一区三区mba桃花| 欧美在线三级电影| 久久精品国产精品亚洲综合| 日本道精品一区二区三区| 一区在线中文字幕| 国产福利一区在线| 久久精品一二三| 风间由美一区二区av101| 日韩欧美的一区| 91在线国内视频| 韩日av一区二区| 日韩国产在线观看一区| 亚洲大型综合色站| 国产视频一区在线播放| 国产婷婷色一区二区三区| 在线看国产一区二区| 97精品国产97久久久久久久久久久久| 久久亚洲一区二区三区明星换脸| 久草精品在线观看| 久久久久青草大香线综合精品| 久久97超碰国产精品超碰| 日韩精品一区二区三区在线观看| 久久国产三级精品| 久久色在线视频| 成人免费黄色大片| 亚洲精品欧美二区三区中文字幕| 色综合久久中文综合久久97| 一区二区三区在线视频免费| 日本精品一区二区三区高清| 一区二区免费看| 91精品国产色综合久久ai换脸| 日本不卡的三区四区五区| 国产精品久久久久9999吃药| a4yy欧美一区二区三区| 国产精品女主播在线观看| 国产毛片一区二区| 亚洲三级免费电影| 欧美日本免费一区二区三区| 国内精品嫩模私拍在线| 国产精品久久久久久久久免费樱桃 | 国产精品福利影院| 欧美做爰猛烈大尺度电影无法无天| 亚洲影院免费观看| 日韩片之四级片| 成人a级免费电影| 亚洲444eee在线观看| 精品久久五月天| 91麻豆文化传媒在线观看| 蜜臀久久久久久久| 中文字幕电影一区| 欧美欧美欧美欧美| 成人国产精品免费观看| 日韩精品国产欧美| 中文字幕日韩精品一区| 制服丝袜日韩国产| av动漫一区二区| 精品一区二区三区在线观看国产| 1024亚洲合集| 国产亚洲一二三区| 欧美男女性生活在线直播观看| 国产一区二区三区四区在线观看| 亚洲综合无码一区二区| 国产精品网站在线| 精品精品国产高清a毛片牛牛| 91精品91久久久中77777| 国产成人精品三级| 精品影院一区二区久久久| 一区二区三区不卡视频| 国产精品视频一区二区三区不卡| 欧美一区二区女人| 欧美日韩一级视频| 一本色道久久综合亚洲aⅴ蜜桃 | 99九九99九九九视频精品| 美国av一区二区| 亚洲国产一区二区三区青草影视| 中文字幕不卡的av| 久久你懂得1024| 日韩美女在线视频| 欧美视频日韩视频在线观看| av日韩在线网站| 成人免费毛片片v| 国产福利一区二区三区| 国产自产v一区二区三区c| 青青草97国产精品免费观看 | 国产精品欧美极品| 国产欧美日韩久久| 中文字幕av资源一区| 欧美α欧美αv大片| 欧美一区二区久久| 91精品国产综合久久香蕉麻豆| 色吧成人激情小说| 欧美性猛片xxxx免费看久爱| 91麻豆自制传媒国产之光| 91蝌蚪porny| 色噜噜狠狠成人网p站| 色偷偷88欧美精品久久久| 99免费精品视频| 91浏览器在线视频| 91成人免费在线| 欧美日韩亚洲不卡| 日韩一级片在线观看| 欧美xfplay| 日本一区二区三区高清不卡| 国产香蕉久久精品综合网| 国产精品网站在线播放| 亚洲精品中文在线影院| 午夜私人影院久久久久| 蜜臀久久久99精品久久久久久| 九色综合国产一区二区三区| 精品亚洲成a人| 成人午夜激情在线| 在线观看免费亚洲| 欧美一区二区精美| 国产日韩精品一区二区三区 | 欧美精品一区二区三区一线天视频| 日韩精品中文字幕一区二区三区| 久久亚洲综合av| 亚洲综合免费观看高清完整版在线| 天天亚洲美女在线视频| 国精品**一区二区三区在线蜜桃| 国产成人在线色| 欧美性一区二区| 精品成人私密视频| 亚洲欧美日韩综合aⅴ视频| 午夜视频一区在线观看| 国产精品自拍三区| 色婷婷综合激情| 欧美一区二区性放荡片| 久久久久久毛片| 亚洲国产中文字幕| 国产精品综合一区二区三区| 色综合欧美在线视频区| 日韩欧美精品三级| 亚洲欧美激情插| 精品中文av资源站在线观看| 91免费观看在线| 精品sm在线观看| 一区二区欧美视频| 国产精品18久久久久久vr| 91成人在线免费观看| 久久久久久久性| 日韩国产欧美一区二区三区| 成人av资源下载| 日韩色在线观看| 亚洲精品国产无套在线观| 国产自产高清不卡| 91精品国产免费| 亚洲制服丝袜一区| 不卡在线视频中文字幕| 日韩一区二区免费在线观看| 亚洲人被黑人高潮完整版| 韩国精品久久久| 欧美一区二区三区精品| 一区二区三区在线视频免费| 国产成人综合视频| 欧美大片在线观看一区| 亚洲成人动漫精品| 91国偷自产一区二区开放时间| 国产色一区二区| 国产一区二区在线观看免费| 666欧美在线视频| 亚洲成人动漫av| 欧美日韩视频在线第一区| 亚洲黄色小说网站| 色综合一区二区| 亚洲视频在线一区| 成人成人成人在线视频| 久久毛片高清国产| 国产一区亚洲一区| 久久午夜免费电影| 国产在线播放一区二区三区| 欧美一级二级三级蜜桃| 日韩国产欧美在线播放| 这里只有精品视频在线观看| 午夜精品久久久| 91麻豆精品国产无毒不卡在线观看| 偷拍日韩校园综合在线| 4438x亚洲最大成人网| 日韩国产欧美三级|