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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于PSoC Creator Bootloader更新PSoC?3固件程序

          基于PSoC Creator Bootloader更新PSoC?3固件程序

          作者: 時(shí)間:2011-03-07 來(lái)源:電子產(chǎn)品世界 收藏

            1. 引言

          本文引用地址:http://www.ex-cimer.com/article/117492.htm

            許多電子產(chǎn)品允許出廠后更新固件程序,從而制造商可以發(fā)布新的固件版本增加功能或是修正錯(cuò)誤。該功能一般有兩種實(shí)現(xiàn)方式:在系統(tǒng)程序燒錄和駐留更新程序。若將待更新的芯片看做從機(jī),將執(zhí)行更新操作的PC或是MCU看做主機(jī),第一種方法通過(guò)芯片的燒錄接口,由主機(jī)模擬生產(chǎn)時(shí)燒錄器的時(shí)序,將固件數(shù)據(jù)燒錄至Flash中;第二種方法在從機(jī)的運(yùn)行代碼中實(shí)現(xiàn)一段駐留程序,主機(jī)通過(guò)某種通訊接口與駐留程序通信,將固件數(shù)據(jù)先發(fā)送給駐留程序,然后由該程序更新至Flash。駐留程序在生產(chǎn)時(shí)被燒錄,一般只能通過(guò)硬件燒錄的方式更新。

            這種駐留程序有很多種稱呼,一個(gè)常見(jiàn)的名字是,或者稱為引導(dǎo)程序。不過(guò),由于駐留程序涉及內(nèi)容較廣,實(shí)現(xiàn)穩(wěn)定的更新功能需要較多的開(kāi)發(fā)投入。 芯片族和 1.0開(kāi)發(fā)環(huán)境提供了一套完整的開(kāi)發(fā)框架,開(kāi)發(fā)者無(wú)需編寫代碼,即可獲得基于和USB接口的功能;或者僅做簡(jiǎn)單的二次開(kāi)發(fā),實(shí)現(xiàn)基于其他通訊接口或更新協(xié)議的Bootloader功能,從而縮短產(chǎn)品的研發(fā)周期。

            2. 理解 Bootloader

            芯片族是推出的基于8051核心的可配置片上系統(tǒng)(SoC),其主要特性包括

            · 片內(nèi)包含多達(dá)64K Flash和8K SRAM;

            · 16~24個(gè)數(shù)字可編程邏輯器件(PLD),可以實(shí)現(xiàn)狀態(tài)機(jī)等需求定制數(shù)字邏輯;

            · 豐富的固定功能模塊,包括1個(gè)使用內(nèi)部晶振的Full-Speed USB2.0模塊,多達(dá)4個(gè)16位可配置的Timer/PWM/Counter模塊等

            · 高性能模擬模塊,如75ns響應(yīng)時(shí)間的比較器,最高采樣率192 ksps的12位 Delta-Sigma ADC等。

            提供了與PSoC3配套的開(kāi)發(fā)環(huán)境 1.0,將其豐富的片內(nèi)資源抽象成眾多的可配置功能模塊,開(kāi)發(fā)者可以像設(shè)計(jì)電路板原理圖一樣,將所需模塊拖放在設(shè)計(jì)圖紙上,連接模塊之間的輸入輸出,然后使用C語(yǔ)言實(shí)現(xiàn)產(chǎn)品需求即可。

            PSoC3將所有代碼存放在片內(nèi)Flash中,程序執(zhí)行也是基于Flash,因此,Bootloader與應(yīng)用程序分別位于Flash空間的不同位置。圖 1給出了PSoC3 Bootloader的Flash布局。在64K Flash空間中,低地址處存放的是Bootloader,較高地址處存放的是應(yīng)用程序,二者中間有一個(gè)填充為零的隔離區(qū),此外,在最高地址還存放著一些公共數(shù)據(jù),包括應(yīng)用程序的起始地址,Bootloader使用的Flash大小,應(yīng)用程序校驗(yàn)和等。在產(chǎn)品的生命周期里,Bootloader只能在生產(chǎn)時(shí)通過(guò)硬件燒錄的方式寫入Flash,一旦產(chǎn)品出廠,除非意外情況,Bootloader不會(huì)被更新;應(yīng)用程序也在生產(chǎn)時(shí)被寫入,但是產(chǎn)品出廠后仍然可以通過(guò)Bootloader更新。

            圖 1 Bootloader與應(yīng)用程序在PSoC3 Flash空間的布局

            為了實(shí)現(xiàn)上述的Flash布局,開(kāi)發(fā)者通常需要設(shè)置眾多的編譯、鏈接參數(shù),這些參數(shù)控制編譯工具鏈生成所需固件映像(Image),但其復(fù)雜性常常令許多開(kāi)發(fā)者望而卻步。 1.0提供了一種簡(jiǎn)單的方法實(shí)現(xiàn)上述操作,將Bootloader與應(yīng)用程序分成兩種工程(Project):bootloader工程和bootoadable工程。前者維護(hù)Bootloader的實(shí)現(xiàn),后者維護(hù)應(yīng)用程序的實(shí)現(xiàn),后者將前者作為編譯依賴,即bootoadable工程需要bootloader工程的編譯結(jié)果來(lái)完成自身的編譯鏈接。此劃分具有兩個(gè)優(yōu)點(diǎn),一方面將所有編譯工具鏈相關(guān)的參數(shù)設(shè)置與產(chǎn)品開(kāi)發(fā)分離,完全由PSoC Creator自動(dòng)處理,減少開(kāi)發(fā)難度;另一方面易于Bootloader和應(yīng)用程序的維護(hù),如需添加新功能至應(yīng)用程序,僅需改動(dòng)bootloadable工程即可,避免錯(cuò)誤修改Bootloader中內(nèi)容。

            在技術(shù)實(shí)現(xiàn)上,PSoC3 Bootloader可分為三個(gè)功能層次,如圖 2所示?;就ㄓ崒雨P(guān)注通訊接口原子級(jí)的數(shù)據(jù)收發(fā),不同的通訊接口具有不同的原子級(jí)數(shù)據(jù)收發(fā),如SPI和UART一次數(shù)據(jù)收發(fā)都是基于單個(gè)字節(jié),而的一次完整數(shù)據(jù)收發(fā)由多個(gè)字節(jié)組成的協(xié)議數(shù)據(jù)包。在基本通訊之上,PSoC3 Bootloader已定義了一套與主機(jī)通訊的更新協(xié)議,以便接收主機(jī)發(fā)送的命令幀,并將處理結(jié)果以狀態(tài)幀通知主機(jī),此部分功能由協(xié)議處理層完成。核心功能層與具體的數(shù)據(jù)收發(fā)無(wú)關(guān),此部分僅關(guān)注數(shù)據(jù)幀的解析,處理,F(xiàn)lash的讀寫等核心功能操作。

            圖 2 Bootloader功能層次圖

            通過(guò)此功能層劃分,核心功能層作為公共代碼模塊,所有的Bootloader工程創(chuàng)建時(shí)都將其包含在內(nèi),基本通訊層與通訊協(xié)議處理層由實(shí)際使用的通訊接口獨(dú)立維護(hù)。此設(shè)計(jì)可以在考慮不同通訊接口差異化的同時(shí),盡量復(fù)用代碼,減少開(kāi)發(fā)時(shí)間與難度。


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

          關(guān)鍵詞: Cypress PSoC3 PSoC Creator Bootloader I2C

          評(píng)論


          相關(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); })();