<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > C8051F130的遠(yuǎn)程在線升級程序設(shè)計(jì)

          C8051F130的遠(yuǎn)程在線升級程序設(shè)計(jì)

          作者: 時(shí)間:2010-06-18 來源:網(wǎng)絡(luò) 收藏

            3. 需要注意的問題

            3.1 項(xiàng)目管理問題

            下位機(jī)固件程序中實(shí)際包含兩個(gè)獨(dú)立的部分,Bootloader 程序和主程序。我們在KEIL 中分別為這兩部分的建立獨(dú)立的項(xiàng)目文件,分別編譯。燒寫編譯后產(chǎn)生的HEX 文件時(shí),應(yīng)該先擦除FLASH 后,燒寫B(tài)ootloader 程序,然后在不擦除之前內(nèi)容的情況下燒寫主程序。

            3.2 Bootloader 的存儲位置

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

          程序

            以上代碼編譯時(shí)強(qiáng)制在0x0000 處放置一條跳轉(zhuǎn)到 0xF000 處的指令,這就保證了保證在上電過程后立即跳轉(zhuǎn)到Bootloader 程序運(yùn)行。為了將Bootloader 程序的所有代碼定位在0xF000~0xFFFF 范圍內(nèi),要對KEIL 的BL51 定位選項(xiàng)設(shè)置如下:

          C8051F130的遠(yuǎn)程在線升級程序設(shè)計(jì)

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

          C8051F130的遠(yuǎn)程在線升級程序設(shè)計(jì)

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

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

            3.3 程序跳轉(zhuǎn)時(shí)的PLL 設(shè)置

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

            // 一個(gè)由 CONFIG2 生成的系統(tǒng)時(shí)鐘初始化程序,

            // 注意:在調(diào)用此函數(shù)時(shí),系統(tǒng)時(shí)鐘是由內(nèi)部振蕩器產(chǎn)生。

          程序

            如果使用這段代碼初始化PLL 模塊,在主程序跳轉(zhuǎn)到Bootloader 程序,或者由Bootloader 程序跳轉(zhuǎn)到主程序時(shí),必須考慮PLL 的設(shè)置問題。因?yàn)樵ぷ鲿r(shí)鐘是PLL 的輸出,而直接切換到另外一個(gè)程序中時(shí),執(zhí)行以上代碼會關(guān)閉PLL 系統(tǒng)時(shí)鐘,導(dǎo)致系統(tǒng)時(shí)鐘丟失,工作不正常。一個(gè)更安全的做法是在程序間互相跳轉(zhuǎn)之前,將系統(tǒng)時(shí)鐘切換到上電后默認(rèn)的內(nèi)部時(shí)鐘上。代碼如下所示:

          程序

            3.4 寄存器頁的切換

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

          程序

            4. 總結(jié)

            通過在系統(tǒng)工作過程中接收程序升級數(shù)據(jù),存入內(nèi)部FLASH,全部接收完成后再集中升級主程序的方法,充分利用了C8051F130 的內(nèi)部FLASH 空間,對系統(tǒng)的實(shí)時(shí)工作影響小,僅在Bootloader 程序運(yùn)行期間不能正常工作,減小了通訊網(wǎng)絡(luò)通訊狀況差時(shí)對遠(yuǎn)程在線更新程序造成的風(fēng)險(xiǎn)。

            基于以上方法,已經(jīng)成功設(shè)計(jì)出可遠(yuǎn)程程序的直放站系統(tǒng),使用情況表明,該系統(tǒng)能穩(wěn)定可靠工作,且為系統(tǒng)的維護(hù)節(jié)省了大量的工作量。本文介紹的在線程序升級設(shè)計(jì)方案,雖然是基于C8051F130 單片機(jī)的,但對其他類型的在線程序升級設(shè)計(jì)都有很好的參考作用。


          上一頁 1 2 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();