定义变量
//#define PAGE_SIZE (u16)0x400 /* Page size = 2KByte */
#if defined (STM32F10X_MD) || defined (STM32F10X_MD_VL)
#define PAGE_SIZE (0x400) /* 1 Kbyte */
#define FLASH_SIZE (0x20000) /* 128 KBytes */
#elif defined STM32F10X_CL
#define PAGE_SIZE (0x800) /* 2 Kbytes */
#define FLASH_SIZE (0x40000) /* 256 KBytes */
#elif defined STM32F10X_HD
#define PAGE_SIZE (0x800) /* 2 Kbytes */
#define FLASH_SIZE (0x80000) /* 512 KBytes */
#elif defined STM32F10X_XL
#define PAGE_SIZE (0x800) /* 2 Kbytes */
#define FLASH_SIZE (0x100000) /* 1 MByte */
#else
#error "Please select first the STM32 device"
#endif
#define EEPROM_START_ADDRESS ((u32)(0x08000000+0x400*256-PAGE_SIZE*2))//0x807e800
//((u32)(0x08000000+0x400*256-PAGE_SIZE*2))//TEST ((u32)(0x08000000+0x400*256-PAGE_SIZE*2)) /*0x803f000 EEPROM emulation start address:*/
/* Pages 0 and 1 base and end addresses */
#define PAGE0_BASE_ADDRESS ((u32)(EEPROM_START_ADDRESS + 0x000))
#define PAGE0_END_ADDRESS ((u32)(EEPROM_START_ADDRESS + (PAGE_SIZE - 1)))
#define PAGE1_BASE_ADDRESS ((u32)(EEPROM_START_ADDRESS + PAGE_SIZE))
#define PAGE1_END_ADDRESS ((u32)(EEPROM_START_ADDRESS + (2 * PAGE_SIZE - 1)))
#define PAGE2_BASE_ADDRESS ((u32)(EEPROM_START_ADDRESS + 2*PAGE_SIZE))//0x807f800 //0x8040000 78 56 34 12
#define PAGE2_END_ADDRESS ((u32)(EEPROM_START_ADDRESS + (3 * PAGE_SIZE - 1)))
#define UPGRADE_NO_FINISH 0xABABABAB
#define UPGRADE_FINISH 0x12345678
#define NO_VALID_PAGE 0x00AB
#define ERASED 0xFFFF /* PAGE is empty */
#define RECEIVE_DATA 0xEEEE /* PAGE is marked to receive data */
#define VALID_PAGE 0x0000 /* PAGE containing valid data */
u16 EE_Init(void)
{
//u16 FlashStatus;
Sys.valide_id=0xea;
Sys.FS_select.logo_type_onoff_id=0x01;
Sys.FS_select.NAV_key_type=1;
//Sys.Main_Source=SRC_Radio;//test
//Sys.Volume=10;
//Sys.Fader=7;
//Sys.Balance=7;
FLASH_Unlock();
FLASH_ErasePage(PAGE0_BASE_ADDRESS);
Save_Eerom_Data();
FLASH_Lock();
return FLASH_COMPLETE;
}/*
FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS+10, flash_count++);
FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS+12, flash_count++);
FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS+14, flash_count++);
FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS+16, flash_count++);
EE_ReadVariable(PAGE0_BASE_ADDRESS, &flash_temp[0]);
EE_ReadVariable(PAGE0_BASE_ADDRESS+2, &flash_temp[1]);
EE_ReadVariable(PAGE0_BASE_ADDRESS+4, &flash_temp[2]);
EE_ReadVariable(PAGE0_BASE_ADDRESS+6, &flash_temp[3]);
EE_ReadVariable(PAGE0_BASE_ADDRESS+8, &flash_temp[4]);
EE_ReadVariable(PAGE0_BASE_ADDRESS+10, &flash_temp[5]);
EE_ReadVariable(PAGE0_BASE_ADDRESS+12, &flash_temp[6]);
EE_ReadVariable(PAGE0_BASE_ADDRESS+14, &flash_temp[7]);
EE_ReadVariable(PAGE0_BASE_ADDRESS+16, &flash_temp[8]);*/
/*u16 EE_ReadVariable(u32 VirtAddress, u16* Data)
{
u16 FlashStatus=FLASH_COMPLETE ;
*Data=*(vu16*)VirtAddress ;
return FlashStatus;
}
u16 EE_WriteVariable(u32 VirtAddress, u16 Data)
{
u16 FlashStatus;
FlashStatus=FLASH_ProgramHalfWord(VirtAddress, Data);
//FlashStatus=FLASH_ProgramWord(VirtAddress, Data);
return FlashStatus;
}*/
void Read_Eerom_Data(void)
{
int i;
//BYTE aTmp;
unsigned long temp=0;
temp=*(vu32*)(PAGE0_BASE_ADDRESS);
Sys.valide_id=LOBYTE(temp);
if(Sys.valide_id==0xea)
{
//FLASH_Unlock();
for(i=0; i<512; i++)
EEPROM_DATA.write_buf[i]=*(vu32*)(PAGE0_BASE_ADDRESS+i*4 );
// FLASH_Lock();
// memcpy((char *)write_buf_back,(char *)EEPROM_DATA.write_buf,sizeof(EEPROM_DATA));//
//if(Is_Source_Valide(Sys.Main_Source)==FALSE)
//Sys.Main_Source=SRC_Radio;
Sys.DVR_Source%=SRC_Off;
Sys.Volume%=41;
//Read_Radio_Eerom_Variables();
Sys.TFT_ID%=3;//==0 背光灭 ==1 背光白天模式 ==2 背光夜间模式
Sys.ACC_auto_on%=2;
//Sys.Power_Status;
//Sys.VideoType ;
Sys.Bright%=41; //亮度寄存器
Sys.Contrast%=41; //对比度寄存器
Sys.Color%=41; //颜色寄存器
//Sys.VideoMode%=user_videomode+1; //视频模式0=自定义,1=柔和,2=标准,3=明亮
Sys.voice_navi%=2;
Sys.gps_voice_Source%=SRC_Off;
}
else
{
EE_Init();
}
}
void Save_Eerom_Data(void)
{
//u16 FlashStatus;
int i;
//Save_Radio_Eerom_Variables();
FLASH_Unlock();
FLASH_ErasePage(PAGE0_BASE_ADDRESS);
for(i=0; i<512; i++)
FLASH_ProgramWord(PAGE0_BASE_ADDRESS+4*i, EEPROM_DATA.write_buf[i]);
FLASH_Lock();
}
void Write_Valid_Data(u32 value)
{
//u16 FlashStatus;
FLASH_Unlock();
FLASH_ErasePage(PAGE2_BASE_ADDRESS);
FLASH_ProgramWord(PAGE2_BASE_ADDRESS, value);
FLASH_Lock();
}
用共用体union 共享同一存储区,与struct结构体存储变量:
“`
define Sys EEPROM_DATA.byte_buf
union EEPROM_unit EEPROM_DATA;
union EEPROM_unit
{
unsigned long write_buf[512]; /define char field of union/
SystemSettingType byte_buf; /define bit field of union/
};
typedef struct
{
//(想要保存的变量)
BYTE valide_id; //==0xea
BYTE updata_id;
BYTE back_last_Main_Source;
BYTE FrontView_last_Main_Source;
BYTE Main_Source; //信号状态(0=DVD,1=SD,2=USB,3=TV,4=RADIO,5=GPS,6=AUX,7=CAM,8=EXIT,9=OFF,10=OPEN,11=SRC,12=ACC)
BYTE Car_Main_Source;//原车的音源(radio ,media)
BYTE Car_updata_flag;
BYTE bluetooth_last;
BYTE GPS_last;
BYTE DVR_Source; //信号状态(0=DVD,1=SD,2=USB,3=TV,4=RADIO,5=GPS,6=AUX,7=CAM,8=EXIT,9=OFF,10=OPEN,11=SRC,12=ACC)
BYTE Volume; //音量寄存器
BYTE TFT_ID;//==0 背光灭 ==1 背光白天模式 ==2 背光夜间模式
BYTE ACC_auto_on;
//BYTE Power_Status;
BYTE VideoType ;
BYTE lcd_type;
BYTE u8can_back_status;
BYTE u8IO_back_status;
BYTE u8back_status;
BYTE u8Drive_status; //D档
}SystemSettingType ;
//防止读取片内固件“`
void Read_project( void )
{
FlagStatus flashstatus = RESET;
/* Unlock the Flash Program Erase controller */
flashstatus = FLASH_GetReadOutProtectionStatus();
if( RESET == flashstatus )
{
FLASH_Unlock();
/* Erase all the option Bytes */
FLASH_EraseOptionBytes();
Delay_1ms( 10 );
FLASH_ReadOutProtection( ENABLE );
NVIC_SystemReset();
}
}