#include "includes.h" #include E_MCU_DEV_INFO g_mcu_dev; /******************************************************************************* * Function Name : EEPROM_Init * Description : EEPROM 初始化函数 *******************************************************************************/ void EEPROM_Init(void) { U8_T rev = 0; EnIFCClk; //使能 IFC 时钟 IFC->MR |= 0x10002; //高速模式,延迟 2 个周期 delay_nms(10); rev = EEPROM_ReadMCUDevInfo(&g_mcu_dev); if(rev == 0x00){ //读取成功,开始校验以下参数 EEPROM_Validate_MCUDevInfo(&g_mcu_dev); }else{ //读取失败,恢复默认参数 EEPROM_Default_MCUDevInfo(&g_mcu_dev); #if DBG_LOG_EN Dbg_Println(DBG_BIT_SYS_STATUS,"EE Use Defalut Para"); Dbg_Println(DBG_BIT_SYS_STATUS,"EE DevBootVer:%d",g_mcu_dev.dev_boot_ver); Dbg_Println(DBG_BIT_SYS_STATUS,"EE DevNameLen:%d",g_mcu_dev.dev_name_len); Dbg_Println(DBG_BIT_SYS_STATUS,"EE DevName:%s",g_mcu_dev.dev_name); #endif } } /******************************************************************************* * Function Name : EEPROM_CheckSum * Description : EEPROM 校验函数 *******************************************************************************/ U8_T EEPROM_CheckSum(U8_T *data,U16_T len) { U8_T data_sum = 0; for(U16_T i = 0;i= EEPROM_DATA_Size_Max) save_len = EEPROM_DATA_Size_Max; save_data[0] = EEPROM_SVAE_FLAG; save_data[1] = save_len & 0xFF; save_data[2] = (save_len >> 8) & 0xFF; memcpy(&save_data[4],(uint8_t *)info,save_len); save_data[3] = EEPROM_CheckSum(&save_data[4],save_len); save_len+=4; Page_ProgramData(EEPROM_MCUDevInfo_Address,save_len,save_data); return 0; } /******************************************************************************* * Function Name : EEPROM_Default_MCUDevInfo * Description : EEPROM中参数恢复默认值,且将默认参数保存至EEPROM中 *******************************************************************************/ void EEPROM_Default_MCUDevInfo(E_MCU_DEV_INFO *info) { #if (Project_Area == 0x01) /*Boot 区域*/ info->dev_addr = 0x00; info->dev_type = 0x00; info->dev_app_ver = 0x00; info->dev_boot_ver = Project_FW_Version; info->dev_name_len = sizeof(Peoject_Name); memset((char *)info->dev_name,0,EEPROM_DEV_NAME_Size); memcpy((char *)info->dev_name,(char *)Peoject_Name,info->dev_name_len); EEPROM_WriteMCUDevInfo(info); #elif (Project_Area == 0x02) /*APP 区域*/ info->dev_addr = 0x00; info->dev_type = Project_Type; info->dev_app_ver = Project_FW_Version; info->dev_name_len = sizeof(Peoject_Name); memset((char *)info->dev_name,0,EEPROM_DEV_NAME_Size); memcpy((char *)info->dev_name,(char *)Peoject_Name,info->dev_name_len); EEPROM_WriteMCUDevInfo(info); #endif } /******************************************************************************* * Function Name : EEPROM_Validate_MCUDevInfo * Description : 校验从EEPROM 中读取的参数是否正确,如果不正确的话,便将当前正确的参数写入 APP区域中,判断APP参数与EEPROM中记录的是否一致 Boot区域中,判断Boot参数与EEPROM中记录的是否一致 *******************************************************************************/ void EEPROM_Validate_MCUDevInfo(E_MCU_DEV_INFO *info) { #if (Project_Area == 0x01) /*Boot 区域*/ U8_T save_flag = 0; if(info->dev_boot_ver != Project_FW_Version) { info->dev_boot_ver = Project_FW_Version; save_flag = 0x01; } if(save_flag == 0x01) { EEPROM_WriteMCUDevInfo(info); } #elif (Project_Area == 0x02) /*APP 区域*/ U8_T save_flag = 0; if(info->dev_app_ver != Project_FW_Version) { info->dev_app_ver = Project_FW_Version; save_flag = 0x01; } if(info->dev_type != Project_Type) { info->dev_type = Project_Type; save_flag = 0x01; } if(info->dev_name_len != sizeof(Peoject_Name)) { info->dev_name_len = sizeof(Peoject_Name); save_flag = 0x01; } if(strncmp((char *)info->dev_name,(char *)Peoject_Name,sizeof(Peoject_Name))) { memcpy((char *)info->dev_name,(char *)Peoject_Name,info->dev_name_len); save_flag = 0x01; } if(save_flag == 0x01) { EEPROM_WriteMCUDevInfo(info); } #endif }