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

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

?? eeprom.c

?? uPSD3200系列MCU的EEPROM的仿真實例
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*--------------------------------------------------------------------------
eeprom.c

Version:
10/2004 Ver 0.2 - Corrected Eeprom_Sector_Swap to properly handle smaller
                   sized records.
11/2002 Ver 0.1 - Initial Version

Description:
Device driver for EEPROM emulation using boot (secondary) flash.

*****************************************************************************
Important Note:
XDATA must be initialized to 0 in the startup file for this driver to work
properly.  This will be investigated and corrected in future releases.
*****************************************************************************


Copyright (c) 2004 STMicroelectronics

This example demo code is provided as is and has no warranty,
implied or otherwise.  You are free to use/modify any of the provided
code at your own risk in your applications with the expressed limitation
of liability (see below) so long as your product using the code contains
at least one uPSD products (device).

LIMITATION OF LIABILITY:   NEITHER STMicroelectronics NOR ITS VENDORS OR 
AGENTS SHALL BE LIABLE FOR ANY LOSS OF PROFITS, LOSS OF USE, LOSS OF DATA,
INTERRUPTION OF BUSINESS, NOR FOR INDIRECT, SPECIAL, INCIDENTAL OR
CONSEQUENTIAL DAMAGES OF ANY KIND WHETHER UNDER THIS AGREEMENT OR
OTHERWISE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
--------------------------------------------------------------------------*/


#include "eeprom.h"
#include "upsd3200.h"			// special function register declarations for UPSD


/***** EEPROM_Format *****/
// Formats sectors 0 and 1 to accept record data
// Accepts maximum number of records allowed.
// Returns 0 on success. If error, returns 1.
// ********** WARNING ********** // 
// This function erases any existing data in both sectors
// ********** WARNING ********** // 
BYTE EEPROM_Format(WORD max_records)
{
	xdata struct record_entry xdata record;

	// Verify data will fit into half of sector
	if  ( (sizeof(record) * max_records)  > (SECTOR_SIZE/2) )
		return ILLEGAL_RECORD_NUMBER;

	// Format sector 0
	if ( E_andF_Sector(SECTOR_0, max_records) ) return FORMAT_FAILED;
	// Erase sector 1
	if ( Eeprom_Sector_Erase(SECTOR_1) ) return SECTOR_ERASE_ERROR;

	return 0;
}

/***** Eeprom_Init *****/
// Verifies database integrity after power loss.
// Attempts to recover data corruption after power loss.
// Re-formats database if corrupted. 
BYTE Eeprom_Init(void)
{
	xdata struct sector_header xdata sector_header_0;
	xdata struct sector_header xdata sector_header_1;
	xdata struct record_entry xdata record;
	WORD i, j;
	BYTE *ptr;
	WORD xdata max_rec;
	WORD xdata last_address;
	WORD xdata base_address;
	WORD xdata new_address;
	BYTE xdata valid_sector;

	// Get both sector headers
	ptr = (BYTE*) (&sector_header_0);
	base_address = SECTOR_0_BASE_ADDRESS;
	for ( i=0; i < sizeof(sector_header_0); i++ )
	{
		ptr[i] = Boot_Flash_Read( base_address++ );
	}
	ptr = (BYTE*) (&sector_header_1);
	base_address = SECTOR_1_BASE_ADDRESS;
	for ( i=0; i < sizeof(sector_header_1); i++ )
	{
		ptr[i] = Boot_Flash_Read( base_address++ );
	}

	// Check for corrupted sectors
	// This would occur if a sector erase was interrupted by a power loss
	// In this case, the sector must be re-erased
	if ( ~(sector_header_0.sector ^ sector_header_0.sector_checksum) )
	{
		if ( Eeprom_Sector_Erase(SECTOR_0) ) return SECTOR_ERASE_ERROR;
		sector_header_0.sector_status = ERASED;
	}
	if ( ~(sector_header_1.sector ^ sector_header_1.sector_checksum) )
	{
		if ( Eeprom_Sector_Erase(SECTOR_1) ) return SECTOR_ERASE_ERROR;
		sector_header_1.sector_status = ERASED;
	}

	// Get maximum number of records from header
	// If unable, return error
	if ( sector_header_0.max_records != 0xFFFF )
		max_rec = sector_header_0.max_records;
	else if ( sector_header_1.max_records != 0xFFFF )
		max_rec = sector_header_1.max_records;
	else
		return ILLEGAL_RECORD_NUMBER;

	// Check for invalid header states and repair
	switch(sector_header_0.sector_status)
	{
    case ERASED:
		if( sector_header_1.sector_status == VALID__SECTOR )  // sector 1 is valid
		{		    
          	if ( Eeprom_Sector_Erase(SECTOR_0) ) return SECTOR_ERASE_ERROR;			
		}     
		else  // invalid state re-format database
		{
          	if ( Eeprom_Sector_Erase(SECTOR_1) ) return SECTOR_ERASE_ERROR;			
			if ( E_andF_Sector(SECTOR_0, max_rec) ) return FORMAT_FAILED;
			return INVALID_SECTOR_STATE;
     	}
		break;
	case RECEIVE_DATA:	
       	if ( sector_header_1.sector_status == VALID__SECTOR ) // use sector 1
       	{
          	if ( Eeprom_Sector_Erase(SECTOR_0) ) return SECTOR_ERASE_ERROR;			
      	}
		else if(sector_header_1.sector_status == TRANSFER_COMPLETE) //use sector 0
		{
          	if ( Eeprom_Sector_Erase(SECTOR_1) ) return SECTOR_ERASE_ERROR;	
			// update sector 0 header to valid data 
			sector_header_0.sector_status = VALID__SECTOR;
			ptr = (BYTE*) (&sector_header_0);
			base_address = SECTOR_0_BASE_ADDRESS;
			for ( i=0; i < sizeof(sector_header_0); i++ )
			{
				if ( Boot_Flash_Write( base_address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
			}
		}
		else  // invalid state erase both sectors
		{
          	if ( Eeprom_Sector_Erase(SECTOR_1) ) return SECTOR_ERASE_ERROR;			
			if ( E_andF_Sector(SECTOR_0, max_rec) ) return FORMAT_FAILED;
			return INVALID_SECTOR_STATE;
     	}
		break;
	case VALID__SECTOR:	
		if ( sector_header_1.sector_status == VALID__SECTOR ) // invalid state erase both sectors
		{		    
          	if ( Eeprom_Sector_Erase(SECTOR_1) ) return SECTOR_ERASE_ERROR;			
			if ( E_andF_Sector(SECTOR_0, max_rec) ) return FORMAT_FAILED;
			return INVALID_SECTOR_STATE;
       	}
		else // sector 0 is valid sector, erase sector 1
       	{
          	if ( Eeprom_Sector_Erase(SECTOR_1) ) return SECTOR_ERASE_ERROR;			
		}
		break;
   	case TRANSFER_COMPLETE:
		if ( sector_header_1.sector_status == VALID__SECTOR ) // erase sector 0
		{		    
          	if ( Eeprom_Sector_Erase(SECTOR_0) ) return SECTOR_ERASE_ERROR;			
		}				
		else if (sector_header_1.sector_status == RECEIVE_DATA) // erase sector 0, use sector 1
		{
          	if ( Eeprom_Sector_Erase(SECTOR_0) ) return SECTOR_ERASE_ERROR;	
			// mark sector 1 as valid sector 
			sector_header_1.sector_status = VALID__SECTOR;
			ptr = (BYTE*) (&sector_header_1);
			base_address = SECTOR_1_BASE_ADDRESS;
			for ( i=0; i < sizeof(sector_header_1); i++ )
			{
				if ( Boot_Flash_Write( base_address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
			}
		}
		else // invalid state, format both sectors
		{
          	if ( Eeprom_Sector_Erase(SECTOR_1) ) return SECTOR_ERASE_ERROR;			
			if ( E_andF_Sector(SECTOR_0, max_rec) ) return FORMAT_FAILED;
			return INVALID_SECTOR_STATE;
 		}
		break;
	default:  // any other state, erase both sectors
 	
          	if ( Eeprom_Sector_Erase(SECTOR_1) ) return SECTOR_ERASE_ERROR;			
			if ( E_andF_Sector(SECTOR_0, max_rec) ) return FORMAT_FAILED;
			return INVALID_SECTOR_STATE;
		break;
	}

	// Check for corrupted data 
	// This would happen if a data write/update was interrupted by a power loss
	for ( i=0; i<max_rec; i++ )
	{
		// get address of last entry of each record
		last_address = Read_Record_Data_Structure( i, (BYTE*) (&record) );
		// repair record entry if necessary
		if ( record.status == UPDATE_DATA )
  		{
			// get sector	
			valid_sector = Find_Active_Sector(F_WRITE);
			if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;
			// get base address of sector
			base_address = 	SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE);
 	  		// get address for repaired entry
	   		new_address = Find_Next_Address();
			if( new_address == SECTOR_FULL ) return SECTOR_FULL; // abort if sector is full
			// set status and pointer to next data
			record.status = VALID_DATA;
			record.last_record_update = 0xFFFF;
			// write new record with old data
			ptr = (BYTE*) (&record);
			for ( j=0; j<sizeof(record); j++ )
			{
				 if ( Boot_Flash_Write(new_address++, ptr[j]) ) return FLASH_WRITE_ERROR;
			}
			// fix status and pointer of old record
			record.status = SUPERSEDED;
			record.last_record_update = new_address - sizeof(record);
			for ( j=0; j < sizeof(record); j++ )
			{
				if ( Boot_Flash_Write( last_address++, ptr[j] ) ) return FLASH_WRITE_ERROR;
			}
		}
	}

	return 0;
}

/***** Update_Record *****/
// Update record in EEPROM.
// Accepts record id and new record data.
// Swaps to empty sector if current sector is full
BYTE Update_Record(WORD id, BYTE xdata *buf)
{
    BYTE i;
    BYTE xdata status;
	BYTE xdata bufover[EEPROM_RECORD_SIZE];

	status = Write_Record(id, buf);
   
	// when the sector is full, save the new record to ram and transfer to a blank sector	
	if( status == SECTOR_FULL ) 
	{
		// store new data in temporary buffer
		for ( i=0; i < sizeof(bufover); i++ )
		{
			bufover[i] = buf[i];
		}
		// perform sector swap
		status = Eeprom_Sector_Swap(id, &bufover);
	}
	
	return status;	
}

/***** Read_Record *****/
// Reads a data element from EEPROM.
// Accepts record id number.
// Returns record data byte. If error, returns error code.
BYTE Read_Record(WORD id_number, BYTE* buffer)
{
	BYTE xdata valid_sector = 0xFF;
	xdata struct sector_header xdata header;
	xdata struct record_entry xdata record;
	WORD i;
	BYTE *ptr;
	BYTE xdata *data_buf;
	WORD xdata 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;
	 }

	 if( record.status == UNINITIALIZED ) return UNINITIALIZED;

	// Set data buffer
	for ( i=0; i<EEPROM_RECORD_SIZE; i++ )
	{
		data_buf[i] = record.record_data[i];
	}

	return 0;
}

/***** Write_Record *****/
// Write or update record in EEPROM.
// Accepts record id and new record data.
// If error, returns error code.
BYTE Write_Record(WORD id, BYTE xdata *buffer)
{
	xdata struct sector_header xdata header;
	xdata struct record_entry xdata record;
	WORD i;
	BYTE xdata valid_sector;
	WORD xdata last_address;
	WORD xdata base_address;
	WORD xdata new_address;
	WORD address;
	BYTE *ptr;
	BYTE xdata *data_buf;

	// get active sector
	valid_sector = Find_Active_Sector(F_WRITE);
	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 * (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++ );
	}

	// write data if record not initialized
	if ( record.status == UNINITIALIZED )
	{
		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
		}

		// write record to flash
		ptr = (BYTE*) (&record);
		address = base_address;
		for ( i=0; i < sizeof(record); i++ )
		{
			if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
		}

		return 0;
	}
	
	// find last entry if record initialized	
	address = base_address;
	do
	{
		ptr = (BYTE*) (&record);
		for ( i=0; i<sizeof(record); i++ )
		{
			ptr[i] = Boot_Flash_Read( address++ );
		}
		if ( record.status == SUPERSEDED )
		{
			address = record.last_record_update;
		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99riav一区二区三区| 久久综合九色综合97婷婷| 亚洲欧美在线aaa| 91免费看`日韩一区二区| 国产精品伦理在线| 91捆绑美女网站| 日韩中文字幕麻豆| 日韩一级二级三级| 国产精品77777| 国产欧美一区二区精品婷婷| av亚洲精华国产精华| 亚洲午夜三级在线| 日韩欧美色综合| 岛国精品一区二区| 亚洲黄色免费电影| 日韩一区二区三区电影在线观看 | 国产一区二区三区蝌蚪| 久久久精品国产免费观看同学| 成人午夜精品在线| 亚洲图片一区二区| 久久综合五月天婷婷伊人| 成人午夜精品在线| 日韩不卡一区二区| 欧美激情一区三区| 欧美美女激情18p| 国产精品69毛片高清亚洲| 亚洲综合成人在线| 久久午夜老司机| 91久久香蕉国产日韩欧美9色| 久久99精品国产.久久久久| 亚洲欧洲另类国产综合| 欧美高清你懂得| 成人精品视频一区二区三区| 午夜一区二区三区视频| 国产嫩草影院久久久久| 欧美高清激情brazzers| 福利电影一区二区| 日本中文字幕一区二区视频| 日韩理论电影院| 首页国产欧美久久| 9久草视频在线视频精品| 日韩亚洲欧美中文三级| 欧美—级在线免费片| 久久69国产一区二区蜜臀 | 青青草原综合久久大伊人精品 | 黄页视频在线91| 国产精品免费看片| 26uuu国产在线精品一区二区| 国内精品国产三级国产a久久| 韩国中文字幕2020精品| 91麻豆精品秘密| 欧美午夜理伦三级在线观看| 久久一夜天堂av一区二区三区| 亚洲最新视频在线观看| 国产成人综合自拍| 亚洲图片你懂的| 国产不卡一区视频| 亚洲另类中文字| 欧美大白屁股肥臀xxxxxx| 国产精品88av| 天天综合日日夜夜精品| 欧美大片在线观看一区| 精品一区二区三区欧美| 久久综合av免费| 国产.精品.日韩.另类.中文.在线.播放| 欧美一区二区三区日韩视频| 免费欧美在线视频| 久久久美女毛片| 欧美性欧美巨大黑白大战| 99精品视频在线观看| 一区二区三区日韩精品| 欧美另类高清zo欧美| 国产综合色视频| 制服丝袜中文字幕亚洲| 精品亚洲成a人| 精品少妇一区二区三区| 国产成人免费视频| 亚洲精品乱码久久久久| 成人永久看片免费视频天堂| 亚洲国产欧美在线| 亚洲精品成人a在线观看| 亚洲精品福利视频网站| 久久综合久久综合久久综合| 成人午夜精品在线| 天堂av在线一区| 国产精品免费aⅴ片在线观看| 成人黄色网址在线观看| 国产精品自产自拍| 香蕉加勒比综合久久| 亚洲黄网站在线观看| 在线观看国产91| 色综合久久久久综合体桃花网| 色综合中文字幕国产 | 成a人片国产精品| 成人一区二区三区视频在线观看| 成人美女视频在线观看18| 99久久精品国产毛片| 日本道色综合久久| 日韩一二在线观看| 国产日韩欧美亚洲| 亚洲欧美日韩久久| 午夜激情一区二区三区| 精品写真视频在线观看| 成人开心网精品视频| 色综合久久久久网| 日韩一级片在线观看| 国产午夜精品一区二区三区嫩草| 国产精品久久久久影院老司| 亚洲福利视频一区二区| 精品在线你懂的| 99riav久久精品riav| 日韩一区二区免费电影| 亚洲一二三四区不卡| 日韩精品一级中文字幕精品视频免费观看 | 水野朝阳av一区二区三区| 国模冰冰炮一区二区| 日本国产一区二区| 日韩精品自拍偷拍| 亚洲男人的天堂av| 麻豆91在线观看| 色乱码一区二区三区88| 欧美成va人片在线观看| 国产精品不卡视频| 日本中文字幕一区二区视频| 99精品在线免费| 精品伦理精品一区| 亚洲二区在线视频| 国产精品 日产精品 欧美精品| 日本福利一区二区| 国产欧美日韩视频在线观看| 视频一区欧美精品| 91免费观看视频在线| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 国产精品色哟哟| 亚洲成av人片一区二区三区 | 免费一区二区视频| 91蜜桃婷婷狠狠久久综合9色| 欧美va亚洲va国产综合| 亚洲最大成人综合| 成人午夜碰碰视频| 久久只精品国产| 日韩中文字幕一区二区三区| 日本高清不卡一区| 日韩美女视频一区二区| 国产成人在线视频免费播放| 日韩一区二区电影网| 无码av免费一区二区三区试看 | 国产精品传媒在线| 国产精品一区二区果冻传媒| 欧美一区二区视频网站| 天天免费综合色| 精品一二线国产| 懂色av一区二区三区免费看| 日本成人超碰在线观看| 久久蜜桃av一区精品变态类天堂| 99re亚洲国产精品| 国内精品国产三级国产a久久| 久久综合中文字幕| 成人黄色网址在线观看| 亚洲国产精品一区二区www| 精品国产三级电影在线观看| 亚洲成人你懂的| 欧美激情一区三区| 在线综合视频播放| 亚洲综合成人网| 欧美少妇性性性| 亚洲制服丝袜av| 91蝌蚪porny九色| 亚洲人成精品久久久久| 日本道精品一区二区三区| 亚洲综合区在线| 欧美系列在线观看| 午夜精品一区二区三区三上悠亚| 欧美日韩一本到| 五月婷婷综合在线| 欧美一区二区三区公司| 久久激情五月激情| 久久先锋资源网| 成人性生交大片免费看视频在线 | 无码av中文一区二区三区桃花岛| 欧美亚洲综合在线| 日韩主播视频在线| 精品国产91乱码一区二区三区| 国内精品久久久久影院色| 国产欧美一区二区三区鸳鸯浴 | 蜜臀a∨国产成人精品| 日韩一区和二区| 国产精品自在欧美一区| 中文字幕免费一区| www.成人网.com| 午夜久久久影院| 欧美xxxxxxxx| jizz一区二区| 视频一区在线播放| 久久精品亚洲国产奇米99| 91麻豆国产在线观看| 免费视频最近日韩| 国产性天天综合网| 欧美视频三区在线播放| 激情小说亚洲一区|