| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- /*
- * @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();//设备信息初始化处理
- }
|