日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PIC在线升级源码分析

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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在线升级源码分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。