電能表在線升級方法
【專利摘要】本發(fā)明公開了一種電能表在線升級方法,上位機發(fā)送命令到電能表,將升級文件的存儲區(qū)域清零。上位機發(fā)送升級文件到指定編號的電能表的外部存儲器,完成后置相應(yīng)標志,然后進行升級文件的正確性檢查,檢查通過后,置相應(yīng)標志,若不通過,清除相應(yīng)標志,不進行后續(xù)的升級操作;然后重啟電能表。啟動過程中,通過檢查對應(yīng)的標志位,電表選擇升級或者不升級。若不升級,電能表正常運行。若升級,電能表擦除內(nèi)部Flash的相應(yīng)區(qū)域,將外部存儲器的升級文件分多次讀到RAM空間,然后再更新到內(nèi)部Flash中,升級文件全部更新完成后,清除相應(yīng)標志,重啟電表,完成升級操作。本發(fā)明實現(xiàn)了電能表在線升級,操作難度小,升級方便。
【專利說明】電能表在線升級方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及一種電能表在線升級方法。
【背景技術(shù)】
[0002] 電能表啟動后,從閃存(Flash)中加載程序代碼和CE (電能計量單元)代碼運行。 在研發(fā)設(shè)計階段,可以通過仿真器將已編譯好的程序燒錄到芯片的閃存中,從而實現(xiàn)對程 序的更新升級。在電能表生產(chǎn)階段,則通過專用的燒錄器將程序燒寫到芯片中。電能表出 廠后,如果有特殊要求需要升級程序時,則只能通過返廠后進行操作。現(xiàn)有的技術(shù)雖然在程 序設(shè)計階段能方便的對電能表程序進行升級操作,但在電能表生產(chǎn)階段及其出廠后,若有 升級需求,只能通過燒錄器對單臺電能表一一進行升級,操作非常之麻煩,尤其是當電能表 安裝到千家萬戶后,如果要升級更新的話,則需要將所有的電能表返廠,然后進行升級,或 者在去到每一處電表的安裝位置,拆掉鉛封,通過專用工具進行升級,升級成本巨大。
【發(fā)明內(nèi)容】
[0003] 本發(fā)明的目的是提供一種速度快且操作便捷的電能表在線升級方法。
[0004] 本發(fā)明提供的這種電能表在線升級方法,該方法包括如下步驟: 步驟一,上位機發(fā)送清除外部存儲器的命令到電能表,將升級文件的存儲區(qū)域清零; 步驟二,上位機發(fā)送升級文件到指定編號的電能表的外部存儲器指定位置,進行升級 文件的正確性檢查、外部存儲器的讀寫正確性檢查和MCU的內(nèi)部Flash的讀寫正確性檢查, 若檢查通過,則轉(zhuǎn)至步驟三;若檢查未通過,則不進行后續(xù)的升級操作,需重新發(fā)送升級文 件; 步驟三,電能表重新啟動;啟動過程中,電能表選擇執(zhí)行或者不執(zhí)行升級程序; 若不執(zhí)行升級文件,電能表正常運行; 若執(zhí)行升級文件,電能表檢查外部存儲器和MCU內(nèi)部Flash的讀寫正確性,并擦除該內(nèi) 部Flash的對應(yīng)存儲區(qū)域;再將外部存儲器的升級文件分多次讀到RAM空間,然后再更新到 該內(nèi)部Flash中,升級文件全部更新完成后,重啟電能表,完成升級操作。
[0005] 所述上位機發(fā)送升級文件完成后,清除需要升級標志和檢幀正確標志,置位升級 文件下發(fā)完成標志;所述升級文件的正確性檢查通過后,置位檢幀正確標志和需要升級標 志;若未通過,則清除該檢幀正確標志和升級文件下發(fā)完成標志;所述電能表升級完成,清 除上述所有標志。
[0006] 所述檢幀正確標志和需要升級標志都有效時,所述電能表執(zhí)行升級文件;若二者 有任一無效,則所述電能表不執(zhí)行升級文件。
[0007] 所述升級文件的正確性檢查是檢查在外部存儲器中存儲的升級文件的合法性;包 括如下步驟: 第一步,從所述升級文件存儲起始地址開始,循環(huán)讀取固定長度的該升級文件內(nèi)容,再 解析出該固定長度升級文件內(nèi)容中一條完整的記錄; 第二步,解析該條記錄中數(shù)據(jù)的長度;根據(jù)長度判斷該記錄的末端是否超出固定長度, 若超出,則以該記錄首端作為開始地址,轉(zhuǎn)至第一步,若不超出,則轉(zhuǎn)至下一步; 第三步,判斷所述記錄長度是否滿足設(shè)定要求,如滿足,則轉(zhuǎn)至下一步;否則得出未通 過正確性檢查的結(jié)論,并返回; 第四步,解析出當前所述記錄的地址、記錄類型和校驗字; 第五步,判斷該條記錄的地址合法性,若為合法地址,則轉(zhuǎn)至下一步;否則得出未通過 正確性檢查的結(jié)論,并返回; 第六步,判斷當前所述記錄的校驗字是否和計算出的校驗字一致,若一致,則從當前所 述記錄的地址起,再讀取所述固定長度的下一條記錄,并轉(zhuǎn)至第二步;直至所述升級文件的 數(shù)據(jù)均通過所述數(shù)據(jù)長度的檢查、所述地址合法性的檢查以及所述校驗字的一致性檢查, 并得出所述升級文件通過正確性檢查的結(jié)論,并返回;否則得出未通過正確性檢查的結(jié)論, 并返回。
[0008] 所述記錄中數(shù)據(jù)的長度不滿足設(shè)定要求,則判斷其長度是否為0,若不為0,則判 斷得出未通過正確性檢查的結(jié)論,并返回; 若其長度為〇,則判斷所述升級文件是否結(jié)束,若不為文件結(jié)束,則判斷得出未通過正 確性檢查的結(jié)論,并返回;若為文件結(jié)束,則將最后讀取的所述固定字節(jié)數(shù)據(jù)里的檢幀正確 字節(jié)數(shù)和文件結(jié)束記錄字節(jié)數(shù)更新到總字節(jié)數(shù)中,再判斷所述升級文件結(jié)束后已檢總字節(jié) 數(shù)是否與上位機發(fā)送的文件總字節(jié)數(shù)一致,若二者字數(shù)一致,則表明通過正確性檢查,并返 回;否則判斷得出未通過正確性檢查的結(jié)論,并返回。
[0009] 所述執(zhí)行升級文件前,所述電能表首先關(guān)閉所有中斷,停止電能計量;接著該電能 表的LCD對應(yīng)指示升級進行中;然后進行電源檢查,然后檢查檢幀正確標志和需要升級標 志是否置位,再進行所述外部存儲器和所述內(nèi)部Flash的讀寫正確性檢查,通過后則進行 升級。
[0010] 所述電源檢查是檢測電源V3P3,上電N秒后,連續(xù)檢測Μ次;若有一次檢測該電源 低于3. 0V,則重新檢測。
[0011] 所述將外部存儲器的升級文件分多次讀到RAM空間需要對每次讀入的內(nèi)容進行 校驗位、數(shù)據(jù)長度和地址的合法性判斷;只有每次讀入的內(nèi)容為合法內(nèi)容時才再更新到所 述MCU的內(nèi)部Flash中。
[0012] 本發(fā)明實現(xiàn)了電能表在線升級,操作難度小,升級方便。電能表有升級需求時,可 隨時對電能表進行升級更新,而無需將現(xiàn)場電能表返廠更新,極大地節(jié)約了升級成本,同時 也增加了電能表產(chǎn)品對快速變化的市場的適應(yīng)能力,提高了電能表的競爭力。
【專利附圖】
【附圖說明】
[0013] 圖1是本發(fā)明的上位機下發(fā)升級文件的流程圖。
[0014] 圖2是本發(fā)明的電能表下載升級文件并對其進行檢查的流程圖。
[0015] 圖3是本發(fā)明的升級文件正確性檢查流程圖。
[0016] 圖4是本發(fā)明的電能表執(zhí)行升級操作的流程圖。
[0017] 圖5是本發(fā)明的lkb寫函數(shù)寫Flash流程圖。
[0018] 圖6是本發(fā)明MCU內(nèi)部Flash中能更新和不能更新區(qū)域示意圖。
【具體實施方式】
[0019] 本發(fā)明的主要步驟包括:上位機通過外部通訊模式將升級文件下發(fā)至電能表中; 然后電能表下載完該升級文件后進入檢查模式;接著根據(jù)檢查結(jié)果執(zhí)行不升級或者升級的 對應(yīng)操作,若不升級則電能表繼續(xù)保持正常運行模式,若升級則電能表先重啟MCU,再將升 級文件從外部存儲器中讀出,然后寫入到相應(yīng)地址的MCU內(nèi)部Flash中,完成后重啟電能 表,完成升級操作。
[0020] 本發(fā)明適用于基于具備閃存模式且MCU能讀寫芯片內(nèi)部FLASH的MAX頂芯片的單 芯片S0C方案的電能表,尤其適用于MAXIM公司推出的71M65X系列單芯片S0C方案的電能 表,MAXM公司推出的654X和653X系列的也適用。下面以MAXM公司推出的71M654X系 列芯片為例,對本發(fā)明進行進一步的說明。
[0021] MAX頂公司推出的71M654X系列芯片內(nèi)部包含一個閃存存儲器,用來存儲電能表 的運行代碼。電能表啟動后,從內(nèi)部Flash存儲器中加載程序代碼和CE代碼運行。
[0022] 本發(fā)明的外部存儲器可采用外部Flash或EEPR0M。
[0023] 如圖1所示,首先上位機通過通信方式往指定的電能表下發(fā)升級文件,并通過CRC 校驗(差錯校驗);然后上位機通過通信方式發(fā)送該升級文件的總字節(jié)數(shù);接著該指定電能 表將該升級文件存儲到外部存儲器(extend Flash)中;等該升級文件下載完成,清除需要 升級標志g_bNeedUpdateFlg和檢巾貞正確標志g_bGoodFirmwarefFlg,并置位升級文件下發(fā) 完成標志 g_bFinishDownloadFlg〇
[0024] 如圖2所示,電能表獲取升級文件下發(fā)完成標志g_bFinishDownloadFlg的變 化信息:當該標志無效(清除)時,電能表按照其原有主函數(shù)進行大循環(huán);當該標志有效 (置位)時,調(diào)用升級文件正確性檢查函數(shù)。當該函數(shù)的返回值為假(False)時,為錯誤 狀態(tài)1 (Err Statel),表明當前下載的升級文件有問題,清除升級文件下發(fā)完成標志8_ bFinishDownloadFlg和檢巾貞正確標志g_bGoodFirmwarefFlg,不進行升級操作,電能表 正常運行,上位機需重新發(fā)送升級文件;當該函數(shù)的返回值為真(True)時,表明該升級 文件有效,可進行后續(xù)升級操作。然后電能表通過連續(xù)多次讀寫外部存儲器的方式檢測 外部存儲器的讀寫正確性,若該外部存儲器的讀寫正確性有問題,則為錯誤狀態(tài)2 (Err State2),不進行升級操作,電能表正常運行;否則再通過連續(xù)多次讀MCU Flash的方式 檢測MCU的內(nèi)部Flash的讀寫正確性,若該內(nèi)部Flash的讀寫正確性有問題,則為錯誤 狀態(tài)3 (Err State3),不進行升級操作,電能表正常運行;否則清除升級文件下發(fā)完成標 志g_bFinishDownloadFlg,并置位需要升級標志g_bNeedUpdateFlg和檢巾貞正確標志g_ bGoodFirmwarefFlg,再重新啟動 MCU。 如圖3所示,本發(fā)明的升級文件正確性檢查函數(shù)是檢查在外部存儲器(extend Flash) 中存儲的所有升級文件的合法性。
[0025] 從升級文件存儲起始地址開始,讀取固定長度的該升級文件內(nèi)容。
[0026] 因為升級文件為HEX格式文件,由HEX格式文件特性可知,一個HEX文件有很多條 記錄組成,有固定的記錄類型,同一種記錄類型的長度均相同,所以解析出該固定長度中已 解析完成的記錄后第一個未解析記錄的長度,如果未解析記錄的長度加上該固定長度中已 解析記錄的總字節(jié)數(shù)超過該讀取的固定長度,則表示未解析的記錄數(shù)據(jù)不完整,需將該固 定長度中已解析記錄的總字節(jié)數(shù)存入檢幀總累計字節(jié)數(shù)中,再以未解析記錄的首地址作為 開始地址,重新讀取固定長度的該升級文件的內(nèi)容。
[0027] 由HEX格式文件的特性,解析出該條記錄在芯片內(nèi)部flash中的存儲地址、該記錄 的類型和該記錄的校驗位;再進行后續(xù)判斷。
[0028] (1)判斷該條記錄中數(shù)據(jù)的長度。若其長度滿足設(shè)定要求,則進行下一判斷。若 其長度不滿足設(shè)定要求,則判斷其長度是否為〇,若不為〇,表示升級文件存在錯誤,然后清 除升級文件發(fā)送完成標志,置升級文件錯誤標志,退出升級文件正確性檢查,電能表正常運 行,不進行升級操作。
[0029] 若其長度為0,則根據(jù)該記錄類型和記錄存儲地址解析升級文件是否結(jié)束,若不 為文件結(jié)束,表示升級文件存在錯誤,然后清除升級文件發(fā)送完成標志,置升級文件錯誤標 志,退出升級文件正確性檢查,電能表正常運行,不進行升級操作;若為文件結(jié)束,則將將 該條記錄的長度與之前的該固定長度已解析總字節(jié)數(shù)合并,然后將已更新的該固定長度已 解析總字節(jié)數(shù)合并到檢幀總累計字節(jié)數(shù)中,再判斷升級文件結(jié)束后檢幀總累計字節(jié)數(shù)是否 與上位機發(fā)送的文件總字節(jié)數(shù)一致,若二者字數(shù)一致,則表明通過正確性檢查,然后進行各 flash讀寫檢查,通過后清除升級文件下發(fā)完成標志,置需要升級標志和幀檢查完成標志, 然后重啟電能表進行升級操作;否則表示升級文件存在錯誤,然后清除升級文件發(fā)送完成 標志,置升級文件錯誤標志,退出升級文件正確性檢查,電能表正常運行,不進行升級操作。
[0030] (2)判斷該條記錄的地址合法性,若該地址不合法,則表示升級文件存在錯誤,然 后清除升級文件發(fā)送完成標志,置升級文件錯誤標志,退出升級文件正確性檢查,電能表正 常運行,不進行升級操作;若為合法地址,則進行下一判斷。
[0031] (3)判斷當前記錄最后的校驗字是否和計算出的校驗字一致,若一致,則將該條記 錄的長度與之前的該固定長度已解析總字節(jié)數(shù)合并,然后從當前記錄的末地址起,再讀取 固定長度未解析的下一條記錄,并重復(fù)上述解析與判斷操作;直至升級文件的數(shù)據(jù)均通過 數(shù)據(jù)長度的檢查、地址合法性的檢查以及校驗字的一致性檢查,并得出升級文件通過正確 性檢查的結(jié)論;否則表示升級文件存在錯誤,然后清除升級文件發(fā)送完成標志,置升級文件 錯誤標志,退出升級文件正確性檢查,電能表正常運行,不進行升級操作。
[0032] 其具體步驟如下。
[0033] Stepl,從升級文件存儲基地址g_lAccumAddr開始,該地址g_lAccumAddr=START_ FW_ADDR,其中START_FW_ADDR為約定的升級文件在電能表外部存儲器中存儲的基地址。
[0034] Step2,清零升級文件已解析總字節(jié)數(shù)g_lAccumReadCnt和當前已檢字節(jié)個數(shù)s_ iCheckCount,然后以升級文件存儲基地址加上升級文件已解析總字節(jié)數(shù)g_lAccumAddr+g_ lAccumReadCnt作為起始地址,從外部存儲器讀取256字節(jié)數(shù)據(jù)。
[0035] 第一次執(zhí)行step2時,才對升級文件已解析總字節(jié)數(shù)g_lAccumReadCnt進行清零 操作,而中間跳轉(zhuǎn)至step2時,則不對其清零了。
[0036] St印3,因為升級文件為HEX格式文件,由HEX格式文件特性,讀取256字節(jié)中下一 條未解析的記錄,從中讀出該條未解析記錄的長度s_cFrameLen。
[0037] Step4,若該條未解析記錄的長度s_cFrameLen與當前已檢字節(jié)個數(shù)s_ iCheckCount之和大于256字節(jié),貝U表示該條未解析記錄長度不完整,所以將當前已檢字節(jié) 個數(shù)s_iCheckCount合并到升級文件已解析總字節(jié)數(shù)g_lAccumReadCnt,下次讀256字節(jié)數(shù) 據(jù)時,以升級文件存儲基地址加上升級文件已解析總字節(jié)數(shù)作為起始地址開始讀取。
[0038] 本發(fā)明每次讀出256字節(jié)數(shù)據(jù)后,考慮到不一定是完整條數(shù)的幀,每次只檢測256 字節(jié)中的完整幀;當前已檢字節(jié)數(shù)加上此次檢幀幀長,如果大于從外部存儲器處讀出來的 256字節(jié),表示此次幀不完全,放棄檢幀。也就是說,本發(fā)明的升級文件正確性檢查函數(shù)每次 只讀取固定字節(jié),一旦要讀取的數(shù)據(jù)超出該固定字節(jié)數(shù),則重新讀取,實現(xiàn)"讀少則重讀"。
[0039] 變量s_iCheckCount為每次檢巾貞時,當前已檢字節(jié)個數(shù)。變量s_cFrameLen為當 前行字節(jié)個數(shù)(加上固定幀頭cs字節(jié))。
[0040] St印5,若上述記錄行長度與已檢字節(jié)個數(shù)之和不大于256字節(jié),則表示該條未檢 記錄在256字節(jié)中沒有缺少數(shù)據(jù),為完整記錄,進入下一步操作,解析出當前該條記錄的地 址Addr、記錄類型Record和數(shù)據(jù)Data。
[0041] Step6,首先進行該數(shù)據(jù)Data域長度判斷。
[0042] 由Hex文件特性,數(shù)據(jù)Data域存在一個最大長度,對于電能表Hex文件,最大為 0x20字節(jié)。
[0043] 判斷數(shù)據(jù)長度Data是否滿足:0 <數(shù)據(jù)Data長度彡定義幀長度DEFINE_FRAME_ LEN。
[0044] Step7,若滿足上述要求,則進入下一步判斷當前該條記錄的地址Addr的合法性。
[0045] St印8,若不滿足,則再判斷該數(shù)據(jù)Data長度是否為0,若不為0,則返回值為假 False。
[0046] St印9,若為0,則判斷該數(shù)據(jù)Data是否為文件結(jié)束的內(nèi)容,根據(jù)Hex文件特性,當 類型Record為1且地址ADDR為0時,表示文件結(jié)束。
[0047] St印10,若不為文件結(jié)束,則返回值為假False。
[0048] 若為文件結(jié)束,則將最后讀取的256字節(jié)數(shù)據(jù)里的已檢字節(jié)個數(shù)和文件結(jié)束記錄 包含的字節(jié)數(shù)更新到升級文件已解析總字節(jié)數(shù)中。
[0049] St印11,然后再判斷文件結(jié)束后升級文件已解析總字節(jié)數(shù)是否和上位機發(fā)送的文 件總字節(jié)數(shù)一致,若總字節(jié)數(shù)一致,則升級文件的正確性檢查結(jié)束并返回值為真True;若 總字節(jié)數(shù)不一致,則返回值為假False。
[0050] Step8',在判斷當前該條記錄的地址Addr的是否合法時,若該地址Addr不合法, 貝1J,返回值為假False。
[0051] StepV ,若該地址Addr合法,則再判斷每一條記錄最后的校驗字是否和計算出 的校驗字一致,若一致,則更新當前已檢字節(jié)個數(shù)s_iCheckCount,并取下一行未檢查記錄, 轉(zhuǎn)至Step3。若不一致,貝U返回值為假False。
[0052] 如圖4所示,本發(fā)明中,電能表可根據(jù)對應(yīng)標志的值,自動選擇是否進行升級,具 體操作流程如下。
[0053] Stepl,電能表上電啟動。
[0054] Step2,檢查外部Flash是否讀寫正確,若讀寫不正確,則電能表的IXD顯示故障, 為錯誤狀態(tài)4 (Err State4),顯示完成后,電能表進入正常運行狀態(tài)。
[0055] 若讀寫正確,則檢查需要升級標志g_bNeedUpdateFlg和檢巾貞正確標志g_ bGoodFirmwarefFlg,判斷電能表是否需要更新。
[0056] Step3,若需要升級標志g_bNeedUpdateFlg和檢巾貞正確標志g_ bGoodFirmwarefFlg兩個標志均有效,則執(zhí)行升級,進入下一步操作。
[0057] 若二者中至少有1個標志無效,則電能表不進行升級,電能表依然正常運行。
[0058] Step4,進行電源檢查:調(diào)用電源檢測函數(shù),避免電源連續(xù)波動不穩(wěn)定。
[0059] 檢測3. 3V電源,上電后,連續(xù)檢測20次(加延時),其中若有一次檢測發(fā)現(xiàn)該電源 電壓低于3. 0V,則重新檢測。20次連續(xù)檢測均符合要求,才通過該電源檢查。
[0060] Step5,關(guān)閉所有中斷以及外設(shè),停止計量。給g_lAccumReadCnt賦初值0。由于 在芯片中,128K內(nèi)部flash分為bank(Tbank3四個區(qū)域,定義bankO為非更新區(qū),其余三個 bank為更新區(qū),所以擦除內(nèi)部flash中bankl到bank3區(qū)域。
[0061] Step6,從外部存儲器中讀lkb數(shù)據(jù)到RAM區(qū),其起始地址為:升級文件已累積寫入 總字節(jié)數(shù)g_lAccumReadCnt+升級文件存儲基地址START_FW_ADDR。
[0062] 本發(fā)明將RAM的lkb數(shù)據(jù)區(qū)域定義在MCU的最后lkb空間。
[0063] St印7,調(diào)用lkb寫函數(shù)寫MCU的內(nèi)部Flash。
[0064] Step8,判斷寫入的升級文件是否結(jié)束,若已結(jié)束,則表明該電能表升級完 成,更新所有標志Fig,即清除需要升級標志g_bNeedUpdateFlg和檢巾貞正確標志g_ bGoodFirmwarefFlg。
[0065] 若未結(jié)束,則將當前已寫入內(nèi)部flash字節(jié)數(shù)g_iReadIndex更新到升級文件已累 積寫入總字節(jié)數(shù)g_lAccumReadCnt中,再轉(zhuǎn)至Step6。
[0066] 如圖5所示,本發(fā)明的lkb寫函數(shù)包括如下步驟。
[0067] 步驟1,給當前已寫入內(nèi)部flash字節(jié)數(shù)g_iReadIndex賦初值0。當前已寫入內(nèi) 部flash字節(jié)數(shù)g_iReadIndex為每次從外部存儲器中讀取lkb數(shù)據(jù)后檢巾貞時當前已寫入 內(nèi)部flash的字節(jié)數(shù)。
[0068] 步驟2,讀一行記錄,解析出一行記錄長度S_cCurrLinLen、記錄里的MCU地址S_ lWriteMCUAddr、記錄類型 g_iReadstyle。
[0069] 步驟3,判斷當前已寫入內(nèi)部flash字節(jié)數(shù)加上該條正在檢查的記錄幀長度是否 超出了讀取的lkb數(shù)據(jù)長度;若沒有超出,則分析該條記錄的MCU地址S_lWriteMCUAddr, 判斷是否需要進行地址偏移,是否需要更換寫入的Bank,然后做相應(yīng)處理,轉(zhuǎn)至步驟4。
[0070] 若超出,則返回狀態(tài)值STATE為0,表明lkb數(shù)據(jù)中的完整記錄已經(jīng)全部解析寫入 完成。
[0071] 步驟4,判斷記錄類型是否為數(shù)據(jù)類型,若是數(shù)據(jù)類型,則調(diào)用寫Flash函數(shù)。
[0072] Parameter: s_pDstpointer(MCU), s_pSourcePointer(RAM), s_cLEN s_pDstpointer 是目的指針,指向 MCU。s_pSourcePointer 是源指針,指向 RAM。s_cLEN 是數(shù)據(jù)長度。
[0073] 若不是數(shù)據(jù)類型,則直接轉(zhuǎn)至步驟5。
[0074] 步驟5,將當前該條已解析記錄長度更新到當前已寫入內(nèi)部flash字節(jié)數(shù):g_ iReadIndex+=S_cCurrLinLen ;再轉(zhuǎn)至步驟 2。
[0075] 如圖6所示,bankO定義為不可更新區(qū)域,包含:中斷向量表、初始化程序Startup、 10變量、LCD函數(shù)、Flash相關(guān)代碼、標志Fig存儲區(qū)(該區(qū)域可寫)、保留區(qū)域;功能函數(shù) 區(qū)域(該功能函數(shù)為要運行升級所必須的函數(shù),不能進行更新,否則電能表無法啟動進行 更新);bankl~bank3定義為可更新區(qū),存儲的是功能函數(shù)代碼,該區(qū)域可以在升級過程中 擦除和重新寫入數(shù)據(jù)而不會影響到升級程序的正常運行。
[0076] 中斷向量表要求所有服務(wù)程序都固定地址,所以中斷向量表中的函數(shù)都必須位于 bankO區(qū)域,該區(qū)域不可更新,升級前后函數(shù)地址不會產(chǎn)生變化。
[0077] 在芯片定義中,bankO地址為0x000(T0x7fff,bankl?bank3的地址均為 0x800(T0xffff,三個bank共用同樣的地址,需要根據(jù)bank選擇字來區(qū)分是哪一個bank,當 標志字為1時,選擇的為bankl,為2時選擇的為bank2,為3時選擇的為bank3,因此本發(fā)明 根據(jù)MCU地址S_lWriteMCUAddr確定該條記錄的數(shù)據(jù)應(yīng)該寫入哪個bank區(qū)域,然后將電能 表內(nèi)部flash切換到該bank區(qū)域后再寫入數(shù)據(jù)。本發(fā)明將升級文件覆蓋升級前的文件,升 級前的文件除存儲在不可更新區(qū)域的內(nèi)容外,其余內(nèi)容全部被擦除替換。
【權(quán)利要求】
1. 一種電能表在線升級方法,該方法包括如下步驟: 步驟一,上位機發(fā)送清除外部存儲器的命令到電能表,將升級文件的存儲區(qū)域清零; 步驟二,上位機發(fā)送升級文件到指定編號的電能表的外部存儲器指定位置,進行升級 文件的正確性檢查、外部存儲器的讀寫正確性檢查和MCU的內(nèi)部Flash的讀寫正確性檢查, 若檢查通過,則轉(zhuǎn)至步驟三;若檢查未通過,則不進行后續(xù)的升級操作,需重新發(fā)送升級文 件; 步驟三,電能表重新啟動;啟動過程中,電能表選擇執(zhí)行或者不執(zhí)行升級程序; 若不執(zhí)行升級文件,電能表正常運行; 若執(zhí)行升級文件,電能表檢查外部存儲器和MCU內(nèi)部Flash的讀寫正確性,并擦除該內(nèi) 部Flash的對應(yīng)存儲區(qū)域;再將外部存儲器的升級文件分多次讀到RAM空間,然后再更新到 該內(nèi)部Flash中,升級文件全部更新完成后,重啟電能表,完成升級操作。
2. 根據(jù)權(quán)利要求1所述的電能表在線升級方法,其特征在于,所述上位機發(fā)送升級文 件完成后,清除需要升級標志和檢幀正確標志,置位升級文件下發(fā)完成標志;所述升級文件 的正確性檢查通過后,置位檢幀正確標志和需要升級標志;若未通過,則清除該檢幀正確標 志和升級文件下發(fā)完成標志;所述電能表升級完成,清除上述所有標志。
3. 根據(jù)權(quán)利要求2所述的電能表在線升級方法,其特征在于,所述檢幀正確標志和需 要升級標志都有效時,所述電能表執(zhí)行升級文件;若二者有任一無效,則所述電能表不執(zhí)行 升級文件。
4. 根據(jù)權(quán)利要求1所述的電能表在線升級方法,其特征在于,所述升級文件的正確性 檢查是檢查在外部存儲器中存儲的升級文件的合法性;包括如下步驟: 第一步,從所述升級文件存儲起始地址開始,循環(huán)讀取固定長度的該升級文件內(nèi)容,再 解析出該固定長度升級文件內(nèi)容中一條完整的記錄; 第二步,解析該條記錄中數(shù)據(jù)的長度;根據(jù)長度判斷該記錄的末端是否超出固定長度, 若超出,則以該記錄首端作為開始地址,轉(zhuǎn)至第一步,若不超出,則轉(zhuǎn)至下一步; 第三步,判斷所述記錄長度是否滿足設(shè)定要求,如滿足,則轉(zhuǎn)至下一步;否則得出未通 過正確性檢查的結(jié)論,并返回; 第四步,解析出當前所述記錄的地址、記錄類型和校驗字; 第五步,判斷該條記錄的地址合法性,若為合法地址,則轉(zhuǎn)至下一步;否則得出未通過 正確性檢查的結(jié)論,并返回; 第六步,判斷當前所述記錄的校驗字是否和計算出的校驗字一致,若一致,則從當前所 述記錄的地址起,再讀取所述固定長度的下一條記錄,并轉(zhuǎn)至第二步;直至所述升級文件的 數(shù)據(jù)均通過所述數(shù)據(jù)長度的檢查、所述地址合法性的檢查以及所述校驗字的一致性檢查, 并得出所述升級文件通過正確性檢查的結(jié)論,并返回;否則得出未通過正確性檢查的結(jié)論, 并返回。
5. 根據(jù)權(quán)利要求4所述的電能表在線升級方法,其特征在于,所述記錄中數(shù)據(jù)的長度 不滿足設(shè)定要求,則判斷其長度是否為〇,若不為〇,則判斷得出未通過正確性檢查的結(jié)論, 并返回; 若其長度為〇,則判斷所述升級文件是否結(jié)束,若不為文件結(jié)束,則判斷得出未通過正 確性檢查的結(jié)論,并返回;若為文件結(jié)束,則將最后讀取的所述固定字節(jié)數(shù)據(jù)里的檢幀正確 字節(jié)數(shù)和文件結(jié)束記錄字節(jié)數(shù)更新到總字節(jié)數(shù)中,再判斷所述升級文件結(jié)束后已檢總字節(jié) 數(shù)是否與上位機發(fā)送的文件總字節(jié)數(shù)一致,若二者字數(shù)一致,則表明通過正確性檢查,并返 回;否則判斷得出未通過正確性檢查的結(jié)論,并返回。
6. 根據(jù)權(quán)利要求1所述的電能表在線升級方法,其特征在于,所述執(zhí)行升級文件前,所 述電能表首先關(guān)閉所有中斷,停止電能計量;接著該電能表的LCD對應(yīng)指示升級進行中;然 后進行電源檢查,然后檢查檢幀正確標志和需要升級標志是否置位,再進行所述外部存儲 器和所述內(nèi)部Flash的讀寫正確性檢查,通過后則進行升級。
7. 根據(jù)權(quán)利要求6所述的電能表在線升級方法,其特征在于,所述電源檢查是檢測電 源V3P3,上電N秒后,連續(xù)檢測Μ次;若有一次檢測該電源低于3. 0V,則重新檢測。
8. 根據(jù)權(quán)利要求1所述的電能表在線升級方法,其特征在于,所述將外部存儲器的升 級文件分多次讀到RAM空間需要對每次讀入的內(nèi)容進行校驗位、數(shù)據(jù)長度和地址的合法性 判斷;只有每次讀入的內(nèi)容為合法內(nèi)容時才再更新到所述MCU的內(nèi)部Flash中。
【文檔編號】G06F9/445GK104063254SQ201410332571
【公開日】2014年9月24日 申請日期:2014年7月14日 優(yōu)先權(quán)日:2014年7月14日
【發(fā)明者】楊旺, 李軍, 李強 申請人:威勝集團有限公司