片内flash保存数据

定义变量

//#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();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值