當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式硬件
[導(dǎo)讀]dsPIC33F系列單片機(jī)是美國(guó)微芯公司(Microchip)推出的一款高性能單片機(jī),它將數(shù)字信號(hào)處理器(Digital Signal Processor,DSP)的高速運(yùn)算能力與單片機(jī)的控制特性無(wú)縫地集成在一起,為嵌入式系統(tǒng)設(shè)計(jì)提供了高性價(jià)比的單芯片、單指令流的解決方案,在音頻處理、視頻處理及工業(yè)控制等方面得到了廣泛應(yīng)用。但是在實(shí)際應(yīng)用中,由于客戶需求變化或程序BUG修改等原因,經(jīng)常出現(xiàn)需要使單片機(jī)應(yīng)用程序升級(jí)的情況,本文利用dsPIC33F單片機(jī)運(yùn)行時(shí)的自編程(Run-Time Serf-Progra

0 引言

dsPIC33F系列單片機(jī)是美國(guó)微芯公司(Microchip)推出的一款高性能單片機(jī),它將數(shù)字信號(hào)處理器(Digital Signal Processor,DSP)的高速運(yùn)算能力與單片機(jī)的控制特性無(wú)縫地集成在一起,為嵌入式系統(tǒng)設(shè)計(jì)提供了高性價(jià)比的單芯片、單指令流的解決方案,在音頻處理、視頻處理及工業(yè)控制等方面得到了廣泛應(yīng)用。但是在實(shí)際應(yīng)用中,由于客戶需求變化或程序BUG修改等原因,經(jīng)常出現(xiàn)需要使單片機(jī)應(yīng)用程序升級(jí)的情況,本文利用dsPIC33F單片機(jī)運(yùn)行時(shí)的自編程(Run-Time Serf-Programming,RTSP)特性,實(shí)現(xiàn)了基于該單片機(jī)應(yīng)用程序的升級(jí)功能。

1 基本原理

dsPIC33F系列單片機(jī)提供了兩種方式用于對(duì)其內(nèi)部程序存儲(chǔ)器進(jìn)行編程:在線串行編程(In-Circuit Serial Programming,ICSP)和運(yùn)行時(shí)自編程(Run-TimeSelf-Programming,RTSP)。ICSP使用5根線對(duì)單片機(jī)編程,主要用于產(chǎn)品調(diào)試或生產(chǎn)過(guò)程中,顯然不適合用于產(chǎn)品運(yùn)行時(shí)的程序升級(jí)。RTSP是通過(guò)使用TBLRD(表讀)和TBLWT(表寫(xiě))指令來(lái)完成的,使用RTSP可以一次將64條指令(192 B)的塊(或“行”)或單個(gè)程序存儲(chǔ)字寫(xiě)入程序存儲(chǔ)器,也可以一次擦除512條指令(1 536 B)的塊(或“頁(yè)”),由于該方法采用程序指令實(shí)現(xiàn)了自編程,可應(yīng)用于產(chǎn)品運(yùn)行時(shí)的程序升級(jí),因此本文采用RTSP方法實(shí)現(xiàn)基于dsPIC33F系列單片機(jī)的應(yīng)用程序升級(jí)功能。程序升級(jí)的實(shí)質(zhì)是對(duì)程序存儲(chǔ)器內(nèi)容的更新,所以有必要先了解一下dsPIC33F單片機(jī)的程序存儲(chǔ)器內(nèi)部結(jié)構(gòu)。

1.1 dsPIC33F單片機(jī)的程序存儲(chǔ)器內(nèi)部結(jié)構(gòu)

dsPIC33F單片機(jī)的程序存儲(chǔ)器結(jié)構(gòu)如圖1所示。一般情況下,“復(fù)位地址”的內(nèi)容為全0,單片機(jī)復(fù)位后均從程序存儲(chǔ)器地址0的位置上開(kāi)始執(zhí)行,即從圖1中的“GOTO指令”位置開(kāi)始執(zhí)行。在這里存放了一個(gè)跳轉(zhuǎn)指令,直接指向用戶程序的首址,默認(rèn)情況下該位置的指令為“GOTO 0x200”,即默認(rèn)跳轉(zhuǎn)到首址為0x200的用戶程序(圖1中的“用戶程序存儲(chǔ)空間”)開(kāi)始執(zhí)行。dsPIC33F單片機(jī)具有2個(gè)中斷向量表,即“中斷向量表”和“備用中斷向量表”,地址分別從0x000004~0x0000FF和0x000100~0x0001FF這兩個(gè)中斷向量表允許使用不同的中斷服務(wù)程序來(lái)處理每個(gè)中斷源。程序升級(jí)功能正是基于程序存儲(chǔ)器內(nèi)部結(jié)構(gòu)的以上特性而實(shí)現(xiàn)。

1.2 程序升級(jí)功能的實(shí)現(xiàn)流程

將圖1中的“用戶程序存儲(chǔ)空間”分為引導(dǎo)程序和應(yīng)用程序2部分,如圖2(a)所示。引導(dǎo)程序用于引導(dǎo)用戶程序是進(jìn)入升級(jí)狀態(tài),還是進(jìn)入正常運(yùn)行狀態(tài),若進(jìn)入升級(jí)狀態(tài)則接收新的程序數(shù)據(jù),并更新程序存儲(chǔ)器的內(nèi)容;若進(jìn)入正常運(yùn)行狀態(tài)則程序跳轉(zhuǎn)到應(yīng)用程序區(qū)。應(yīng)用程序是為了實(shí)現(xiàn)產(chǎn)品功能而編寫(xiě)的程序,也就是本文所謂“程序升級(jí)”的對(duì)象。

實(shí)際應(yīng)用中,將外部非易失性存儲(chǔ)器(如E2PROM)的某些存儲(chǔ)單元值當(dāng)作是否進(jìn)行程序升級(jí)的標(biāo)志(以下簡(jiǎn)稱(chēng)程序升級(jí)標(biāo)志)。單片機(jī)上電或復(fù)位后首先執(zhí)行“GOTO0x400”指令,即跳轉(zhuǎn)到引導(dǎo)程序。默認(rèn)情況下程序升級(jí)標(biāo)志是處于“正常運(yùn)行”狀態(tài)下的,引導(dǎo)程序調(diào)用跳轉(zhuǎn)指令將用戶程序引導(dǎo)到應(yīng)用程序區(qū),若運(yùn)行過(guò)程中發(fā)現(xiàn)服務(wù)器有新的應(yīng)用程序版本或接收到服務(wù)器發(fā)來(lái)的升級(jí)程序命令時(shí),單片機(jī)將程序升級(jí)標(biāo)志設(shè)置為“程序升級(jí)”狀態(tài),然后軟件復(fù)位單片機(jī)。這時(shí)程序再次跳轉(zhuǎn)到引導(dǎo)程序,根據(jù)程序升級(jí)標(biāo)志,單片機(jī)進(jìn)入程序升級(jí)狀態(tài),接收新的程序,并更新程序存儲(chǔ)器的內(nèi)容,升級(jí)完成后,單片機(jī)將程序升級(jí)標(biāo)志設(shè)置為“正常運(yùn)行”狀態(tài),然后再次軟件復(fù)位,此時(shí)單片機(jī)運(yùn)行于新的應(yīng)用程序中。

由于引導(dǎo)程序和應(yīng)用程序都可能用到中斷,因此應(yīng)用程序采用中斷向量表,引導(dǎo)程序采用備用中斷向量表,以執(zhí)行各自相應(yīng)的中斷服務(wù)子程序。值得注意的是,在圖2(a)中引導(dǎo)程序的首址為0x000400,這是因?yàn)閐sPIC33F單片機(jī)執(zhí)行一次擦除指令會(huì)擦除512條指令空間(即1“ 塊”,占用1 024個(gè)地址單元),這意味著程序升級(jí)必須以1 024(即0x400)為單位。同理,應(yīng)用程序的首址必須為0x400的整數(shù)倍,本文采用0x00C800。
從以上基本原理的分析可看出,程序升級(jí)功能的實(shí)現(xiàn)主要就是引導(dǎo)程序的實(shí)現(xiàn)。

2 引導(dǎo)程序的實(shí)現(xiàn)

2.1 程序流程

進(jìn)入引導(dǎo)程序后,程序的執(zhí)行流程如下:

(1)初始化電路板,包括單片機(jī)的工作頻率、外圍接口等,尤其要注意啟用單片機(jī)的“備用中斷向量表”。因?yàn)閐sPIC33F單片機(jī)復(fù)位后默認(rèn)啟用“中斷向量表”,而由基本原理的說(shuō)明可看出,引導(dǎo)程序必須采用“備用中斷向量表”。
(2)判斷程序走向,通過(guò)程序升級(jí)標(biāo)志判斷是跳轉(zhuǎn)到應(yīng)用程序,還是執(zhí)行程序升級(jí)流程。
(3)若程序升級(jí)標(biāo)志為“正常運(yùn)行”,則調(diào)用GOTO指令跳轉(zhuǎn)到應(yīng)用程序。
(4)若程序升級(jí)標(biāo)志為“程序升級(jí)”,則執(zhí)行程序升級(jí)流程,這是引導(dǎo)程序的重點(diǎn)。

程序升級(jí)按“塊”更新,每“塊”包含1 024個(gè)存儲(chǔ)單元(以字為單位),即每幀數(shù)據(jù)需包含2 048個(gè)字節(jié)的程序代碼。在更新程序時(shí)并不是簡(jiǎn)單地用接收到的新程序代碼覆蓋舊程序,對(duì)于一些特殊幀需特殊處理,通過(guò)對(duì)比應(yīng)用程序編譯后的程序存儲(chǔ)器結(jié)構(gòu)與實(shí)際應(yīng)用中的程序存儲(chǔ)器結(jié)構(gòu)可以很好地理解這點(diǎn)。圖2(a)所示為實(shí)際應(yīng)用中的程序存儲(chǔ)器內(nèi)部結(jié)構(gòu);(b)為應(yīng)用程序編譯后的程序存儲(chǔ)器結(jié)構(gòu)。通過(guò)對(duì)比這兩張圖可以看出,“GOTO指令”、“備用中斷向量表”、“引導(dǎo)程序”這些區(qū)間的程序不能直接覆蓋,若“GOTO指令”被覆蓋,則程序升級(jí)后程序直接跳轉(zhuǎn)到應(yīng)用程序,不會(huì)執(zhí)行引導(dǎo)程序;若“備用中斷向量表”被覆蓋,則引導(dǎo)程序中的中斷服務(wù)程序無(wú)法執(zhí)行;若“引導(dǎo)程序”區(qū)間的內(nèi)容被覆蓋,則引導(dǎo)程序被清空,顯然會(huì)帶來(lái)災(zāi)難性的后果。因此對(duì)于第1幀數(shù)據(jù)需特別處理,該幀數(shù)據(jù)對(duì)應(yīng)程序存儲(chǔ)器第1塊(地址為0~0x3FF)的內(nèi)容,包含“GOTO指令”、“復(fù)位地址”、“中斷向量表”和“備用中斷向量表”的內(nèi)容,為了保證"GOTO指令”和“備用中斷向量表”的內(nèi)容不被修改,需要先讀出原“GOTO指令”和“備用中斷向量表”的內(nèi)容,替代接收數(shù)據(jù)緩沖區(qū)中對(duì)應(yīng)位置的內(nèi)容,然后寫(xiě)入程序存儲(chǔ)區(qū)的第1塊;對(duì)于第2幀到第50幀(0xe800/0x400),這些是引導(dǎo)程序的內(nèi)容,顯然不能做任何修改,因此這幾幀數(shù)據(jù)接收后直接丟棄;從第51幀到最后一幀,這是應(yīng)用程序的內(nèi)容,也是真正要升級(jí)的內(nèi)容,所以可直接覆蓋舊內(nèi)容。程序升級(jí)后,將程序更新標(biāo)志恢復(fù)為“正常運(yùn)行”狀態(tài),然后復(fù)位CPU,則經(jīng)引導(dǎo)程序又進(jìn)入了新的應(yīng)用程序,從而實(shí)現(xiàn)了應(yīng)用程序的升級(jí)。

基于以上說(shuō)明可得引導(dǎo)程序的詳細(xì)流程如圖3所示。

2.2 關(guān)鍵細(xì)節(jié)的實(shí)現(xiàn)

(1)啟用“備用中斷向量表”。設(shè)置INTCON2寄存器中ALTIVT控制位的值,其值設(shè)置為“1”則啟用“備用中斷向量表”;設(shè)置為“0”則啟用“中斷向量表”。

(2)程序首址的設(shè)置。在以上流程的說(shuō)明中談到引導(dǎo)程序的首址為0x400,而應(yīng)用程序的首址為0xc800,則設(shè)置程序的首址可通過(guò)修改鏈接描述文件(.gld文件)實(shí)現(xiàn)。以dsPIC33FJ256GP710單片機(jī)為例,將引導(dǎo)程序首址改為0x400,其實(shí)現(xiàn)步驟為:打開(kāi)p33FJ256GP710.gld文件,將其中的“program(xr):ORIGIN=0x200,LENGTH=0x2AA00”改為“pro-gram(xr) :ORIGIN=0x400,LENGTH=0x2A900”;將“_ _CODE_ BASE=0x200”改為“_ _CODE_BASE=0x400”。應(yīng)用程序首址的修改也采用相同方法。

(3)讀/寫(xiě)程序存儲(chǔ)器。在參考文獻(xiàn)中有很完整的原理說(shuō)明,也有完整的源代碼,可直接使用。

(4)軟件復(fù)位CPU。在應(yīng)用程序運(yùn)行過(guò)程中發(fā)現(xiàn)需升級(jí)程序或在引導(dǎo)程序中升級(jí)程序完畢時(shí),均需對(duì)CPU進(jìn)行軟件復(fù)位,這可通過(guò)dsPIC33F單片機(jī)提供的“reset”指令實(shí)現(xiàn),可在程序相應(yīng)位置執(zhí)行“reset”指令即可。

3 實(shí)際應(yīng)用中若干問(wèn)題的探討

3.1 程序升級(jí)正確性問(wèn)題

上文僅重點(diǎn)說(shuō)明了程序升級(jí)的方法,未對(duì)程序升級(jí)的正確性展開(kāi)討論,但在實(shí)際應(yīng)用中,由于傳輸干擾的存在,接收的新程序數(shù)據(jù)可能出錯(cuò),這時(shí)如果沒(méi)有相應(yīng)的應(yīng)對(duì)措施,顯然會(huì)影響到產(chǎn)品的正常運(yùn)行。為了保證程序升級(jí)的正確性,常用的應(yīng)對(duì)措施有以下幾種:

(1)對(duì)每幀數(shù)據(jù)進(jìn)行嚴(yán)格的校驗(yàn)(如CRC校驗(yàn)),校驗(yàn)通過(guò)后再更新相應(yīng)的程序存儲(chǔ)區(qū);更新程序存儲(chǔ)區(qū)后,重新讀出程序存儲(chǔ)區(qū)數(shù)據(jù),并與接收到的數(shù)據(jù)進(jìn)行比較。只有當(dāng)數(shù)據(jù)比較無(wú)誤后才開(kāi)始接收下一幀數(shù)據(jù)。

(2)若不考慮硬件成本,也可外置一個(gè)數(shù)據(jù)存儲(chǔ)器,將所有新程序數(shù)據(jù)完全接收并校驗(yàn)通過(guò)后才統(tǒng)一更新程序存儲(chǔ)器,最后把整個(gè)程序存儲(chǔ)器的數(shù)據(jù)與接收到的數(shù)據(jù)逐一比對(duì),若比對(duì)無(wú)誤則升級(jí)結(jié)束。

(3)若應(yīng)用程序占用空間不大,也可將程序存儲(chǔ)器中應(yīng)用程序區(qū)再分為兩部分。程序升級(jí)時(shí)輪流覆蓋這兩部分,這種操作方式使程序存儲(chǔ)器同時(shí)保存舊版本和新版本兩個(gè)應(yīng)用程序,當(dāng)新版本程序因某種原因運(yùn)行不正常時(shí),可由引導(dǎo)程序?qū)?yīng)用程序切換到舊版本。

第(1)種方法最容易實(shí)現(xiàn),但是應(yīng)用程序只有在整個(gè)升級(jí)過(guò)程完全結(jié)束后才可以正常運(yùn)行,若升級(jí)過(guò)程因某種原因通信中斷,則應(yīng)用程序一直無(wú)法運(yùn)行,這是該方法最大的缺陷。

第(2)種方法也很容易實(shí)現(xiàn),而且由于它是在新程序數(shù)據(jù)全部接收后才開(kāi)始升級(jí),因此克服了第(1)種方法的缺陷,但是該方法需增加硬件成本,且要占用單片機(jī)更多的硬件資源(用于與外部存儲(chǔ)器之間的交互)。

第(3)種方法也可以克服第(1)種方法的缺陷,而且不需增加硬件成本,但是該方法的實(shí)現(xiàn)顯然比前兩種方法復(fù)雜得多。以上3種方法各有優(yōu)缺點(diǎn),在實(shí)際應(yīng)用中可根據(jù)實(shí)際情況選擇。

3.2 斷點(diǎn)續(xù)傳問(wèn)題

在實(shí)際應(yīng)用中,可能因某種原因(如斷電復(fù)位)而需重新開(kāi)始程序升級(jí),這時(shí)如果還是從第1幀數(shù)據(jù)開(kāi)始傳輸,則會(huì)造成時(shí)間上的浪費(fèi),而且對(duì)于一些以流量計(jì)費(fèi)的通信網(wǎng)絡(luò)(如GPRS)還會(huì)造成通信費(fèi)用的浪費(fèi),因此在實(shí)際應(yīng)用中有必要實(shí)現(xiàn)“斷點(diǎn)續(xù)傳”功能。這可通過(guò)模仿FTP斷點(diǎn)續(xù)傳原理來(lái)實(shí)現(xiàn),即單片機(jī)每正確接收并存儲(chǔ)一幀數(shù)據(jù)則刷新存儲(chǔ)于外部非易失性存儲(chǔ)器(如EEPROM)中的升級(jí)信息(含當(dāng)前幀號(hào)),若重新開(kāi)始程序升級(jí),則將當(dāng)前升級(jí)信息發(fā)給服務(wù)器,服務(wù)器可從“斷點(diǎn)”開(kāi)始發(fā)送數(shù)據(jù),從而實(shí)現(xiàn)了“斷點(diǎn)續(xù)傳”功能。

4 結(jié)語(yǔ)

基于dsPIC33F系列單片機(jī)的應(yīng)用程序升級(jí)方法已在開(kāi)發(fā)設(shè)計(jì)的IPPhone和安防系統(tǒng)等產(chǎn)品中成功應(yīng)用,且運(yùn)行穩(wěn)定可靠。雖然本文討論的程序升級(jí)方法是基于dsPIC33F系列單片機(jī),但其基本原理同樣適用于其他具備運(yùn)行時(shí)自編程或有應(yīng)用編程(In Appplication Program,IAP)功能的單片機(jī)中。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉