memory.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /*
  2. * @Description:
  3. * @Version: 2.0
  4. * @Author: Seven
  5. * @Date: 2022-08-23 17:34:29
  6. * @LastEditors: Seven
  7. * @LastEditTime: 2022-08-24 11:02:14
  8. */
  9. #include "memory.h"
  10. #include "includes.h"
  11. #include "lora.h"
  12. #include "gw_ctrl.h"
  13. #include "ota.h"
  14. uint32_t mcuID[3];
  15. uint8_t PCB_ver = 0x01;
  16. uint16_t mcu_type_ID = 0;
  17. uint32_t software_version_bootloader,reset_total_cnt,last_reset_flag;
  18. uint8_t Encrypt;
  19. eeprom_first_info_t eeprom_first_info;
  20. device_version_info_t device_version_info;
  21. updata_state_t updata_state_info;
  22. //读取UUID
  23. void get_mcu_uuid(void)
  24. {
  25. mcuID[0] = *(volatile uint32_t*)(GD32F10X_ID_ADDR);
  26. mcuID[1] = *(volatile uint32_t*)(GD32F10X_ID_ADDR+4);
  27. mcuID[2] = *(volatile uint32_t*)(GD32F10X_ID_ADDR+8);
  28. }
  29. //读mcu的类型
  30. void get_mcu_TypeIdcode(void)
  31. {
  32. uint32_t mcutypeID=0;
  33. mcutypeID = *(volatile uint32_t*)(GD32F10X_TYPE_ADDR);
  34. // g_firmwareMsg.gatewayMsg.verMsg.devicTypeID = (uint16_t)(mcutypeID&0xFFFF);
  35. mcu_type_ID = (uint16_t)(mcutypeID&0xFFFF);
  36. }
  37. //eeprom上电初始化处理
  38. void eeprom_init_handle(void)
  39. {
  40. uint8_t eeprom_buf[EECFG_NUM]={0};
  41. //将eeprom存储的共有数据全部读出
  42. AT24CXX_Read(EECFG_FIRST_INIT0,eeprom_buf,EECFG_NUM);
  43. memcpy(&eeprom_first_info,eeprom_buf,sizeof(eeprom_first_info_t));
  44. //读产测设置的信息
  45. memcpy(&device_info,&eeprom_buf[EECFG_INFO_ALRD_INIT],sizeof(device_info_t));
  46. //读设备版本信息
  47. memcpy(&device_version_info,&eeprom_buf[EECFG_BT_VER0],sizeof(device_version_info_t));
  48. //读Lora参数
  49. AT24CXX_Read(LORA_ADDR,(uint8_t *)eeprom_buf,2);
  50. if(eeprom_buf[0] != (uint8_t)~eeprom_buf[1])
  51. {
  52. eeprom_buf[0] = 0;
  53. eeprom_buf[1] = ~eeprom_buf[0];
  54. AT24CXX_Write(LORA_ADDR,(uint8_t *)eeprom_buf,2);
  55. }
  56. else if(eeprom_buf[0] > LORA_GROUP_NUM-1)
  57. {
  58. eeprom_buf[0] = 0;
  59. eeprom_buf[1] = ~eeprom_buf[0];
  60. AT24CXX_Write(LORA_ADDR,(uint8_t *)eeprom_buf,2);
  61. }
  62. lora_para_choice = eeprom_buf[0];
  63. //读pos切换次数
  64. // AT24CXX_Read(POS_CHANGE_ADDR,(uint8_t *)&pos_change,sizeof(pos_change_t));
  65. // printf("pos1 num:%d, pos2 num:%d\n",pos_change.pos1_num,pos_change.pos2_num);
  66. }
  67. //设备信息初始化处理
  68. void device_info_init_handle(void)
  69. {
  70. //判断出厂信息是否已初始化
  71. if(device_info.alrd == DEVICE_ALRD)//已初始化
  72. {
  73. device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  74. }
  75. else
  76. {
  77. device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
  78. //未初始化时,将设备sn置为0xffffffff;设备类型是默认的
  79. device_info.device_sn = 0xffffffff;
  80. device_info.device_type = (SOFTWARE_VERSION_APP&0xffff0000)>>16;
  81. }
  82. //判断app1版本是否正确
  83. if(device_version_info.APP1_ver != SOFTWARE_VERSION_APP)
  84. {
  85. device_version_info.APP1_ver = SOFTWARE_VERSION_APP;
  86. //存储到eeprom中
  87. AT24CXX_Write(EECFG_APP1_VER0,(uint8_t *)&device_version_info.APP1_ver,4);
  88. }
  89. //设置设备的固定信息
  90. device_fixed_info_init();
  91. }
  92. //设备固定信息初始化
  93. void device_fixed_info_init(void)
  94. {
  95. device_fixed_info.Soft_ver_app = SOFTWARE_VERSION_APP;
  96. device_fixed_info.Soft_ver_boot = device_version_info.boot_ver;
  97. device_fixed_info.MCU_Type_ID = mcu_type_ID;
  98. device_fixed_info.Reset_total_cnt = eeprom_first_info.reset_total_num;
  99. device_fixed_info.Last_reset_flag = last_reset_flag;
  100. // device_fixed_info.Encrypt = Encrypt;
  101. memcpy(device_fixed_info.MCU_UUID,(uint8_t *)mcuID,12);
  102. }
  103. //设置升级标志
  104. uint16_t set_updata_state(uint16_t data)
  105. {
  106. uint16_t temp_data,ret_data = 0;
  107. uint16_t temp_h,temp_l;
  108. temp_data = data;
  109. temp_h = ((~temp_data)<<8)&0xff00;
  110. temp_l = temp_data&0x00ff;
  111. ret_data = temp_h | temp_l;
  112. return ret_data;
  113. }
  114. //判断升级标志
  115. uint8_t updata_state_cmp(uint16_t data)
  116. {
  117. uint8_t ret = 0;
  118. uint16_t temp_data;
  119. uint8_t temp_h,temp_l;
  120. temp_data = data;
  121. temp_h = (uint8_t)((temp_data&0xff00)>>8);
  122. temp_l = (uint8_t)(temp_data&0x00ff);
  123. if((temp_h^temp_l) == 0xff)
  124. {
  125. ret = 1;
  126. }
  127. return ret;
  128. }
  129. //读升级标志
  130. void Read_Updata_State(void)
  131. {
  132. /*BKP_DR2->升级标志
  133. BKP_DR3->升级状态
  134. BKP_DR4->显示屏升级标志
  135. BKP_DR5->显示屏升级次数
  136. */
  137. // uint8_t temp;
  138. uint16_t data_dr2 = 0, data_dr3 = 0/*,data_dr4 = 0,data_dr5 = 0*/;
  139. data_dr2 = BKP_ReadBackupRegister(BKP_DR2);
  140. printf("\nBKP_DR2:%04x\n",data_dr2);
  141. if(updata_state_cmp(data_dr2))
  142. {
  143. if((data_dr2 & 0x00ff) == BACKOFF_FLAG)//升级成功
  144. {
  145. BKP_WriteBackupRegister(BKP_DR2, 0x0000); //向指定的后备寄存器中写入用户程序数据
  146. updata_state_save(UPDATA_SUCCESS);
  147. device_fixed_info.slave_uploade_start = 1;
  148. }
  149. else if((data_dr2 & 0x00ff) == BACKOFF_OVER)//回退成功
  150. {
  151. BKP_WriteBackupRegister(BKP_DR2, 0x0000); //向指定的后备寄存器中写入用户程序数据
  152. updata_state_save(UPDATA_BACK);
  153. device_fixed_info.slave_uploade_start = 1;
  154. }
  155. else
  156. {
  157. BKP_WriteBackupRegister(BKP_DR2, 0x0000); //向指定的后备寄存器中写入用户程序数据
  158. data_dr3 = BKP_ReadBackupRegister(BKP_DR3);
  159. updata_state = data_dr3&0x00ff;
  160. }
  161. }
  162. else
  163. {
  164. BKP_WriteBackupRegister(BKP_DR2, 0x0000); //向指定的后备寄存器中写入用户程序数据
  165. data_dr3 = BKP_ReadBackupRegister(BKP_DR3);
  166. updata_state = data_dr3&0x00ff;
  167. }
  168. // data_dr4 = BKP_ReadBackupRegister(BKP_DR4);
  169. // printf("dr4=%04x\n",data_dr4);
  170. // if(updata_state_cmp(data_dr4))
  171. // {
  172. // if((data_dr4 & 0x00ff) == XSP_UPDATE)//升级显示屏
  173. // {
  174. // data_dr5 = BKP_ReadBackupRegister(BKP_DR5);
  175. // printf("dr5=%04x\n",data_dr5);
  176. // if(updata_state_cmp(data_dr5))
  177. // {
  178. // if((data_dr5 & 0x00ff) < 3)//升级显示屏
  179. // {
  180. // temp = data_dr5 & 0x00ff;
  181. // BKP_WriteBackupRegister_code(BKP_DR5,temp+1);
  182. // device_fixed_info.xsp_update_start = 1;
  183. // }
  184. // else
  185. // {
  186. // //清除显示屏升级标志
  187. // BKP_WriteBackupRegister_code(BKP_DR4,0);
  188. // //显示屏升级次数存储
  189. // BKP_WriteBackupRegister_code(BKP_DR5,0);
  190. // }
  191. // }
  192. // else
  193. // {
  194. // //清除显示屏升级标志
  195. // BKP_WriteBackupRegister_code(BKP_DR4,0);
  196. // //显示屏升级次数存储
  197. // BKP_WriteBackupRegister_code(BKP_DR5,0);
  198. // }
  199. // }
  200. // }
  201. }
  202. //读取复位类型
  203. uint8_t reset_flag_get(void)
  204. {
  205. uint32_t rstflag = 0;
  206. uint8_t RestFlag = 0;
  207. rstflag = RCC->CSR;
  208. rstflag = (rstflag>>26);
  209. RestFlag = rstflag&0x0000003F;
  210. RCC_ClearFlag();//清楚复位状态标志位
  211. return RestFlag;
  212. }
  213. //更新设备产测信息
  214. void device_info_update(void)
  215. {
  216. AT24CXX_Write(EECFG_INFO_ALRD_INIT,(uint8_t *)&device_info,sizeof(device_info));
  217. }
  218. //读取eeprom中的设备产测信息
  219. void device_info_get(void)
  220. {
  221. memset(&device_info,0,sizeof(device_info_t));
  222. AT24CXX_Read(EECFG_INFO_ALRD_INIT,(uint8_t *)&device_info,sizeof(device_info_t));
  223. }
  224. //写eeprom
  225. void eeprom_write_data(uint32_t WriteAddr,uint8_t *pBuffer,uint16_t NumToWrite)
  226. {
  227. AT24CXX_Write(WriteAddr, pBuffer, NumToWrite);
  228. }
  229. //设备上电后信息读取
  230. void power_on_read(void)
  231. {
  232. I2C_init();
  233. get_mcu_uuid();//读取UUID
  234. get_mcu_TypeIdcode();//读mcu的类型
  235. Read_Updata_State();//读升级标志
  236. last_reset_flag = reset_flag_get();//读取复位类型
  237. eeprom_init_handle();//eeprom上电初始化处理
  238. device_info_init_handle();//设备信息初始化处理
  239. }