老版本GCU
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

670 lines
20 KiB

  1. /************************************************************************
  2. * 模块名称:com.c
  3. * 程序功能:
  4. * 编 写 者:
  5. * 编写日期:2017-06-22
  6. * 修 改 者:
  7. * 修改日期:
  8. * 编译环境:KEIL4 MDK ARM V4.74
  9. * 硬件平台:STM32F103ZCT6
  10. ************************************************************************/
  11. /************************************************************************/
  12. /* */
  13. /* INCLUDES */
  14. /* */
  15. /************************************************************************/
  16. #include <stm32f10x.h>
  17. #include <stm32f10x_dma.h>
  18. #include <string.h>
  19. #include <stdio.h>
  20. #include "stm32f10x.h"
  21. #include "stm32f10x_usart.h"
  22. #include "stm32f10x_it.h"
  23. #include "com.h"
  24. #include "share.h"
  25. #include "crc.h"
  26. /************************************************************************/
  27. /* */
  28. /* DEFINITION */
  29. /* */
  30. /************************************************************************/
  31. /************************************************************************/
  32. /* */
  33. /* DECLARATION */
  34. /* */
  35. /************************************************************************/
  36. void delay_ms(uint32_t time);
  37. void ymodem_fun(void);
  38. uint8_t Get_state(void);
  39. uint8_t Dma_send_data(uint8_t *pdata, uint8_t len);
  40. /************************************************************************/
  41. /* */
  42. /* VARIABLE */
  43. /* */
  44. /************************************************************************/
  45. u8 m_SerialSendState = RS_SEND_IDLE;
  46. u8 m_SerialSendPos = 0;
  47. u8 m_SerialSendLen = 0;
  48. u8 m_SerialSendBuffer[RS232_MAX_PARAM_LENGTH];
  49. u8 m_SerialRecvState = RS_RECV_IDLE;
  50. u8 m_SerialRecvLen = 0;
  51. u8 m_SerialRecvPos = 0;
  52. u8 m_SerialRecvBuffer[Re_MAX_PARAM_LENGTH];
  53. u8 m_SerialRecvTransfer[Re_MAX_PARAM_LENGTH];
  54. u16 UpdateCodeData[STM_SECTOR_SIZE/2] ={0}; //1024个半字
  55. u16 CompareaData[STM_SECTOR_SIZE/2] ={0}; //1024个半字
  56. u32 addrCur = APPLICATION_PROGRAM_ADDRESS; //当前写入地址
  57. u32 addrSave = APPLICATION_UPDCODE_ADDRESS; //STM32_FLASH_BASE + (STM32_FLASH_SIZE - BACKUP_CODE_CACHE_SIZE) * 1024; //串口数据保存地址 0x08000000 + (256 - 50)*1024
  58. //u32 RecordAdd;
  59. u16 i = 0;
  60. u8 SectorNum = 0;//扇区数
  61. u16 m_ReceiveDataCurNum = 0;
  62. u16 m_ReceiveCodeDataU16 = 0;
  63. u16 m_IAPDateByteTotalSize = 0; //数据总位数
  64. u8 m_IAPDatePackageTotalSize = 0; //数据总包数
  65. u8 m_IAPDatePackageEND = 0; //已经传输完成的包数
  66. u8 m_finish = 0;
  67. u8 g_IAPCommondFlag = 0; //g_skip
  68. u8 CompareFlag = 1; //
  69. u8 Rewrite=3;
  70. uint8_t Rx_Flag = 0;
  71. uint8_t Rx_Len = 0;
  72. //static u16 STMFLASH_BUF[STM_SECTOR_SIZE/2];
  73. uint32_t last_upd_ticks = 0;
  74. /***********************************************************************/
  75. /************************************************************************/
  76. /* */
  77. /* IMPLEMENTATION */
  78. /* */
  79. /************************************************************************/
  80. uint8_t CheckAddSum(uint8_t *pdata, uint8_t len)
  81. {
  82. uint16_t sum = 0, i = 0;
  83. for(i = 0; i<len; i++) {
  84. sum+=pdata[i];
  85. }
  86. return (sum&0xff);
  87. }
  88. uint8_t IsDevCommandFrame(uint8_t *pdata, uint8_t len)
  89. {
  90. if( len == CMD_UPD_FRAME_LEN && pdata[0] == CMD_FRAME_HEADER && pdata[1] == CMD_UPD_FRAME_LEN
  91. && pdata[CMD_UPD_FRAME_LEN - 1] == CheckAddSum(pdata, CMD_UPD_FRAME_LEN-1)) {
  92. return 1;
  93. }
  94. return 0;
  95. }
  96. uint8_t Dma_send_data(uint8_t *pdata, uint8_t len)
  97. {
  98. /* while(USART_TX_FLAG); //等待上一次发送完成(USART2_TX_FLAG为1即还在发送数据)
  99. USART_TX_FLAG=1; //USART2发送标志(启动发送)
  100. USART_DMA_CHANNEL_TX->CMAR = (uint32_t)pdata; //设置要发送的数据地址
  101. USART_DMA_CHANNEL_TX->CNDTR = len; //设置要发送的字节数目
  102. DMA_Cmd(USART_DMA_CHANNEL_TX, ENABLE); //开始DMA发送
  103. */
  104. while (DMA_GetCurrDataCounter(USART_DMA_CHANNEL_TX));// 检查DMA发送通道内是否还有数据
  105. if(!len) return 0;// 判断长度是否有效
  106. if(pdata==NULL) return 0;
  107. memcpy(Dma_Tx_Buffer, pdata,len);
  108. //DMA发送数据-要先关 设置发送长度 开启DMA
  109. DMA_Cmd(USART_DMA_CHANNEL_TX, DISABLE);
  110. USART_DMA_CHANNEL_TX->CNDTR = len;// 设置发送长度
  111. DMA_Cmd(USART_DMA_CHANNEL_TX, ENABLE); // 启动DMA发送
  112. return len;
  113. }
  114. void DMA2_Channel3_IRQHandler(void)
  115. {
  116. //USART_PutStr(USART1," DMA23:rn",9);
  117. DMA_ClearITPendingBit(DMA2_IT_TC3);
  118. DMA_ClearITPendingBit(DMA2_IT_TE3);
  119. DMA_Cmd(DMA2_Channel3, DISABLE); //关闭DMA,防止处理其间有数据
  120. DMA2_Channel3->CNDTR = DMA_RECV_BUF_SIZE; //重装填, for receiving
  121. DMA_Cmd(DMA2_Channel3, ENABLE); //处理完,重开DMA
  122. }
  123. void DMA2_Channel4_5_IRQHandler(void)
  124. {
  125. //USART_PutStr(USART1," DMA245:rn",9);
  126. DMA_ClearITPendingBit(DMA2_IT_TC5);
  127. DMA_ClearITPendingBit(DMA2_IT_TE5);
  128. DMA_Cmd(DMA2_Channel5, DISABLE); //关闭DMA,防止处理其间有数据
  129. DMA2_Channel5->CNDTR = 0; //重装填, for sending
  130. DMA_Cmd(DMA2_Channel5, ENABLE); //处理完,重开DMA
  131. }
  132. /***********************************************************************
  133. * 函 数 名: USART1_IRQHandler()
  134. * 功能描述: 系统
  135. * 函数说明:
  136. * 输 入: 无
  137. * 返 回:
  138. * 设 计 者:CYL 日期:2015-05-01
  139. * 修 改 者:CYL 日期:2015-05-01
  140. ***********************************************************************/
  141. void UART4_IRQHandler(void)
  142. {
  143. uint16_t data_len, i;
  144. //idle中断
  145. if(USART_GetITStatus(USART_NUM, USART_IT_IDLE) != RESET)
  146. {
  147. //清除状态寄存器和串口数据寄存器 // __HAL_UART_CLEAR_IDLEFLAG(&huart2); //
  148. data_len =USART_NUM->SR;
  149. data_len =USART_NUM->DR;
  150. //关闭DMA
  151. DMA_Cmd(USART_DMA_CHANNEL_RX, DISABLE);
  152. //读取接收buffer的数据
  153. data_len = DMA_RECV_BUF_SIZE - DMA_GetCurrDataCounter(USART_DMA_CHANNEL_RX);
  154. for (i = 0;i < data_len; i++)
  155. {
  156. m_SerialRecvBuffer[i]= Dma_Rx_Buffer[i];
  157. m_SerialRecvPos = i;
  158. }
  159. m_SerialRecvLen = data_len;
  160. //
  161. DMA_ClearFlag(USART_DMA_RX_CLR_FLAGS);
  162. //设置传输数据长度
  163. DMA_SetCurrDataCounter(USART_DMA_CHANNEL_RX, DMA_RECV_BUF_SIZE); //USART_DMA_CHANNEL_RX->CNDTR = DMA_RECV_BUF_SIZE;
  164. //打开DMA
  165. DMA_Cmd(USART_DMA_CHANNEL_RX, ENABLE);
  166. USART_ClearITPendingBit(USART_NUM, USART_IT_IDLE);
  167. if(m_SerialRecvState != RS_RECV_COMPLETE) //RecvTemp==m_SerialRecvBuffer[0]
  168. {
  169. Rx_Flag = 0;
  170. if(IsDevCommandFrame(m_SerialRecvBuffer, m_SerialRecvLen)) //command frame
  171. {
  172. if(m_SerialRecvBuffer[2] == CMD_DEV_UPDATE) { //update command
  173. Dma_send_data(m_SerialRecvBuffer, m_SerialRecvLen); //ack-update-
  174. delay_ms(5); //5ms
  175. m_SerialRecvState = RS_RECV_COMPLETE;
  176. g_IAPCommondFlag = 1;
  177. last_upd_ticks = g_SysTick;
  178. }
  179. }
  180. /* else if(m_SerialRecvBuffer[0] == 0x53 && m_SerialRecvPos == 0x08 && m_SerialRecvBuffer[7] == CheckCrc(&m_SerialRecvBuffer[2],5))
  181. {
  182. m_SerialRecvState = RS_RECV_COMPLETE;
  183. g_IAPCommondFlag = 1;
  184. }
  185. */
  186. else {
  187. m_SerialRecvPos = 0;
  188. m_SerialRecvLen = 0;
  189. m_SerialRecvState = RS_RECV_IDLE;
  190. }
  191. }
  192. else //if(m_SerialRecvState == RS_RECV_COMPLETE)
  193. {
  194. Rx_Flag = 1;
  195. }
  196. }
  197. }
  198. /***********************************************************************
  199. * 函 数 名: DFL_SerialInit()
  200. * 功能描述:
  201. * 函数说明:
  202. * 输 入: 无
  203. * 返 回:
  204. * 设 计 者:CYL 日期:2015-05-23
  205. * 修 改 者:CYL 日期:2015-05-23
  206. ***********************************************************************/
  207. void DFL_SerialInit(void)
  208. {
  209. m_SerialSendState = RS_SEND_IDLE;
  210. m_SerialSendLen = 0;
  211. m_SerialSendPos = 0;
  212. m_SerialRecvState = RS_RECV_IDLE;
  213. m_SerialRecvLen = 0;
  214. m_SerialRecvPos = 0;
  215. return;
  216. }
  217. /***********************************************************************
  218. * 函 数 名: AFL_SerialTask()
  219. * 功能描述:
  220. * 函数说明:
  221. * 输 入: 无
  222. * 返 回:
  223. * 设 计 者:TNT 日期:2015-05-01
  224. * 修 改 者:CYL 日期:2015-05-01
  225. ***********************************************************************/
  226. void AFL_SerialTask(void)
  227. {
  228. if(m_SerialRecvState != RS_RECV_COMPLETE)
  229. {
  230. return;
  231. }
  232. ymodem_fun();
  233. if(CompareFlag == 0) {
  234. g_IAPCommondFlag = 9; //update-error, stop
  235. }
  236. if (Get_state() == TO_RECEIVE_END) {
  237. g_IAPCommondFlag = 2; //update-end, stop
  238. AFL_Write_StartMode(Startup_Update);
  239. }
  240. return;
  241. ///////////////////////////////////////////////////////
  242. /* m_SerialRecvState = RS_RECV_IDLE;
  243. m_SerialRecvLen = 0;
  244. m_SerialRecvPos = 0;
  245. //-------------------------------------------数据传输-------------------------------
  246. if(m_SerialRecvBuffer[0] == 0x55 && m_SerialRecvBuffer[1] == 0x55)
  247. {
  248. m_IAPDateByteTotalSize = ((u16)m_SerialRecvBuffer[3] << 8) + ((u16)m_SerialRecvBuffer[4]);
  249. m_IAPDatePackageTotalSize = m_SerialRecvBuffer[5];
  250. if(m_SerialRecvBuffer[2] < (m_IAPDatePackageTotalSize - m_IAPDatePackageTotalSize % (STM_SECTOR_SIZE/128))) //属于整页的数据包
  251. {
  252. memcpy(&m_SerialRecvTransfer[0], &m_SerialRecvBuffer[6], Re_MAX_PARAM_LENGTH-7);//取出数据位
  253. m_IAPDatePackageEND++; //已经取出的包数递增
  254. for(i=0;i<128;i+=2)
  255. {
  256. if(m_IAPDatePackageEND - m_SerialRecvBuffer[2] > 1)//是否重发来的数据包
  257. {
  258. m_IAPDatePackageEND--;
  259. break;
  260. }
  261. else
  262. {
  263. m_ReceiveCodeDataU16 = (((u16)m_SerialRecvTransfer[i+1])<<8) + ((u16)m_SerialRecvTransfer[i]); //合并
  264. UpdateCodeData[m_ReceiveDataCurNum] = m_ReceiveCodeDataU16;
  265. m_ReceiveDataCurNum++;
  266. }
  267. }
  268. if(m_ReceiveDataCurNum == STM_SECTOR_SIZE/2) //满一页就写
  269. {
  270. for(i=0; i<Rewrite; i++)
  271. {
  272. DHL_STMFlash_Write(addrSave,UpdateCodeData,STM_SECTOR_SIZE/2);
  273. DHL_STMFlash_Read(addrSave, CompareaData,STM_SECTOR_SIZE/2);
  274. CompareFlag = DHL_CompareBuffer(UpdateCodeData,CompareaData,STM_SECTOR_SIZE/2);
  275. if(CompareFlag == 1)
  276. {
  277. addrSave+= STM_SECTOR_SIZE;
  278. m_ReceiveDataCurNum=0;
  279. break;
  280. }
  281. }
  282. }
  283. }
  284. else if((m_IAPDatePackageTotalSize - m_SerialRecvBuffer[2]) <= m_IAPDatePackageTotalSize % (STM_SECTOR_SIZE/128))//最后一页
  285. {
  286. memcpy(&m_SerialRecvTransfer[0], &m_SerialRecvBuffer[6], Re_MAX_PARAM_LENGTH-7);
  287. for(i=0; i<128; i+=2)
  288. {
  289. m_ReceiveCodeDataU16= (((u16)m_SerialRecvTransfer[i+1])<<8) + ((u16)m_SerialRecvTransfer[i]);
  290. UpdateCodeData[m_ReceiveDataCurNum] = m_ReceiveCodeDataU16;
  291. m_ReceiveDataCurNum++;
  292. }
  293. if(m_IAPDatePackageTotalSize - 1 == m_SerialRecvBuffer[2])
  294. {
  295. for(i=0; i<Rewrite; i++)
  296. {
  297. DHL_STMFlash_Write(addrSave,UpdateCodeData, m_ReceiveDataCurNum);
  298. DHL_STMFlash_Read(addrSave, CompareaData, m_ReceiveDataCurNum);
  299. CompareFlag = DHL_CompareBuffer(UpdateCodeData, CompareaData, m_ReceiveDataCurNum);
  300. if(CompareFlag ==1 )
  301. {
  302. m_finish = 1;
  303. //计算扇区
  304. if(m_IAPDatePackageTotalSize % (STM_SECTOR_SIZE / 128))
  305. SectorNum = m_IAPDatePackageTotalSize / (STM_SECTOR_SIZE / 128) + 1;
  306. else
  307. SectorNum = m_IAPDatePackageTotalSize / (STM_SECTOR_SIZE / 128);
  308. break;
  309. }
  310. }
  311. }
  312. }
  313. //-----------串口回复--------------
  314. DFL_SerialSend(m_SerialRecvBuffer[Re_MAX_PARAM_LENGTH-1], m_SerialRecvBuffer[2]);
  315. }
  316. else if(m_SerialRecvBuffer[0] == 0x53 && m_SerialRecvBuffer[1] == 0x53)
  317. {
  318. //--------------------------------------重启芯片后进入IAP---------------------------
  319. if(m_SerialRecvBuffer[2] == 0xF5 && m_SerialRecvBuffer[6] == 0xF5)
  320. {
  321. DFL_SerialSend(0x11,0x11);
  322. }
  323. //-------------------------------------------更新覆盖-------------------------------
  324. else if (m_SerialRecvBuffer[2] == 0xF4 && m_SerialRecvBuffer[6] == 0xF4)
  325. {
  326. if(m_finish)
  327. {
  328. FLASH_Unlock(); //解锁
  329. DHL_STMFlash_Erase(APPLICATION_PROGRAM_ADDRESS, SectorNum + 2); //由于SectorNum必须发生在数据传输后面
  330. FLASH_Lock();
  331. addrSave = STM32_FLASH_BASE + (STM32_FLASH_SIZE - BACKUP_CODE_CACHE_SIZE) * 1024;
  332. for(i=0;i<SectorNum;i++)
  333. {
  334. DHL_STMFlash_Read(addrSave, UpdateCodeData, STM_SECTOR_SIZE/2);
  335. DHL_STMFlash_Write(addrCur,UpdateCodeData, STM_SECTOR_SIZE/2);
  336. DHL_STMFlash_Read(addrCur, CompareaData, STM_SECTOR_SIZE/2);
  337. CompareFlag = DHL_CompareBuffer(UpdateCodeData, CompareaData, STM_SECTOR_SIZE/2);
  338. if(CompareFlag != 1)
  339. {
  340. DFL_SerialSend(0x12,0x12);//写失败
  341. continue;
  342. }
  343. DFL_SerialSend(0x11,SectorNum); //回复
  344. addrSave+= STM_SECTOR_SIZE;
  345. addrCur+= STM_SECTOR_SIZE;
  346. }
  347. }
  348. else
  349. {
  350. DFL_SerialSend(0x12,0x12);//写失败
  351. // while(1)
  352. // {
  353. // DHL_STMFlash_Read(addrSave, UpdateCodeData, STM_SECTOR_SIZE/2);
  354. // for(i = 0; i < STM_SECTOR_SIZE/2; i++) //校验数据是否为0xffff,检测10个半字
  355. // {
  356. // if(UpdateCodeData[i]!=0XFFFF)
  357. // {
  358. // break;
  359. // }
  360. // }
  361. // if(i<STM_SECTOR_SIZE/2)
  362. // {
  363. // for(i=0;i<Rewrite;i++)
  364. // {
  365. // DHL_STMFlash_Write(addrCur,UpdateCodeData,STM_SECTOR_SIZE/2);
  366. // DHL_STMFlash_Read(addrCur, CompareaData,STM_SECTOR_SIZE/2);
  367. // CompareFlag=DHL_CompareBuffer(UpdateCodeData,CompareaData,STM_SECTOR_SIZE/2);
  368. // if(CompareFlag==1)
  369. // {
  370. // DFL_SerialSend(0x11,SectorNum);//回复
  371. //
  372. // addrSave+= STM_SECTOR_SIZE;
  373. // addrCur+= STM_SECTOR_SIZE;
  374. // SectorNum++;
  375. // break;
  376. // }
  377. // else if(i==2&&CompareFlag!=1){
  378. // DFL_SerialSend(0x12,0x12);//写失败
  379. // }
  380. // }
  381. // }
  382. // else
  383. // {
  384. // break;
  385. // }
  386. // }
  387. }
  388. AFL_Jump2App();
  389. }
  390. }
  391. */
  392. }
  393. ///////////Ymodem-transmission//////////////////////////////////////////////////////
  394. #define YMODEM_DATA_LEN 128
  395. /**
  396. * @bieaf CRC-16 校验
  397. *
  398. * @param addr 开始地址
  399. * @param num 长度
  400. * @param num CRC
  401. * @return crc 返回CRC的值
  402. */
  403. #define POLY 0x1021
  404. uint16_t crc16(unsigned char *addr, int num, uint16_t crc)
  405. {
  406. int i;
  407. for (; num > 0; num--) /* Step through bytes in memory */
  408. {
  409. crc = crc ^ (*addr++ << 8); /* Fetch byte from memory, XOR into CRC top byte*/
  410. for (i = 0; i < 8; i++) /* Prepare to rotate 8 bits */
  411. {
  412. if (crc & 0x8000) /* b15 is set... */
  413. crc = (crc << 1) ^ POLY; /* rotate and XOR with polynomic */
  414. else /* b15 is clear... */
  415. crc <<= 1; /* just rotate */
  416. } /* Loop for 8 bits */
  417. crc &= 0xFFFF; /* Ensure CRC remains 16-bit value */
  418. } /* Loop until num=0 */
  419. return(crc); /* Return updated CRC */
  420. }
  421. /**
  422. * @bieaf 获取数据包的类型, 顺便进行校验
  423. *
  424. * @param buf 开始地址
  425. * @param len 长度
  426. * @return
  427. */
  428. unsigned char Check_CRC(unsigned char* buf, int len)
  429. {
  430. unsigned short crc = 0;
  431. /* 进行CRC校验 */
  432. if((buf[0]==0x00)&&(len >= YMODEM_DATA_LEN+5)) //YMODEM_DATA_LEN=128
  433. {
  434. crc = crc16(buf+3, YMODEM_DATA_LEN, crc);
  435. if(crc != (buf[YMODEM_DATA_LEN+3]<<8|buf[YMODEM_DATA_LEN+4]))
  436. {
  437. return 0;///< 没通过校验
  438. }
  439. /* 通过校验 */
  440. return 1;
  441. }
  442. return 0;
  443. }
  444. /* 设置升级的步骤 */
  445. static enum UPDATE_STATE update_state = TO_START;
  446. void Set_state(enum UPDATE_STATE state)
  447. {
  448. update_state = state;
  449. }
  450. /* 查询升级的步骤 */
  451. uint8_t Get_state(void)
  452. {
  453. return update_state;
  454. }
  455. void delay_ms(uint32_t time)
  456. {
  457. /*uint32_t target_ticks = g_SysTick+time;
  458. while(target_ticks < g_SysTick) {
  459. int i = 1;
  460. }*/
  461. u16 i=0;
  462. while(time--)
  463. {
  464. i=12000; //????
  465. while(i--) ;
  466. }
  467. }
  468. /* 发送指令 */
  469. void send_command(uint8_t command)
  470. {
  471. Dma_send_data(&command, 1);
  472. delay_ms(3);
  473. //HAL_UART_Transmit(&huart2, (uint8_t *)&command,1, 0xFFFF);
  474. //HAL_Delay(10);
  475. }
  476. uint8_t temp_buf[256] = {0};
  477. uint8_t temp_len = 0;
  478. /**
  479. * @bieaf YModem升级
  480. *
  481. * @param none
  482. * @return none
  483. */
  484. void ymodem_fun(void)
  485. {
  486. static uint8_t data_state = 0;
  487. int i;
  488. if(Get_state()==TO_START)
  489. {
  490. send_command(CCC);
  491. delay_ms(1000);
  492. }
  493. if(Rx_Flag) // Receive flag
  494. {
  495. Rx_Flag=0; // clean flag
  496. /* 拷贝 */
  497. temp_len = Rx_Len;
  498. for(i = 0; i < temp_len; i++)
  499. {
  500. temp_buf[i] = m_SerialRecvBuffer[i];
  501. }
  502. switch(temp_buf[0])
  503. {
  504. case SOH:///<数据包开始
  505. {
  506. //static unsigned int app2_size = 0;
  507. if(Check_CRC(temp_buf, temp_len)==1)///< 通过CRC16校验
  508. {
  509. if((Get_state()==TO_START)&&(temp_buf[1] == 0x00)&&(temp_buf[2] == (unsigned char)(~temp_buf[1])))///< 开始
  510. {
  511. printf("> Receive start...\r\n");
  512. Set_state(TO_RECEIVE_DATA);
  513. data_state = 0x01; //init data-index
  514. send_command(ACK);
  515. send_command(CCC);
  516. /* 擦除App2 */
  517. DHL_STMFlash_Erase(APPLICATION_UPDCODE_ADDRESS, BACKUP_CODE_CACHE_SIZE/2);
  518. last_upd_ticks = g_SysTick;
  519. }
  520. else if((Get_state()==TO_RECEIVE_END)&&(temp_buf[1] == 0x00)&&(temp_buf[2] == (unsigned char)(~temp_buf[1])))///< 结束
  521. {
  522. printf("> Receive end...\r\n");
  523. CompareFlag = 1; //ok, if not write to flash
  524. if(m_ReceiveDataCurNum > 0) //LAST页就写
  525. {
  526. for (i=m_ReceiveDataCurNum; i<STM_SECTOR_SIZE/2; i++) {
  527. UpdateCodeData[i] = 0xffff;
  528. }
  529. for(i=0; i<Rewrite; i++)
  530. {
  531. DHL_STMFlash_Write(addrSave,UpdateCodeData,STM_SECTOR_SIZE/2);
  532. DHL_STMFlash_Read(addrSave, CompareaData,STM_SECTOR_SIZE/2);
  533. CompareFlag = DHL_CompareBuffer(UpdateCodeData,CompareaData,STM_SECTOR_SIZE/2);
  534. if(CompareFlag == 1) //write ok
  535. {
  536. m_ReceiveDataCurNum=0;
  537. break;
  538. }
  539. }
  540. }
  541. if(CompareFlag == 1) { //write ok
  542. AFL_Write_StartMode(Startup_Update);
  543. Set_state(TO_START);
  544. send_command(ACK);
  545. //System_SoftReset(); //system reset
  546. last_upd_ticks = g_SysTick;
  547. }
  548. }
  549. else if((Get_state()==TO_RECEIVE_DATA)&&(temp_buf[1] == data_state)&&(temp_buf[2] == (unsigned char)(~temp_buf[1])))///< 接收数据
  550. {
  551. printf("> Receive data bag:%d byte\r\n",data_state * YMODEM_DATA_LEN); //YMODEM_DATA_LEN=128
  552. for(i=0; i<YMODEM_DATA_LEN; i+=2)
  553. {
  554. m_ReceiveCodeDataU16= (((u16)temp_buf[i+4])<<8) + ((u16)m_SerialRecvTransfer[i+3]);
  555. UpdateCodeData[m_ReceiveDataCurNum++] = m_ReceiveCodeDataU16;
  556. }
  557. CompareFlag = 1; //ok, if not write to flash
  558. if(m_ReceiveDataCurNum == STM_SECTOR_SIZE/2) //满一页就写
  559. {
  560. for(i=0; i<Rewrite; i++)
  561. {
  562. DHL_STMFlash_Write(addrSave,UpdateCodeData,STM_SECTOR_SIZE/2);
  563. DHL_STMFlash_Read(addrSave, CompareaData,STM_SECTOR_SIZE/2);
  564. CompareFlag = DHL_CompareBuffer(UpdateCodeData,CompareaData,STM_SECTOR_SIZE/2);
  565. if(CompareFlag == 1) //write ok
  566. {
  567. addrSave+= STM_SECTOR_SIZE;
  568. m_ReceiveDataCurNum=0;
  569. break;
  570. }
  571. }
  572. }
  573. /* 烧录程序 */
  574. //WriteFlash((Application_2_Addr + (data_state-1) * 128), (uint32_t *)(&temp_buf[3]), 32);
  575. if(CompareFlag == 1) { // write ok
  576. data_state++;
  577. send_command(ACK);
  578. }
  579. }
  580. }
  581. else
  582. {
  583. printf("> Notpass crc\r\n");
  584. }
  585. }break;
  586. case EOT://数据包 end of transmission
  587. {
  588. if(Get_state()==TO_RECEIVE_DATA)
  589. {
  590. printf("> Receive EOT1...\r\n");
  591. Set_state(TO_RECEIVE_EOT2);
  592. send_command(NACK);
  593. }
  594. else if(Get_state()==TO_RECEIVE_EOT2)
  595. {
  596. printf("> Receive EOT2...\r\n");
  597. Set_state(TO_RECEIVE_END);
  598. send_command(ACK);
  599. send_command(CCC);
  600. }
  601. else
  602. {
  603. printf("> Receive EOT, But error...\r\n");
  604. }
  605. }break;
  606. }
  607. }
  608. }
  609. /******************* (C) COPYRIGHT 2017 LECOOAI *****END OF FILE****/