public.c 20 KB

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