<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > dsPIC33F單片機的程序升級探討

dsPIC33F單片機的程序升級探討

作者: 時(shí)間:2011-09-19 來(lái)源:網(wǎng)絡(luò ) 收藏

  引言

  實(shí)際應用中,由于客戶(hù)需求變化或程序BUG修改等原因,經(jīng)常出現需要使單片機應用的情況,本文利用單片機運行時(shí)的自編程(Run-Time Serf-Programming,RTSP)特性,實(shí)現了基于該單片機應用程序的升級功能。

  1 基本原理

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

  1.1 dsPIC33F單片機的程序存儲器內部結構

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

  

dsPIC33F單片機的程序升級探討

  1.2 程序升級功能的實(shí)現流程

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

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

  由于引導程序和應用程序都可能用到中斷,因此應用程序采用中斷向量表,引導程序采用備用中斷向量表,以執行各自相應的中斷服務(wù)子程序。值得注意的是,在圖2(a)中引導程序的首址為0x000400,這是因為dsPIC33F單片機執行一次擦除指令會(huì )擦除512條指令空間(即1“ 塊”,占用1 024個(gè)地址單元),這意味著(zhù)程序升級必須以1 024(即0x400)為單位。同理,應用程序的首址必須為0x400的整數倍,本文采用0x00C800。

  從以上基本原理的分析可看出,程序升級功能的實(shí)現主要就是引導程序的實(shí)現。


上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: dsPIC33F 程序升級

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>