許多應用系統中都需要進行程式**公升級,如果程式**在外部flash儲存其中,實現程式**公升級可以對外部flash直接操作,分塊擦除和程式設計。但對於一些系統程式**在微控制器內部的,就要求此微控制器支援iap(in-application-programming)功能。本文即介紹此情況下的isp(in-system-programming)程式設計方法,以及在sst和stc微控制器上的具體實現。
一. isp實現基本結構
isp實現方式有很多種,但大致都遵循以下流程:
其中,判斷使用者isp選擇,一般有以下幾中方式:
1. 連線計算機系統,由系統的命令選擇
進入使用者isp選擇判斷時,先由微控制器傳送特定特徵資料,然後等待命令資料,如果在一定的時間內,接收到計算機系統發出的選擇命令則進入使用者**公升級,否則直接跳轉使用者**執行。
2. 由使用者板上的跳線選擇
一般利用微控制器空餘的埠,設計乙個**公升級選擇跳線。進入使用者isp選擇判斷時,微控制器可以直接根據此埠的狀態判斷進入使用者**公升級還是直接跳轉使用者**執行。
3. 由使用者板操作功能選擇
在使用者板的功能選單或功能組合中允許使用者選擇**公升級功能,同時,在外部儲存器中存放相應的標誌。當選擇**公升級功能時,在外部儲存器中寫入特定資料,然後程式復位,進入使用者isp選擇判斷時,判斷外部儲存器中的資料,如果符合條件則進入使用者**公升級,否則直接跳轉使用者**執行。
二. iap程式設計
目前許多微控制器都支援iap功能,一般這些微控制器內部都包含兩個flash塊,在一塊flash中執行的程式可對另一塊flash進行擦除和重新程式設計。一般我們都將isp程式存放在容量較小的一塊flash中(block1),而將使用者**存放在容量較大的一塊flash中(block0)。block1中的isp程式對block0中的使用者**進行擦除和重新程式設計。
我們以兩種51系列相容的flash微控制器為例,介紹iap的程式設計。一種是sst89c54,另一種是stc89c516rd。
1. sst89c54相關特性:
sst89c54內部有20k(16k+4k)程式儲存器,統一編址。block0:0000h~3fffh;block1:
f000h~ffffh;block1可以選擇對映到0000h位址開始的1k/2k/4k程式區。
2. stc89c516rd相關特性:
sst89c516rd內部有72k(64k+8k)程式儲存器。block0:0000h~ffffh,block1可以選擇對映到0000h位址開始的8k程式區(上電復位確省為位址對映)。
sst與stc微控制器的iap操作幾乎完全相同,附件中給出了iap函式的c程式源**。要特別注意的是,block0_erase函式中對於block0的選擇,兩種微控制器是不同的(正好相反)。
三. isp程式到使用者**的切換
在設計中一般都將isp程式設計為上電復位後執行的程式,如果不需要使用者**公升級或公升級完成後,就要將程式切換到使用者**執行。isp程式到使用者**的切換,不同的微控制器各不相同。
1. sst89c54程式區block1到block0的切換實現:
sst89c54微控制器在燒錄時,將isp程式寫到block1,並且燒錄對映選擇位rb0/rb1(re-map[1:0])。這樣,程式上電復位時,自動將block1對映到0000h位址開始的4k程式區,進入isp程式執行。
由於block1同時還分配在位址:f000h~ffffh,因此,編譯生成isp程式**時,設定所有的位址範圍都在f000h~ffffh。需要切換到使用者**(block0)執行時,修改sfcf[7]控制位vis,將block1的0000h位址對映取消,然後程式跳轉到位址0000h執行,則開始執行block0中的使用者**程式。
附件中給出了isp的c程式源**。要注意的是:此程式在keil-c中要建立工程檔案,包含函式以及並且在和中都要去掉stc的定義。
為了將位址範圍設定到f000h~ffffh,要將中程式入口位址由0改為0f000h,如下:
cseg at 0f000h
?c_startup: ljmp startup1
還要修改編譯選項設定target選項卡中off-chip code memory:start =0xf000;size=0x1000;還要設定c51選項卡中interrupt vectors at address:0xf000。
2. stc89c516rd程式區block1到block0的切換實現:
stc89c516rd微控制器在燒錄時,將isp程式寫到block1。(注意:並不燒錄sc0/sc1位)。
微控制器上電復位時,由於預設地block1對映到0000h位址開始的8k程式區,進入isp程式執行。需要切換到使用者**(block0)執行時,isp修改sfcf[1]控制位swr,產生乙個軟復位(software reset)。由於sc0和sc1都未燒錄,程式軟復位後,block1將不再對映到0000h位址映,則開始執行block0中的使用者**程式。
附件中給出了isp的c程式源**。要注意的是:此程式在keil-c中要建立工程檔案,包含函式,並且在和中都要保留stc的定義。
四. 與計算機連線的通訊協議
公升級使用者**時,需要與計算機進行通訊,一般採用rs232序列通訊,資料協議採用簡單協議。此協議參考了aduc812微控制器的isp資料協議。(aduc812微控制器硬體內建isp程式)
1. 復位命令(計算機->微控制器)
計算機傳送四位元組復位命令:21h,5ah,00h,a6h,微控制器返回復位資訊。
2. 復位資訊(微控制器->計算機)
復位資訊為25位元組,前三位元組為微控制器公司特徵字元(如:「adi」「sst」「stc」),最後一位元組為效驗和。
3. 資料報格式(計算機->微控制器)
計算機傳送資料報格式:07h,0eh,長度,資料,效驗和(長度與資料的效驗和)。
4. 擦除命令
計算機傳送資料報,其中資料只有一位元組,內容為:字元』a』或』c』。微控制器擦除使用者程式區後返回一位元組06h表示成功;05h表示失敗。
5. 程式設計命令
計算機傳送資料報,其中資料內容:』w』,00h,位址高位元組,位址低位元組,程式資料。微控制器返回一位元組06h表示成功;05h表示失敗。
6. 執行使用者程式
計算機傳送資料報,其中資料只有一位元組,內容為:字元』u』。微控制器返回一位元組06h表示成功,然後跳轉使用者程式執行。
附件提供了計算機**軟體的c程式源**。
五. 結束語
根據以上isp程式設計思路和例項,大家可以修改isp初始**,或者豐富其他的isp功能(如:讀功能,口令控制等),嘗試設計自己的isp程式,定可以為自己的系統增色不少。
魏東 2004-7-25
附件一:
sst和stc微控制器iap操作函式
魏東(2004.7.23
#define stc定義為stc微控制器(如果是sst微控制器則去掉此行)*/
* sfr memory addresses
sfr sfcf = 0xb1; /*superflash configuration*/
sfr sfcm = 0xb2; /*superflash command*/
sfr sfal = 0xb3; /*superflash address low*/
sfr sfah = 0xb4; /*superflash address high*/
sfr sfdt = 0xb5; /*superflash data*/
sfr sfst = 0xb6; /*superflash status*/
* mcu iap commands
#define sfcm_be 0x0d; /*block-erase iap cmd*/
#define sfcm_se 0x0b; /*sector-erase iap cmd*/
#define sfcm_vb 0x0c; /*byte-verify iap cmd*/
#define sfcm_pb 0x0e; /*byte-program iap cmd*/
bit iap_error=0;
void block0_erase(void);
void sector_erase(unsigned int);
void byte_program(unsigned int, unsigned char);
unsigned char byte_verify(unsigned int);
unsigned char ready(void);
ISP方案設計
現況評估,明確問題確定目標,制定指標 採取策略 責任人,完成時間 張明有因藥物依從性差導1 增加對精神健康的認識,預防 1 有關藥物 對保持心理健康重要張明 個案管理員致精神 症 的病史2 認識到疾病 的方式和早期症狀性的健康教育,提供健康教育資料 3 定時定量服藥,定時複診2 確認 的跡象和症狀持...
主題班會設計自己的事自己做
5 訪問家長。由小組長帶領到各家長面前訪問 另設訪問提綱 6 主持人請各組匯報訪問情況。主持 原來,有的同學在家裡能主動做力所能及的事,為父母分擔,主動搞好學習,免父母操心 但也有的同學每天都要父母的監督 提示來生活。不過沒關係,只要我們能改正,也能行,就好像接下來的下品 好孩子 中的小明那樣,通過...
主題班會設計 自己的事自己做
一 活動目標 1 在學校能做團結友愛,善於合作的小夥伴 在家能成為孝敬父母,自己的事自己做的好孩子。2堅持每天在家自己的事自己做,不會做的學著做。如 自己洗衣服 打掃房間 做飯 買菜 3堅持養成孝敬父母的好習慣,如 每天給父母沏杯茶 好吃的東西請長輩先嚐 自主 主動學習,不讓父母操心 耐心傾聽父母的...