国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

C8051F130的遠程在線升級程序設計

發布時間:2010-6-3 19:03    發布者:李寬
關鍵詞: C8051F130 , 在線升級
本文詳細介紹了在某直放站監控系統中實現的基于C8051F130 的遠程在線程序升級系統的設計思路和方法。并提出了一些實際編程中需要注意的問題如KEIL 中程序的定位和C8051F130 程序切換時的PLL 設置等。

1. 引言

目前,采用FLASH 存儲介質來作為程序存儲器的單片機種類越來越多。和其他類型如OTP、EPROM 型單片機比較起來,FLASH 具有可擦寫方便,次數多,編程無需外加高電壓等特點。絕大多數FLASH 型單片機都可在運行時通過指令來直接擦寫內部FLASH,提供了IAP、ISP 功能,借助這個功能,就可以實現系統底層固件的在線升級功能。

C8051F130 單片機是SILICON LABS推出的完全集成的混合信號片上系統型MCU 芯片,功能十分強大。其采用高速、流水線結構的8051 兼容的CIP-51 內核,內部PLL可倍頻至100MIPS,具有2個串口,128KB 可在系統編程的FLASH 存儲器,8448(8K+256)字節的片內RAM,并包含了片內JTAG 調試電路。其功能完全滿足實現遠程在線程序升級系統的條件。

在專用網絡系統中實現遠程在線程序升級,其優點顯而易見,不僅極大的為系統維護提供了方便,還節省了大量的人力財力。本文詳細介紹了在某直放站監控系統中實現的基于C8051F130的遠程在線程序升級系統的設計思路和方法。

2. 設計思路

系統組網拓撲結構如圖1 所示,正常工作時,網管中心通過有線或無線通道對所屬各站點下位機狀態進行監控。網管中心通過查詢各站點下位機參數得到下位機固件版本號,如果固件版本號和現有最新固件版本號不同,則直接發送第一幀程序升級數據啟動遠程程序升級過程。因為監控系統需要實時工作,所以程序的升級也就必須在站點下位機系統工作過程中完成。在網管中心發送程序升級數據的過程中,站點下位機系統依然正常工作,只有全部接收完程序升級數據并校驗通過后,才跳轉到Bootloader 程序進行程序升級。



下位機硬件框圖如圖2 所示,CPU 選擇C8051F130,其他部分包括控制輸入輸出部分,人機接口電路,RS232 接口,EEPROM 器件24C16 等。RS232 接口作為系統的通訊接口可以外接電話MODEM或短信MODEM 等標準模塊,和網管中心組成有無線網絡,其所采用的具體形式不影響本文所述的遠程升級系統。EEPOM 器件24C16 由于可擦寫次數比FLASH 多,用來存儲系統的關鍵參數。



由于51 系列單片機外部總線地址為16 位,能直接尋址的最大范圍為64KB,所以C8051F130 將內部的128KB FLASH 程序存儲空間被分成了4 塊,BLOCK0、BLOCK1、BLOCK2、BLOCK3。每塊大小為32KB,0x0000~0x7FFF 地址空間始終為BLOCK0,作為公共段。可以通過設置程序存儲器空間塊選擇寄存器PSBANK 來選擇常量操作和取指操作地址在0x8000 ~0xFFFF 所指向的塊。



COBANK:常量操作存儲塊選擇位。

這兩位選擇常量操作(MOVC 和FLASH MOVX)地址在0x8000 ~0xFFFF 范圍的FLASH 存儲塊。

00:常量操作指向存儲塊0(注意,塊0 也映射到地址0x0000 ~0x7FFF)。
01:常量操作指向存儲塊1。
10:常量操作指向存儲塊2。
11:常量操作指向存儲塊3。

IFBANK:取指操作存儲塊選擇位這兩位選擇取指操作(地址在0x8000 ~0xFFFF 范圍)的FLASH 存儲塊。這兩位只能由位于BLOCK0 的程序改寫。

00:從存儲塊0 取指令(注意,塊0 也映射到地址0x0000 ~0x7FFF)。
01:從存儲塊1 取指令。
10:從存儲塊2 取指令。
11:從存儲塊3 取指令。

FLASH 的設計分配方案如下:



BLOCK0、BLOCK1 作為默認的64KB 程序存儲區空間,存儲正常工作時的固件程序。我們所使用的程序不會超過60KB,0x0000~0xEFFF 地址區60KB 空間用于存儲系統主程序,0xF000~0xFFFF 地址地址區4KB 空間用于存儲Bootloader 程序。

BLOCK2、BLOCK3 作為64KB 常量存儲區,用于存儲系統運行過程中接收到的程序升級數據。

如果要遠程對某指定站點的固件進行升級時,網管中心對該站點分幀發送程序升級數據,升級數據協議格式如下:



網管中心發送程序升級數據幀時,每幀數據大小固定為512 字節,幀序號從1 開始。從功能標志處起到數據部分最后一字節做累加和作為校驗碼。最后一幀不足512 字節部分加0xFF 補足。在發送過程中,由于每幀數據以0x1002 開始,0x1003 結束,中間碰到0x10 時,要再補發0x10。接收時除了幀頭幀尾,在幀中間時如果連續接收到兩個0x10,則需要去掉一個。

指定站點在成功接收完一幀程序升級數據后,如果校驗通過則擦除對應的BLOCK2 或者BLOCK3中的扇區。這里需要注意的是,C8051F130 的FLASH 扇區大小是1024 字節,而我們的數據幀大小定為512 字節,所以應該接收到每兩幀數據才擦除對應的扇區。將程序升級數據寫入FLASH 中,同時對每幀512 字節的程序升級數據做累加,并將其累加和作為校驗碼寫入EEPROM 指定位置,最后給出正確回應。如果校驗錯誤,則回應錯誤。網管中心接收到錯誤回應時應該重發上一幀數據,否則繼續發送下一幀數據。如果幀序號等于總幀數,說明指定站點接收到最后一幀數據,置需要進行程序升級標志,此標志至關重要,因此將其存儲在EEPROM 中,為增加其可靠性,另外還存儲其反碼作為校驗,
然后直接跳轉Bootloader 程序,以升級主程序。



程序跳轉到Bootloader 程序執行后,首先必須要檢查程序升級標志,如果為真,再檢查其校驗碼,只有兩者都符合預設的值,才認為確實需要進行程序升級。否則跳轉到主程序區執行。

程序升級過程如下:首先讀出24C16 中存儲的程序升級數據的總幀數,為防止寫入到BLOCK2/3中的程序升級數據有錯誤,從BLOCK2/3 中讀出每一幀512 字節的數據進行累加,檢查其是否和存儲在24C16 中的對應數據幀的累加校驗碼相等。如果所有的的程序升級數據校驗都通過,則說明數據正確,開始擦除主程序區FLASH,并再次讀出BLOCK2/3 中的程序升級數據寫入主程序區FLASH。完成后擦除程序升級標志,跳轉到主程序區開始執行新版本固件程序。在讀出校驗過程中,只要有一幀數據校驗通不過,則認為寫入到BLOCK2/3 的程序升級數據發生錯誤,為保證系統安全,擦除程序升級標志,跳轉到主程序區執行原版本程序,并等待下一次升級。

3. 需要注意的問題

3.1 項目管理問題

下位機固件程序中實際包含兩個獨立的部分,Bootloader 程序和主程序。我們在KEIL 中分別為這兩部分的建立獨立的項目文件,分別編譯。燒寫編譯后產生的HEX 文件時,應該先擦除FLASH 后,燒寫Bootloader 程序,然后在不擦除之前內容的情況下燒寫主程序。

3.2 Bootloader 的存儲位置

Bootloader 程序必須保證在上電過程后立即運行,而51 單片機的中斷向量存放在低地址處。所以Bootloader 程序不能存儲在低地址處,必須存放到高地址處,本例中,留出0xF000~0xFFFF 4KB 的FLASH 空間作為Bootloader 程序存儲區。在KEIL 開發環境中,默認會為項目文件提供初始化文件STARTUP.A51 來清空RAM 空間,以及調用初始化全局變量代碼段。其默認起始地址安排在0x0000處。為保證上電過程后立即運行Bootloader,我們在起始處還必須要手動修改匯編指令如下:



以上代碼編譯時強制在0x0000 處放置一條跳轉到 0xF000 處的指令,這就保證了保證在上電過程后立即跳轉到Bootloader 程序運行。為了將Bootloader 程序的所有代碼定位在0xF000~0xFFFF 范圍內,要對KEIL 的BL51 定位選項設置如下:



主程序同樣有代碼定位的問題。為保證程序升級后能正常工作,修改主程序的STARTUP.A51 文件如下:


這里保證執行主程序也是先跳轉到Bootloader 程序,而將0x0006 設為了主程序的起始地址,避免了對中斷向量表的占用。

另外還要將主程序的編譯代碼進行定位。設置和圖4 中類似,只是將Code Ranger 設為主程序的代碼空間:0x0000~0xEFFF。



3.3 程序跳轉時的PLL 設置

C8051F130 內部帶有PLL,最高主頻可達100MHz。在本系統設計中,外部晶振頻率為11.0592MHz,
在Bootloader 程序和主程序中都通過使能PLL,倍頻至99.5328MHz 作為系統時鐘。在上電后,C8051F130 默認是以內部時鐘作為系統時鐘的,通過執行初始化程序,系統再切換到以PLL 輸出為系統時鐘的工作環境上來。如果通過Silicon Labs 公司提供的初始化軟件CONFIG2 來配置初始化C8051F130 的代碼的話,在初始化PLL 的過程中,會關閉PLL 模塊。

// 一個由 CONFIG2 生成的系統時鐘初始化程序,
// 注意:在調用此函數時,系統時鐘是由內部振蕩器產生。
void Oscillator_Init()
{
int i = 0;
SFRPAGE = CONFIG_PAGE; // 切換到對應的寄存器頁
OSCXCN = 0x67; // 選擇外部晶振,頻率11.0592MHz.
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0); // 檢測晶振是否已穩定,如果穩定,繼續執行下面的程序。
PLL0CN = 0x04; // 選擇PLL 源時鐘為外部晶振,PLL 保持在復位狀態,偏置發生器被禁止
CCH0CN &= ~0x20; // 禁止預取引擎。
SFRPAGE = LEGACY_PAGE; // 切換到對應的寄存器頁
FLSCL = 0xB0; // FLASH 讀時間,SYSCLK <= 100 MHz
SFRPAGE = CONFIG_PAGE;
CCH0CN |= 0x20; // 允許預取引擎。
PLL0CN |= 0x01; // PLL 偏置發生器被使能
PLL0DIV = 0x01; // PLL 預分頻值
PLL0FLT = 0x07; // PLL 濾波器參數
PLL0MUL = 0x09; // PLL 時鐘倍頻寄存器
for (i = 0; i < 15; i++); // 等待PLL 初始化。
PLL0CN |= 0x02; // PLL 被使能
while ((PLL0CN & 0x10) == 0); // 等待PLL 輸出頻率已經鎖定。
CLKSEL = 0x02; // 選擇PLL 輸出為系統時鐘
OSCICN &= ~0x80; // 關閉內部振蕩器。
}

如果使用這段代碼初始化PLL 模塊,在主程序跳轉到Bootloader 程序,或者由Bootloader 程序跳轉到主程序時,必須考慮PLL 的設置問題。因為原工作時鐘是PLL 的輸出,而直接切換到另外一個程序中時,執行以上代碼會關閉PLL 系統時鐘,導致系統時鐘丟失,工作不正常。一個更安全的做法是在程序間互相跳轉之前,將系統時鐘切換到上電后默認的內部時鐘上。代碼如下所示:

// 跳轉到Bootloader 程序處開始執行,
// 因為在此Bootloader 程序中采用PLL 作為系統時鐘,
// 所以跳轉之前,應該將時鐘切換到內部振蕩器或外部時鐘。
// 本函數切換到內部時鐘
void GotoBootLoader(void)
{
#define BOOTLOADER_ADDR 0xF000
SFRPAGE = CONFIG_PAGE;
OSCICN = 0xC0; // 使能內部振蕩器,且8 分頻,其起振時間短,無需延時。
CLKSEL = 0x00; // 選擇內部時鐘作為系統時鐘。
PLL0CN = 0x00; // 關閉PLL。
((void (code *)(void)) BOOTLOADER_ADDR)();
// 程序跳轉到Loaded 的代碼運行,正常情況下永遠不會返回
}

3.4 寄存器頁的切換

C8051F130 內部功能模塊多,其控制寄存器也多,為了合理安排控制寄存器位置,采用了寄存器頁控制寄存器SFRPAGE 來將相同的地址切換到不同的控制寄存器。除了中斷函數自動切換到對應的寄存器頁外,當在程序中對某個寄存器操作前,需要設置SFRPAGE 切換到對應的寄存器頁。因此,在C51 語言編寫的程序中,涉及到寄存器操作的模塊函數中,需要在執行之前保存SFRPAGE 寄存器值,處理完畢后再恢復先前的SFRPAGE 寄存器值。相當于對SFRPAGE 寄存器值做一次出入棧。示例代碼如下:

void PutUnchar(uchar ch) //顯示字符
{
uchar SFRPAGE_SAVE = SFRPAGE; // 保存 SFRPAGE
// 其他局部變量定義
// 函數執行代碼部分,包含對指定寄存器的操作
SFRPAGE = SFRPAGE_SAVE; // 恢復SFRPAGE
}

4. 總結

通過在系統工作過程中接收程序升級數據,存入內部FLASH,全部接收完成后再集中升級主程序的方法,充分利用了C8051F130 的內部FLASH 空間,對系統的實時工作影響小,僅在Bootloader 程序運行期間不能正常工作,減小了通訊網絡通訊狀況差時對遠程在線更新程序造成的風險。

基于以上方法,已經成功設計出可遠程在線升級程序的直放站監控系統,使用情況表明,該系統能穩定可靠工作,且為系統的維護節省了大量的工作量。本文介紹的在線程序升級設計方案,雖然是基于C8051F130 單片機的,但對其他類型的在線程序升級設計都有很好的參考作用。

參考文獻:

[1] Silicon Laboratories Inc.C8051F12X_13X DataSheet.2003.
[2] Keil Software Inc. uVison3 HELP.

作者:泉州鐵通電子設備有限公司 高時兵  馬宏平  陳建福
來源:單片機與嵌入式系統應用  2008 (9)
本文地址:http://m.qingdxww.cn/thread-11978-1-1.html     【打印本頁】

本站部分文章為轉載或網友發布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
hotpower 發表于 2010-6-3 23:33:46
創意可以,但未考慮加密問題
您需要登錄后才可以發表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區
  • 使用SAM-IoT Wx v2開發板演示AWS IoT Core應用程序
  • 使用Harmony3加速TCP/IP應用的開發培訓教程
  • 集成高級模擬外設的PIC18F-Q71家族介紹培訓教程
  • 探索PIC16F13145 MCU系列——快速概覽
  • 貿澤電子(Mouser)專區
關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩精品久久久久久 | 四虎永久在线观看 | 高清一区二区三区四区五区 | 狠狠色丁香久久婷婷综合五月 | 特片网在线观看 | 青青草原综合网 | 青青久在线视频免费观看 | 欧美亚洲视频在线观看 | 国产香蕉尹人视频在线香蕉视 | 免费欧洲毛片a级视频老妇女 | 黄色草逼网站 | 国产欧美日韩亚洲 | 一级韩国aa毛片免费观看 | 日韩不卡在线视频 | 久热中文字幕在线精品免费 | 欧美在线看片 | 四虎最新网址在线观看 | 天堂网在线观看 | 欧州色| 国产福利麻豆精品一区 | 日本jizz强视频69视频 | 久久精品国产亚洲妲己影院 | 亚洲性69影院在线观看 | 午夜黄色一级片 | 精品国产精品国产偷麻豆 | 国产小视频在线免费观看 | 手机免费看黄色 | 久久精品导航 | 四虎国产视频 | 日韩手机视频 | 高清在线不卡 | 欧美xxxx新一区二区三区 | 99国产精品农村一级毛片 | 99在线热播精品免费 | 亚洲精品中文字幕乱码影院 | 日韩欧美亚洲一区精选 | 国产麻豆剧传媒精品好看的片 | 日日干天天草 | 国产一级a毛片高清 | 亚洲三级视频在线 | 久久久久久久91精品免费观看 |