PIC在线升级源码分析
1:概述
??? 最近兩周都在做PIC在線升級的功能,最終看到升級成功的提示,難以掩蓋成功的喜悅。決定把我兩周中遇到的問題和大家分享一下,希望能給正在做升級功能的人一些幫助。有理解錯誤的地方請大家給以指正。
2:基本流程
??? 硬件連接:PC<=====>232轉485<=====>PIC<=====>EEPROM
??? 軟件邏輯:
?????????????????? 1) MFC發送開始升級指令--->PIC初始化接收485BUF--->校驗包--->寫數據至EEPROM
?????????????????? 2) MFC發送文件結束指令--->PIC寫升級文件標志至EEPROM--->Reset
?????????????????? 3) PIC讀取EEPROM升級標志--->跳轉至固定Program地址--->擦除原有program--->讀取EEPROM--->寫PIC Flash--->Reset
???? 最終實現狀態:在未斷電重啟的情況下,成功升級PIC程序,MFC程序檢測升級成功。
3:錯誤包處理
???? MFC端:當MFC應用程序讀取ACK包,檢查狀態為錯誤會重傳此序號包。錯誤重傳延續5次。
???? PIC端? :當讀取EEPROM數據寫PIC Flash,會讀取寫入數據比對,如若出錯將重新寫入。
4:部分代碼
PIC寫升級文件部分代碼:
while (g_485_rec_buff.data_len < len) {ClrWdt();Delay100TCYx(100);if(error++ > 30) return; } error = 0;check = CheckSum(ptr, len - 1); if(pdata->checksum != check) {pdata->pack.state = WRONG;g_485_rec_buff.data_len = 0;h_485_usart2_write_nbyte((char *)&pdata->pack, sizeof(UPPACK));continue; }if(pdata->pack.state == END) {binfo.valid[0] = 'U';binfo.valid[1] = 'P';eeprom_write_page(EEPROM_UPDATE_INFO_ADDR, (unsigned char *)&binfo,sizeof(binfo));break; }if(pdata->pack.state == SENDING) {eeprom_write_page(EEPROM_UPDATE_DATA_ADDR + binfo.file_size, pdata->data, pdata->pack.len);binfo.file_size += pdata->pack.len;pdata->pack.state = RIGHT;g_485_rec_buff.len = 0;h_485_usart2_write_nbyte((char *)&pdata->pack, sizeof(UPPACK));continue; }MFC重傳部分代碼
while(TRUE) {memset((unsigned char *)&lpdata, 0, sizeof(UPDATA));nRBytes = fread((char *)&lpdata.data, 1, BUFFSIZE, fp);if(nRBytes <= 0) break;lpdata.pack.len = nRBytes;lpdata.pack.seq = seq++; // package seqlpdata.pack.state = SENDING; RESEND: // if wrong will be send the same data until five times.lpdata.checksum = CheckSum((unsigned char *)&lpdata, sizeof(UPDATA) - 1);CleanSendBuf(scom.hCom);WriteBytes(scom.hCom, (char *)&lpdata, sizeof(UPDATA));Sleep(300);memset((char *)&uppack, 0, sizeof(UPPACK));if(ReadBytes(scom.hCom, (char *)&uppack, sizeof(UPPACK)) > 0){if(uppack.state == WRONG){if(ErrorNum++ <= 5){goto RESEND;}else{ErrorNum = 0;Sleep(400);goto ERRORUP;}}ErrorNum = 0;if(uppack.state == RIGHT){i += 64;m_progress_update.SetPos(i);continue;}goto RESEND;}else{goto ERRORUP;}} }5:部分截圖
6:遇到問題錯誤總結
???? 1) MPLAB 編譯器中編寫指針賦值時,出現485無法接收數據的現象。
???? 2) MPLAB 編譯器中如果傳參為運算乘時,出現運算錯誤。
?????3) EEPROM 在寫最大頁128Bytes時,需要寫128 * N的地址。否則出現寫入數據不完全的現象。具體我也沒有理解。
?????4) 在擦除PIC 時,注意計算其擦除塊的大小,避免擦除固定升級代碼。
?????5) 固定升級代碼中一定不能調用固定升級代碼區域之外的函數。以免擦除后再次調用程序跑飛的現象。
?????6) 在計算固定升級代碼時,中間不能有間隔。MPLAB會把其他小代碼量的函數燒寫其中。最好從最大地址算起。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的PIC在线升级源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: package和import
- 下一篇: 安装lxml库