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