init.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #include "init.h"
  2. #include "chipflash.h"
  3. #include "crc.h"
  4. #include "soft_can.h"
  5. #include "timer.h"
  6. #include "math.h"
  7. _WS_INFO ws_info = {
  8. ._app_bin_size = 0xFFFFFFFF,
  9. ._compAddr = COMP_ADDR,
  10. ._hardVer = HARDVER,
  11. ._softVer = SOFT_VER,
  12. ._moduleID = MODULE_ID,
  13. ._bootFlag = BOOT_FLAG,
  14. };
  15. /*软重启判断*/
  16. static void Soft_Reset_Judge(void) {
  17. static uint8_t buf[8] = {0};
  18. flash_ops->Read_Flash(RESET_FLASH_BASE, buf, sizeof(buf));
  19. if (buf[0] == 0xFE) // 判断是否是软件重启
  20. {
  21. flash_ops->Erase_Flash(RESET_FLASH_BASE, RESET_FLASH_END);
  22. }
  23. }
  24. /* 读取FLASH波特率设置,0x1F4 = 500K,0x3E8 = 1000K */
  25. static void Set_Can_Baud(void) {
  26. uint8_t BaudBuf[2] = {0};
  27. uint16_t setbaudflag = 0;
  28. flash_ops->Read_Flash(CAN_FLASH_BASE, BaudBuf, sizeof(BaudBuf));
  29. setbaudflag = BaudBuf[1];
  30. setbaudflag = (setbaudflag << 8) + BaudBuf[0];
  31. if (0x1F4 == setbaudflag) {
  32. MX_CAN_Init(8);
  33. } else if (0x3E8 == setbaudflag) {
  34. MX_CAN_Init(4);
  35. } else {
  36. setbaudflag = 0x3E8;
  37. BaudBuf[0] = setbaudflag & 0xff;
  38. BaudBuf[1] = (setbaudflag & 0xff00) >> 8;
  39. flash_ops->Erase_Flash(CAN_FLASH_BASE, CAN_FLASH_END); // 默认重写0x3E8
  40. flash_ops->Write_Flash(CAN_FLASH_BASE, BaudBuf, sizeof(BaudBuf));
  41. MX_CAN_Init(4);
  42. }
  43. }
  44. /*需要升级*/
  45. void Write_Upgrade_Flag(void) {
  46. ws_info._bootFlag = BOOT_FLAG;
  47. flash_ops->Erase_Flash(PAR_FLASH_BASE_ADDR, PAR_FLASH_END_ADDR);
  48. flash_ops->Write_Flash(PAR_FLASH_BASE_ADDR, (uint8_t *)&ws_info,
  49. sizeof(ws_info));
  50. }
  51. /*重置升级标志位*/
  52. static void Reset_Upgrade(void) {
  53. flash_ops->Read_Flash(PAR_FLASH_BASE_ADDR, (uint8_t *)&ws_info,
  54. sizeof(ws_info));
  55. /*merge的时候合并冲突把这个标志位覆盖成了不存在升级!!引以为戒!*/
  56. #if OFF_SEL == 1
  57. if (ws_info._bootFlag != NOEXIST_UPGRADE_FLAG)
  58. #elif OFF_SEL == 2
  59. if (ws_info._bootFlag != UNUPGRADE)
  60. #else
  61. if (ws_info._bootFlag != UNUPGRADE)
  62. #endif
  63. {
  64. #if OFF_SEL == 1
  65. ws_info._bootFlag = NOEXIST_UPGRADE_FLAG;
  66. #elif OFF_SEL == 2
  67. ws_info._bootFlag = UNUPGRADE;
  68. #else
  69. ws_info._bootFlag = UNUPGRADE;
  70. #endif
  71. ws_info._app_bin_size = 0xFFFFFFFF, ws_info._compAddr = COMP_ADDR,
  72. ws_info._hardVer = HARDVER, ws_info._softVer = SOFT_VER,
  73. ws_info._moduleID = MODULE_ID,
  74. flash_ops->Erase_Flash(PAR_FLASH_BASE_ADDR, PAR_FLASH_END_ADDR);
  75. ws_info._crcCheck = Get_Crc16((uint8_t *)&ws_info, sizeof(ws_info) - 2);
  76. flash_ops->Write_Flash(PAR_FLASH_BASE_ADDR, (uint8_t *)&ws_info,
  77. sizeof(ws_info));
  78. }
  79. }
  80. static void Load_Param(void) {
  81. uint32_t v_check;
  82. uint32_t tmp_g;
  83. float tmp_k;
  84. uint8_t sensor_num_c = 0;
  85. WEIGHING_DEVICE *device = Get_Device_Handle();
  86. flash_ops->Read_Flash(VALUE_FLASH_Check_Addr, (uint8_t *)&v_check,
  87. sizeof(v_check));
  88. if (Value_Check == v_check) {
  89. flash_ops->Read_Flash(SENSOR_NUM_RECORD_BASE, (uint8_t *)&sensor_num_c,
  90. sizeof(sensor_num_c));
  91. if (sensor_num_c <= SENSOR_NUM) {
  92. device->sensor_num_mask = sensor_num_c;
  93. }
  94. for (sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++) {
  95. struct SENSOR *sensor = device->sensor[sensor_num_c];
  96. if (sensor_num_c == device->sensor_num_mask) {
  97. sensor->base_k = 0;
  98. continue;
  99. }
  100. flash_ops->Read_Flash(GROSSWEIGHT1_FLASH_BASE +
  101. sensor_num_c * ONE_WORD_SIZE,
  102. (uint8_t *)&tmp_g, sizeof(tmp_g));
  103. if (tmp_g != 0xFFFFFFFF && tmp_g != 0) {
  104. device->sensor[sensor_num_c]->GrossWeight = tmp_g;
  105. }
  106. }
  107. flash_ops->Read_Flash(K1_VALUE_FLASH_BASE,(uint8_t *)&tmp_k, sizeof(tmp_k));
  108. device->correct_k = tmp_k;
  109. flash_ops->Read_Flash(K1_VALUE_FLASH_BASE,(uint8_t *)&tmp_g, sizeof(tmp_k));
  110. if(tmp_g == 0xFFFFFFFF)
  111. {
  112. device->correct_k = 1;
  113. }
  114. }
  115. }
  116. static void Record_First_InitValue(void) {
  117. WEIGHING_DEVICE *device = Get_Device_Handle();
  118. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++) {
  119. if (sensor_num_c == device->sensor_num_mask) {
  120. continue;
  121. }
  122. struct SENSOR *sensor = device->sensor[sensor_num_c];
  123. flash_ops->Read_Flash(
  124. SENSOR1_INIT_VALUE_BASE + sensor_num_c * ONE_WORD_SIZE,
  125. (uint8_t *)&sensor->raw_init_value, sizeof(sensor->raw_init_value));
  126. if (sensor->raw_init_value == 0xFFFFFFFF) {
  127. sensor->raw_init_value = sensor->GrossWeight;
  128. flash_ops->Write_Flash(
  129. SENSOR1_INIT_VALUE_BASE + sensor_num_c * ONE_WORD_SIZE,
  130. (uint8_t *)&sensor->raw_init_value, sizeof(sensor->raw_init_value));
  131. }
  132. }
  133. }
  134. static void Get_Warn_Licence(void) {
  135. float read_tmp = 0;
  136. WEIGHING_DEVICE *device = Get_Device_Handle();
  137. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++) {
  138. struct SENSOR *sensor = device->sensor[sensor_num_c];
  139. if (sensor_num_c == device->sensor_num_mask) {
  140. continue;
  141. }
  142. flash_ops->Read_Flash(SENSOR1_INIT_VALUE_BASE +
  143. sensor_num_c * ONE_PARAM_SIZE,
  144. (uint8_t *)&read_tmp, sizeof(read_tmp));
  145. if(read_tmp < MIN_K || read_tmp > MAX_K)
  146. sensor->base_k = 112.0f;
  147. else
  148. sensor->base_k = read_tmp;
  149. // if (read_tmp <= 0x7FB000) {
  150. // sensor->init_flag = lower;
  151. // }
  152. // if (read_tmp >= 0x803000) {
  153. // sensor->init_flag = higher;
  154. // }
  155. // if (read_tmp >= 0x7FB000 && read_tmp <= 0x803000) {
  156. // sensor->init_flag = equal;
  157. // }
  158. }
  159. }
  160. static void Read_Params(void) {
  161. WEIGHING_DEVICE *device = Get_Device_Handle();
  162. device->_ops->get_allgrossweight();
  163. delay_us(200);
  164. Record_First_InitValue();
  165. Get_Warn_Licence(); //读基础K
  166. Load_Param();
  167. /*防止异常*/
  168. for (uint8_t sensor_num_c = 0; sensor_num_c < SENSOR_NUM; sensor_num_c++) {
  169. if (sensor_num_c == device->sensor_num_mask) {
  170. continue;
  171. }
  172. struct SENSOR *sensor = device->sensor[sensor_num_c];
  173. // if (sensor->K.f < MIN_K || sensor->K.f > MAX_K || sensor->K.i[0] == 0xff) {
  174. // sensor->K.f = 112.0f;
  175. // }
  176. }
  177. }
  178. void Device_Init(void) {
  179. WEIGHING_DEVICE *device = Get_Device_Handle();
  180. Reset_Upgrade();
  181. Set_Can_Baud();
  182. CAN_Init(CANTX_ID);
  183. device->_ops->filter_init();
  184. Read_Params();
  185. Soft_Reset_Judge();
  186. // 主动发送K值
  187. Set_Ack_Status(ack_e1);
  188. }