PIC在线升级源码分析
1:概述
??? 最近兩周都在做PIC在線升級的功能,最終看到升級成功的提示,難以掩蓋成功的喜悅。決定把我兩周中遇到的問題和大家分享一下,希望能給正在做升級功能的人一些幫助。有理解錯誤的地方請大家給以指正。
2:基本流程
??? 硬件連接:PC<=====>232轉(zhuǎn)485<=====>PIC<=====>EEPROM
??? 軟件邏輯:
?????????????????? 1) MFC發(fā)送開始升級指令--->PIC初始化接收485BUF--->校驗包--->寫數(shù)據(jù)至EEPROM
?????????????????? 2) MFC發(fā)送文件結(jié)束指令--->PIC寫升級文件標(biāo)志至EEPROM--->Reset
?????????????????? 3) PIC讀取EEPROM升級標(biāo)志--->跳轉(zhuǎn)至固定Program地址--->擦除原有program--->讀取EEPROM--->寫PIC Flash--->Reset
???? 最終實現(xiàn)狀態(tài):在未斷電重啟的情況下,成功升級PIC程序,MFC程序檢測升級成功。
3:錯誤包處理
???? MFC端:當(dāng)MFC應(yīng)用程序讀取ACK包,檢查狀態(tài)為錯誤會重傳此序號包。錯誤重傳延續(xù)5次。
???? PIC端? :當(dāng)讀取EEPROM數(shù)據(jù)寫PIC Flash,會讀取寫入數(shù)據(jù)比對,如若出錯將重新寫入。
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:遇到問題錯誤總結(jié)
???? 1) MPLAB 編譯器中編寫指針賦值時,出現(xiàn)485無法接收數(shù)據(jù)的現(xiàn)象。
???? 2) MPLAB 編譯器中如果傳參為運算乘時,出現(xiàn)運算錯誤。
?????3) EEPROM 在寫最大頁128Bytes時,需要寫128 * N的地址。否則出現(xiàn)寫入數(shù)據(jù)不完全的現(xiàn)象。具體我也沒有理解。
?????4) 在擦除PIC 時,注意計算其擦除塊的大小,避免擦除固定升級代碼。
?????5) 固定升級代碼中一定不能調(diào)用固定升級代碼區(qū)域之外的函數(shù)。以免擦除后再次調(diào)用程序跑飛的現(xiàn)象。
?????6) 在計算固定升級代碼時,中間不能有間隔。MPLAB會把其他小代碼量的函數(shù)燒寫其中。最好從最大地址算起。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的PIC在线升级源码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: package和import
- 下一篇: 安装lxml库