public.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549
  1. #include "public.h"
  2. #include <string.h>
  3. #include "../Hardware/boardinit.h"
  4. #include "air780e.h"
  5. #include "ota_update.h"
  6. #include "gd32f10x.h"
  7. #include "xspDataOpt.h"
  8. typedef void (*otafun)(void); //定义一个函数类型的参数.
  9. otafun jump2_pt_app;
  10. DevMsg g_devMsg;
  11. DevFirmMsg g_devfirmMsg;
  12. nodeRun_t g_runNode;
  13. DevAppVersion g_devAppVer;
  14. Up7segData g_up7segData;
  15. sysCmd1027 g_table1027;
  16. sysCmd1027 g_temtable1027; // 临时表
  17. LogMsg g_logMsg;
  18. void init_dev_msg(void)
  19. {
  20. g_devMsg.devType = DEV_TYPE;
  21. g_devMsg.devSn = 0x08;
  22. }
  23. /*---------------------------------------------------------------------------------
  24. * 上电读取UUID
  25. * ---------------------------------------------------------------------------------*/
  26. void power_up_read_uuid(void)
  27. {
  28. memcpy(g_devfirmMsg.uuid,(uint8_t*)(0x1FFFF7E8),12);
  29. }
  30. void printf_dev_msg(void)
  31. {
  32. uint8_t i = 0;
  33. g_devResetMsg.resetflag = power_up_system_resettype(); // 读取上电的复位类型
  34. power_up_read_uuid();
  35. printf("dev_type:0x%04x\r\n",g_devMsg.devType);
  36. printf("dev_sn :%010u\r\n",g_devMsg.devSn);
  37. printf("app1Ver :%08x\r\n",g_devAppVer.app1Ver);
  38. printf("app2Ver :%08x\r\n",g_devAppVer.app2Ver);
  39. printf("app3Ver :%08x\r\n",g_devAppVer.app3Ver);
  40. printf("bootVer :%08x\r\n",g_devAppVer.bootVer);
  41. printf("ptVer :%08x\r\n",g_devAppVer.ptVer);
  42. printf("resetnum: %u\r\n",g_devResetMsg.resetNum);
  43. printf("work_mode: %d\r\n",g_devMsg.workMode);
  44. printf("timer : %u\r\n",rtc_counter_get());
  45. printf("uuid = ");
  46. for(i=0;i<12;i++){
  47. printf("%02x ",g_devfirmMsg.uuid[i]);
  48. }
  49. printf("\r\n");
  50. }
  51. /*-----------------------------------------------------------------------------
  52. * 检查设备类型以及SN是否是设备本身的
  53. * 返回值 1: 本设备 0: 错误
  54. * ----------------------------------------------------------------------------*/
  55. uint8_t check_dev_type_sn(uint16_t devType, uint32_t devSn)
  56. {
  57. if(devType == g_devMsg.devType){
  58. if(devSn == g_devMsg.devSn) return 1;
  59. else if(0xFFFFFFFF == devSn) return 1;
  60. else return 0;
  61. }
  62. else return 0;
  63. }
  64. uint8_t check_dev_type_sn01(uint16_t devType, uint32_t devSn)
  65. {
  66. if(devType==g_devMsg.devType && devSn==g_devMsg.devSn) return 1;
  67. else if((0xFFFFFFFF == devSn) && (0xFFFF ==devType) ) return 1;
  68. else if(0xFFFF == devType){
  69. if(devSn==g_devMsg.devSn) return 1;
  70. else return 0;
  71. }
  72. else if(0xFFFFFFFF == devSn) {
  73. if(devType == g_devMsg.devType) return 1;
  74. else return 0;
  75. }
  76. else return 0;
  77. }
  78. /*--------------------------------------------------------------------------------
  79. * crc_16 校验
  80. * -------------------------------------------------------------------------------*/
  81. uint16_t crc16_get(uint8_t *data, uint8_t size)
  82. {
  83. uint16_t crc=0;
  84. int i;
  85. for(i = 0; i < size; i++)
  86. {
  87. crc += data[i];
  88. }
  89. return crc;
  90. }
  91. uint16_t _crc16_get(uint8_t *_buff,uint32_t _len)
  92. {
  93. uint32_t i,j;
  94. uint16_t crc;
  95. uint16_t temp;
  96. crc=(uint16_t)CRC_INIT_VALUE;
  97. for(i=0;i<_len;i++) {
  98. temp=_buff[i];
  99. temp &=0x00FF;
  100. crc^=temp;
  101. for(j=0;j<8;j++) {
  102. if((crc&0x0001)!=0x00) {
  103. crc>>=1;
  104. crc^=0xA001;
  105. } else {
  106. crc>>=1;
  107. }
  108. }
  109. }
  110. return crc;
  111. }
  112. /*--------------------------------------------------------------------------------
  113. * 转义
  114. * 帧中除了帧头为 BB 外,不再出现 BB,如果出现 BB 则转义为
  115. BA 01;如果出现 BA 则转义为 BA 00;帧长度和校验码都按转义前
  116. 来计算。
  117. * -------------------------------------------------------------------------------*/
  118. int _ytsf_data_code(uint8_t *buff, uint8_t *len)
  119. {
  120. uint8_t buff_code[128];
  121. uint8_t i, tlen = 0;
  122. for(i = 0;i < *len; i ++){
  123. if(buff[i] == 0xba){
  124. buff_code[tlen++] = 0xba;
  125. buff_code[tlen++] = 0x00;
  126. } else if(i&&buff[i] == 0xbb){
  127. buff_code[tlen++] = 0xba;
  128. buff_code[tlen++] = 0x01;
  129. }
  130. else{
  131. buff_code[tlen++] = buff[i];
  132. }
  133. }
  134. memcpy(buff, buff_code, tlen);
  135. *len = tlen;
  136. return 0;
  137. }
  138. /*--------------------------------------------------------------------------------
  139. * 反转义
  140. * 帧中除了帧头为 BB 外,不再出现 BB,如果出现 BB 则转义为
  141. BA 01;如果出现 BA 则转义为 BA 00;帧长度和校验码都按转义前
  142. 来计算。
  143. * -------------------------------------------------------------------------------*/
  144. int _ytsf_data_decode(uint8_t *buff, uint8_t *len)
  145. {
  146. uint8_t buff_code[128];
  147. uint8_t i, tlen = 0;
  148. for(i = 0;i < *len; i ++){
  149. if((buff[i] == 0xba)&&(buff[i+1] == 0x00)) {
  150. buff_code[tlen++] = 0xba;
  151. i += 1;
  152. } else if((buff[i] == 0xba)&&(buff[i+1] == 0x01)){
  153. buff_code[tlen++] = 0xbb;
  154. i += 1;
  155. }
  156. else{
  157. buff_code[tlen++] = buff[i];
  158. }
  159. }
  160. memcpy(buff, buff_code, tlen);
  161. *len = tlen;
  162. return 0;
  163. }
  164. /*---------------------------------------------------------------------------
  165. * 设置升级标志(设置标记高位取反)
  166. * 将一个数设置为高八位是第八位的取反
  167. * --------------------------------------------------------------------------*/
  168. uint16_t set_updata_state(uint16_t data)
  169. {
  170. uint16_t temp_data,ret_data = 0;
  171. uint16_t temp_h,temp_l;
  172. temp_data = data;
  173. temp_h = ((~temp_data)<<8)&0xff00;
  174. temp_l = temp_data&0x00ff;
  175. ret_data = temp_h | temp_l;
  176. return ret_data;
  177. }
  178. /*-------------------------------------------------------------------------------
  179. * 判断升级标志的本体和掩码
  180. * 标记高位取反判断
  181. * ------------------------------------------------------------------------------*/
  182. uint8_t updata_state_cmp(uint16_t data)
  183. {
  184. uint8_t ret = 0;
  185. uint16_t temp_data;
  186. uint8_t temp_h,temp_l;
  187. temp_data = data;
  188. temp_h = (uint8_t)((temp_data&0xff00)>>8);
  189. temp_l = (uint8_t)(temp_data&0x00ff);
  190. if((temp_h^temp_l) == 0xff)
  191. {
  192. ret = 1;
  193. }
  194. return ret;
  195. }
  196. /*------------------------------------------------------------------------------------------
  197. *对app进行校验
  198. *参数:addr:app首地址
  199. * len: app长度
  200. * checkdata:计算的crc值
  201. *返回:0:校验正确,1:校验失败
  202. *-------------------------------------------------------------------------------------------*/
  203. void app_check_crc(uint32_t addr, uint32_t len, uint32_t *checkdata)
  204. {
  205. uint32_t datalen,read_crc,get_crc;
  206. datalen = Flash_DatalenRead(addr,len);
  207. read_crc = *(uint32_t*)(addr + datalen-4); //CRC校验
  208. rcu_periph_clock_enable(RCU_CRC); //打开crc时钟
  209. crc_data_register_reset(); //复位crc数据寄存器
  210. get_crc = crc_block_data_calculate((uint32_t*)addr,(datalen -4)/4);//计算crc数值
  211. rcu_periph_clock_disable(RCU_CRC); //关闭crc时钟
  212. *checkdata = get_crc;
  213. if(read_crc != get_crc)
  214. {
  215. return; //ret = 1;
  216. }
  217. return;// ret;
  218. }
  219. /*--------------------------------------------------------------------------
  220. * 读取复位次数
  221. * -------------------------------------------------------------------------*/
  222. void epprom_read_reset_num(void)
  223. {
  224. uint32_t resetnum = 0;
  225. epprom_read(DEV_RESET_NUM,(uint8_t*)&resetnum,4);
  226. g_devResetMsg.resetNum = resetnum;
  227. }
  228. /*----------------------------------------------------------------------------
  229. * 初始化、读取 、 写入 路由表到EPPROm中
  230. * ---------------------------------------------------------------------------*/
  231. void epprom_init_config_table(void)
  232. {
  233. uint8_t buff[128] = {0};
  234. g_runNode.slaveNum = 0x00;
  235. memset(g_runNode.nodMsg,0,sizeof(nodeMsg_t));
  236. epprom_write((uint32_t)CONFIGTABLE_ADDR,buff,128);
  237. }
  238. void epprom_read_config_table(void)
  239. {
  240. uint8_t buff[128] = {0},len,i;
  241. uint8_t *pbuff = buff;
  242. nodeMsg_t *pNode = NULL;
  243. epprom_read((uint32_t)CONFIGTABLE_ADDR,&g_runNode.slaveNum,1); // 读取从设备的个数
  244. printf("config_table_num = %d\r\n",g_runNode.slaveNum);
  245. if(g_runNode.slaveNum >16) return;
  246. len = g_runNode.slaveNum*8+1;
  247. epprom_read((uint32_t)CONFIGTABLE_ADDR,buff,len);
  248. pbuff++;
  249. for(i=0;i<g_runNode.slaveNum;i++){
  250. pNode = &g_runNode.nodMsg[i];
  251. pNode->devType = *(uint16_t*)pbuff;
  252. pbuff += 2;
  253. pNode->devSn = *(uint32_t*)pbuff;
  254. pbuff += 4;
  255. pbuff += 2; // 预留
  256. if((pNode->devType == g_devMsg.devType) &&(pNode->devSn == g_devMsg.devSn)){
  257. pNode->bSelf = 1;
  258. pNode->status = 1;
  259. }
  260. else {
  261. pNode->bSelf = 0;
  262. pNode->status = 0;
  263. }
  264. pNode->readCount = 0;
  265. printf("slave_table type = %04x, sn = %010u bself=%d\r\n",pNode->devType,pNode->devSn,pNode->bSelf);
  266. }
  267. }
  268. void epprom_write_config_table(uint8_t *data, uint8_t len)
  269. {
  270. epprom_write((uint32_t)CONFIGTABLE_ADDR,data,len);
  271. }
  272. /*-----------------------------------------------------------------------------------------
  273. * com 端的配置文件的初始化 读取 写入
  274. * ----------------------------------------------------------------------------------------*/
  275. void epprom_init_com_config(void)
  276. {
  277. }
  278. void epprom_read_com_config(void)
  279. {
  280. uint8_t buff[128] = {0},len;
  281. uint8_t portIndex,pinIndex;
  282. sysCmd1026 *msg = (sysCmd1026*)buff;
  283. len = sizeof(sysCmd1026);
  284. epprom_read((uint32_t)COMM_CONFIG_ADDR,buff,len);
  285. portIndex = msg->param[0][2];
  286. if((3==portIndex) ||(4==portIndex)) {
  287. switch(portIndex){
  288. case 3:
  289. g_extimsg.csGroup = GPIOD; break;
  290. case 4:
  291. g_extimsg.csGroup = GPIOE; break;
  292. default:
  293. g_extimsg.csGroup = GPIOD; break;
  294. }
  295. g_extimsg.outputPort = portIndex;
  296. pinIndex = msg->param[0][3];
  297. g_extimsg.csPin = BIT(pinIndex);
  298. g_extimsg.extiLine = BIT(pinIndex);
  299. g_extimsg.extiPin = BIT(pinIndex);
  300. g_extimsg.extiPinSource = pinIndex;
  301. if(pinIndex>=5 && pinIndex<=9) {
  302. g_extimsg.extiIRQn = EXTI5_9_IRQn;
  303. }
  304. printf(" com config msg port = %d, pin=%d\r\n",portIndex,pinIndex);
  305. }
  306. else {
  307. g_extimsg.csGroup = GPIOD;
  308. g_extimsg.csPin = GPIO_PIN_6;
  309. g_extimsg.extiIRQn = EXTI5_9_IRQn;
  310. g_extimsg.extiLine = EXTI_6;
  311. g_extimsg.extiPinSource = GPIO_PIN_SOURCE_6;
  312. g_extimsg.extiPin = GPIO_PIN_6;
  313. g_extimsg.outputPort = 3;
  314. printf(" com config msg default\r\n");
  315. }
  316. }
  317. void epprom_write_com_config(uint8_t *data, uint8_t len)
  318. {
  319. epprom_write((uint32_t)COMM_CONFIG_ADDR,data,len);
  320. }
  321. /*-----------------------------------------------------------------------------------------
  322. * 探针板的管脚的配置文件的初始化 读取 写入
  323. * ----------------------------------------------------------------------------------------*/
  324. void epprom_init_pin_config(void)
  325. {
  326. memset(&g_table1027,0,sizeof(sysCmd1027));
  327. }
  328. void epprom_read_pin_config(void)
  329. {
  330. epprom_read((uint32_t)PIN_CONFIG_ADDR,(uint8_t*)&g_table1027,sizeof(sysCmd1027));
  331. printf("table msg pointDev = 0x%04x,group = %d\r\n",g_table1027.appointDevModel,g_table1027.groupNum);
  332. }
  333. void epprom_write_pin_config(uint8_t *data, uint16_t len)
  334. {
  335. epprom_write((uint32_t)PIN_CONFIG_ADDR,data,len);
  336. }
  337. /*-----------------------------------------------------------------
  338. * 读取设备的基本信息
  339. * ----------------------------------------------------------------*/
  340. void epprom_read_dev_app_version(void)
  341. {
  342. epprom_read((uint32_t)DEV_APP_VER,(uint8_t*)&g_devAppVer,sizeof(DevAppVersion));
  343. if(g_devAppVer.app1Ver != APP_VERSION){
  344. g_devAppVer.app1Ver = APP_VERSION;
  345. epprom_write((uint32_t)DEV_APP_VER,(uint8_t*)&g_devAppVer,sizeof(DevAppVersion));
  346. }
  347. }
  348. void eeprom_read_mqtt_msg(void)
  349. {
  350. epprom_read((uint32_t)DEV_READ_MQTT_MSG,(uint8_t*)&g_mqttMsg,sizeof(MqttMsg));
  351. }
  352. void eeprom_write_mqtt_msg(uint8_t *msg,uint16_t len)
  353. {
  354. g_mqttCHmsg.mqttMsg.flag = 1;
  355. epprom_write((uint32_t)DEV_READ_MQTT_MSG,(uint8_t*)msg,len);
  356. }
  357. /*----------------------------------------------------
  358. * 工作模式
  359. * ----------------------------------------------------*/
  360. void reset_work_mode(void)
  361. {
  362. if(g_devPtMsg.binit == 0x01){
  363. g_devMsg.workMode = WORK_NORMAL;
  364. g_devMsg.ledgreen = 1;
  365. g_devMsg.ledred = 0;
  366. }
  367. else{
  368. g_devMsg.ledgreen = 3;
  369. g_devMsg.ledred = 1;
  370. g_devMsg.workMode = WORK_NOINIT;
  371. }
  372. }
  373. /*------------------------------------------------------------------------------------------
  374. * 上电读取设备类型
  375. * -----------------------------------------------------------------------------------------*/
  376. void epprom_power_up_deal(void)
  377. {
  378. uint8_t num = 0;
  379. epprom_read_dev_app_version();
  380. num = (g_devAppVer.app1Ver&0x03);
  381. g_devMsg.ledred = (num == 0) ? 4: num;
  382. g_devMsg.ledgreen = 4;
  383. epprom_read(0,(uint8_t*)&g_devPtMsg,sizeof(DevPtMsg));
  384. g_devMsg.devType = DEV_TYPE;//g_devPtMsg.devType1;
  385. g_devMsg.devSn = g_devPtMsg.devSn;
  386. epprom_read_reset_num();
  387. epprom_read_config_table(); // 上电时不需要读取路由表,收到是主的身份时再读取
  388. // epprom_read_pin_config();
  389. start_delay_ms(3000);
  390. do{
  391. if((g_devMsg.ledgreen == 0x06)) break;
  392. }while(!g_iDelayfinish);
  393. stop_delay_ms();
  394. if(g_devPtMsg.binit == 0x01){
  395. g_devMsg.workMode = WORK_NORMAL;
  396. g_devMsg.ledgreen = 1;
  397. g_devMsg.ledred = 0;
  398. }
  399. else{
  400. g_devMsg.ledgreen = 3;
  401. g_devMsg.ledred = 1;
  402. g_devMsg.workMode = WORK_NOINIT;
  403. }
  404. }
  405. /////////////////////////////////////////////////////////////////////////////
  406. //设置栈顶地址
  407. __asm void MSR_MSP(u32 addr)
  408. {
  409. MSR MSP, r0 //set Main Stack value
  410. MSR PSP, r0 //set Main Stack value
  411. BX r14
  412. }
  413. //THUMB指令不支持汇编内联
  414. //采用如下方法实现执行汇编指令WFI
  415. void WFI_SET(void)
  416. {
  417. __ASM volatile("wfi");
  418. }
  419. //关闭所有中断
  420. void INTX_DISABLE(void)
  421. {
  422. __ASM volatile("cpsid i");
  423. }
  424. //开启所有中断
  425. void INTX_ENABLE(void)
  426. {
  427. __ASM volatile("cpsie i");
  428. }
  429. typedef void (*usercode)(void);
  430. usercode EnterApp;
  431. //关中断
  432. void nvic_disable(void)
  433. {
  434. int irq;
  435. __disable_irq();
  436. for (irq = RTC_IRQn; irq <= DMA1_Channel3_Channel4_IRQn; irq++)
  437. {
  438. NVIC_DisableIRQ(irq);
  439. NVIC_ClearPendingIRQ(irq);
  440. }
  441. }
  442. //运行pt
  443. uint32_t run_pt(void)
  444. {
  445. uint32_t appxaddr=OTA_UPDATE_PT_FLASH_START_ADDR;//OTA_UPDATE_PT_FLASH_START_ADDR;
  446. printf("jump to 0x%08X.\r\n",appxaddr);
  447. if(((*(vu32*)appxaddr)&0x2FFE0000)==0x20000000) //检查栈顶地址是否合法.
  448. {
  449. nvic_disable();
  450. INTX_DISABLE();
  451. jump2_pt_app=(otafun)*(vu32*)(appxaddr+4); //用户代码区第二个字为程序开始地址(复位地址)
  452. MSR_MSP(*(vu32*)appxaddr); //初始化APP堆栈指针(用户代码区的第一个字用于存放栈顶地址)
  453. gpio_deinit(GPIOB);
  454. gpio_deinit(GPIOC);
  455. jump2_pt_app(); //跳转到APP.
  456. while(1);
  457. }
  458. else
  459. {
  460. printf("栈顶地址不合法\r\n");
  461. }
  462. return 0;
  463. }
  464. //产测处理
  465. void uart_pt_task(uint8_t *data,uint16_t len)
  466. {
  467. if(strstr((char *)data,"AT+PTMOD=ON\r\n"))
  468. {
  469. run_pt();
  470. }
  471. }
  472. //usart0接收解析
  473. void analysis_usart0_rx_fifo(void)
  474. {
  475. // uint8_t readBuf[256],readlen;
  476. // if(fifo_is_empty(&g_usart0rxfifo) == TRUE) return;
  477. // readlen = fifo_read(&g_usart0rxfifo,readBuf);
  478. // if(WORK_UPDATE != g_devMsg.workMode)//非升级模式
  479. // uart_pt_task(readBuf,readlen);
  480. }