/* * @Description: * @Version: 2.0 * @Author: Seven * @Date: 2022-08-23 17:34:29 * @LastEditors: Seven * @LastEditTime: 2022-08-24 11:02:14 */ #include "memory.h" #include "includes.h" #include "lora.h" #include "gw_ctrl.h" #include "ota.h" uint32_t mcuID[3]; uint8_t PCB_ver = 0x01; uint16_t mcu_type_ID = 0; uint32_t software_version_bootloader,reset_total_cnt,last_reset_flag; uint8_t Encrypt; eeprom_first_info_t eeprom_first_info; device_version_info_t device_version_info; updata_state_t updata_state_info; //读取UUID void get_mcu_uuid(void) { mcuID[0] = *(volatile uint32_t*)(GD32F10X_ID_ADDR); mcuID[1] = *(volatile uint32_t*)(GD32F10X_ID_ADDR+4); mcuID[2] = *(volatile uint32_t*)(GD32F10X_ID_ADDR+8); } //读mcu的类型 void get_mcu_TypeIdcode(void) { uint32_t mcutypeID=0; mcutypeID = *(volatile uint32_t*)(GD32F10X_TYPE_ADDR); // g_firmwareMsg.gatewayMsg.verMsg.devicTypeID = (uint16_t)(mcutypeID&0xFFFF); mcu_type_ID = (uint16_t)(mcutypeID&0xFFFF); } //eeprom上电初始化处理 void eeprom_init_handle(void) { uint8_t eeprom_buf[EECFG_NUM]={0}; //将eeprom存储的共有数据全部读出 AT24CXX_Read(EECFG_FIRST_INIT0,eeprom_buf,EECFG_NUM); memcpy(&eeprom_first_info,eeprom_buf,sizeof(eeprom_first_info_t)); //读产测设置的信息 memcpy(&device_info,&eeprom_buf[EECFG_INFO_ALRD_INIT],sizeof(device_info_t)); //读设备版本信息 memcpy(&device_version_info,&eeprom_buf[EECFG_BT_VER0],sizeof(device_version_info_t)); //读Lora参数 AT24CXX_Read(LORA_ADDR,(uint8_t *)eeprom_buf,2); if(eeprom_buf[0] != (uint8_t)~eeprom_buf[1]) { eeprom_buf[0] = 0; eeprom_buf[1] = ~eeprom_buf[0]; AT24CXX_Write(LORA_ADDR,(uint8_t *)eeprom_buf,2); } else if(eeprom_buf[0] > LORA_GROUP_NUM-1) { eeprom_buf[0] = 0; eeprom_buf[1] = ~eeprom_buf[0]; AT24CXX_Write(LORA_ADDR,(uint8_t *)eeprom_buf,2); } lora_para_choice = eeprom_buf[0]; //读pos切换次数 // AT24CXX_Read(POS_CHANGE_ADDR,(uint8_t *)&pos_change,sizeof(pos_change_t)); // printf("pos1 num:%d, pos2 num:%d\n",pos_change.pos1_num,pos_change.pos2_num); } //设备信息初始化处理 void device_info_init_handle(void) { //判断出厂信息是否已初始化 if(device_info.alrd == DEVICE_ALRD)//已初始化 { device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL; } else { device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT; //未初始化时,将设备sn置为0xffffffff;设备类型是默认的 device_info.device_sn = 0xffffffff; device_info.device_type = (SOFTWARE_VERSION_APP&0xffff0000)>>16; } //判断app1版本是否正确 if(device_version_info.APP1_ver != SOFTWARE_VERSION_APP) { device_version_info.APP1_ver = SOFTWARE_VERSION_APP; //存储到eeprom中 AT24CXX_Write(EECFG_APP1_VER0,(uint8_t *)&device_version_info.APP1_ver,4); } //设置设备的固定信息 device_fixed_info_init(); } //设备固定信息初始化 void device_fixed_info_init(void) { device_fixed_info.Soft_ver_app = SOFTWARE_VERSION_APP; device_fixed_info.Soft_ver_boot = device_version_info.boot_ver; device_fixed_info.MCU_Type_ID = mcu_type_ID; device_fixed_info.Reset_total_cnt = eeprom_first_info.reset_total_num; device_fixed_info.Last_reset_flag = last_reset_flag; // device_fixed_info.Encrypt = Encrypt; memcpy(device_fixed_info.MCU_UUID,(uint8_t *)mcuID,12); } //设置升级标志 uint16_t set_updata_state(uint16_t data) { uint16_t temp_data,ret_data = 0; uint16_t temp_h,temp_l; temp_data = data; temp_h = ((~temp_data)<<8)&0xff00; temp_l = temp_data&0x00ff; ret_data = temp_h | temp_l; return ret_data; } //判断升级标志 uint8_t updata_state_cmp(uint16_t data) { uint8_t ret = 0; uint16_t temp_data; uint8_t temp_h,temp_l; temp_data = data; temp_h = (uint8_t)((temp_data&0xff00)>>8); temp_l = (uint8_t)(temp_data&0x00ff); if((temp_h^temp_l) == 0xff) { ret = 1; } return ret; } //读升级标志 void Read_Updata_State(void) { /*BKP_DR2->升级标志 BKP_DR3->升级状态 BKP_DR4->显示屏升级标志 BKP_DR5->显示屏升级次数 */ // uint8_t temp; uint16_t data_dr2 = 0, data_dr3 = 0/*,data_dr4 = 0,data_dr5 = 0*/; data_dr2 = BKP_ReadBackupRegister(BKP_DR2); printf("\nBKP_DR2:%04x\n",data_dr2); if(updata_state_cmp(data_dr2)) { if((data_dr2 & 0x00ff) == BACKOFF_FLAG)//升级成功 { BKP_WriteBackupRegister(BKP_DR2, 0x0000); //向指定的后备寄存器中写入用户程序数据 updata_state_save(UPDATA_SUCCESS); device_fixed_info.slave_uploade_start = 1; } else if((data_dr2 & 0x00ff) == BACKOFF_OVER)//回退成功 { BKP_WriteBackupRegister(BKP_DR2, 0x0000); //向指定的后备寄存器中写入用户程序数据 updata_state_save(UPDATA_BACK); device_fixed_info.slave_uploade_start = 1; } else { BKP_WriteBackupRegister(BKP_DR2, 0x0000); //向指定的后备寄存器中写入用户程序数据 data_dr3 = BKP_ReadBackupRegister(BKP_DR3); updata_state = data_dr3&0x00ff; } } else { BKP_WriteBackupRegister(BKP_DR2, 0x0000); //向指定的后备寄存器中写入用户程序数据 data_dr3 = BKP_ReadBackupRegister(BKP_DR3); updata_state = data_dr3&0x00ff; } // data_dr4 = BKP_ReadBackupRegister(BKP_DR4); // printf("dr4=%04x\n",data_dr4); // if(updata_state_cmp(data_dr4)) // { // if((data_dr4 & 0x00ff) == XSP_UPDATE)//升级显示屏 // { // data_dr5 = BKP_ReadBackupRegister(BKP_DR5); // printf("dr5=%04x\n",data_dr5); // if(updata_state_cmp(data_dr5)) // { // if((data_dr5 & 0x00ff) < 3)//升级显示屏 // { // temp = data_dr5 & 0x00ff; // BKP_WriteBackupRegister_code(BKP_DR5,temp+1); // device_fixed_info.xsp_update_start = 1; // } // else // { // //清除显示屏升级标志 // BKP_WriteBackupRegister_code(BKP_DR4,0); // //显示屏升级次数存储 // BKP_WriteBackupRegister_code(BKP_DR5,0); // } // } // else // { // //清除显示屏升级标志 // BKP_WriteBackupRegister_code(BKP_DR4,0); // //显示屏升级次数存储 // BKP_WriteBackupRegister_code(BKP_DR5,0); // } // } // } } //读取复位类型 uint8_t reset_flag_get(void) { uint32_t rstflag = 0; uint8_t RestFlag = 0; rstflag = RCC->CSR; rstflag = (rstflag>>26); RestFlag = rstflag&0x0000003F; RCC_ClearFlag();//清楚复位状态标志位 return RestFlag; } //更新设备产测信息 void device_info_update(void) { AT24CXX_Write(EECFG_INFO_ALRD_INIT,(uint8_t *)&device_info,sizeof(device_info)); } //读取eeprom中的设备产测信息 void device_info_get(void) { memset(&device_info,0,sizeof(device_info_t)); AT24CXX_Read(EECFG_INFO_ALRD_INIT,(uint8_t *)&device_info,sizeof(device_info_t)); } //写eeprom void eeprom_write_data(uint32_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite) { AT24CXX_Write(WriteAddr, pBuffer, NumToWrite); } //设备上电后信息读取 void power_on_read(void) { I2C_init(); get_mcu_uuid();//读取UUID get_mcu_TypeIdcode();//读mcu的类型 Read_Updata_State();//读升级标志 last_reset_flag = reset_flag_get();//读取复位类型 eeprom_init_handle();//eeprom上电初始化处理 device_info_init_handle();//设备信息初始化处理 }