基于PSoC Creator Bootloader更新PSoC?3固件程序
1. 引言
本文引用地址:http://www.j9360.com/article/117492.htm許多電子產品允許出廠后更新固件程序,從而制造商可以發布新的固件版本增加功能或是修正錯誤。該功能一般有兩種實現方式:在系統程序燒錄和駐留更新程序。若將待更新的芯片看做從機,將執行更新操作的PC或是MCU看做主機,第一種方法通過芯片的燒錄接口,由主機模擬生產時燒錄器的時序,將固件數據燒錄至Flash中;第二種方法在從機的運行代碼中實現一段駐留程序,主機通過某種通訊接口與駐留程序通信,將固件數據先發送給駐留程序,然后由該程序更新至Flash。駐留程序在生產時被燒錄,一般只能通過硬件燒錄的方式更新。
這種駐留程序有很多種稱呼,一個常見的名字是Bootloader,或者稱為引導程序。不過,由于駐留程序涉及內容較廣,實現穩定的更新功能需要較多的開發投入。Cypress PSoC3芯片族和PSoC Creator 1.0開發環境提供了一套完整的Bootloader開發框架,開發者無需編寫代碼,即可獲得基于I2C和USB接口的Bootloader功能;或者僅做簡單的二次開發,實現基于其他通訊接口或更新協議的Bootloader功能,從而縮短產品的研發周期。
2. 理解PSoC3 Bootloader
PSoC3芯片族是Cypress推出的基于8051核心的可配置片上系統(SoC),其主要特性包括
· 片內包含多達64K Flash和8K SRAM;
· 16~24個數字可編程邏輯器件(PLD),可以實現狀態機等需求定制數字邏輯;
· 豐富的固定功能模塊,包括1個使用內部晶振的Full-Speed USB2.0模塊,多達4個16位可配置的Timer/PWM/Counter模塊等
· 高性能模擬模塊,如75ns響應時間的比較器,最高采樣率192 ksps的12位 Delta-Sigma ADC等。
Cypress提供了與PSoC3配套的開發環境PSoC Creator 1.0,將其豐富的片內資源抽象成眾多的可配置功能模塊,開發者可以像設計電路板原理圖一樣,將所需模塊拖放在設計圖紙上,連接模塊之間的輸入輸出,然后使用C語言實現產品需求即可。
PSoC3將所有代碼存放在片內Flash中,程序執行也是基于Flash,因此,Bootloader與應用程序分別位于Flash空間的不同位置。圖 1給出了PSoC3 Bootloader的Flash布局。在64K Flash空間中,低地址處存放的是Bootloader,較高地址處存放的是應用程序,二者中間有一個填充為零的隔離區,此外,在最高地址還存放著一些公共數據,包括應用程序的起始地址,Bootloader使用的Flash大小,應用程序校驗和等。在產品的生命周期里,Bootloader只能在生產時通過硬件燒錄的方式寫入Flash,一旦產品出廠,除非意外情況,Bootloader不會被更新;應用程序也在生產時被寫入,但是產品出廠后仍然可以通過Bootloader更新。
圖 1 Bootloader與應用程序在PSoC3 Flash空間的布局
為了實現上述的Flash布局,開發者通常需要設置眾多的編譯、鏈接參數,這些參數控制編譯工具鏈生成所需固件映像(Image),但其復雜性常常令許多開發者望而卻步。PSoC Creator 1.0提供了一種簡單的方法實現上述操作,將Bootloader與應用程序分成兩種工程(Project):bootloader工程和bootoadable工程。前者維護Bootloader的實現,后者維護應用程序的實現,后者將前者作為編譯依賴,即bootoadable工程需要bootloader工程的編譯結果來完成自身的編譯鏈接。此劃分具有兩個優點,一方面將所有編譯工具鏈相關的參數設置與產品開發分離,完全由PSoC Creator自動處理,減少開發難度;另一方面易于Bootloader和應用程序的維護,如需添加新功能至應用程序,僅需改動bootloadable工程即可,避免錯誤修改Bootloader中內容。
在技術實現上,PSoC3 Bootloader可分為三個功能層次,如圖 2所示。基本通訊層關注通訊接口原子級的數據收發,不同的通訊接口具有不同的原子級數據收發,如SPI和UART一次數據收發都是基于單個字節,而I2C的一次完整數據收發由多個字節組成的I2C協議數據包。在基本通訊之上,PSoC3 Bootloader已定義了一套與主機通訊的更新協議,以便接收主機發送的命令幀,并將處理結果以狀態幀通知主機,此部分功能由協議處理層完成。核心功能層與具體的數據收發無關,此部分僅關注數據幀的解析,處理,Flash的讀寫等核心功能操作。
圖 2 Bootloader功能層次圖
通過此功能層劃分,核心功能層作為公共代碼模塊,所有的Bootloader工程創建時都將其包含在內,基本通訊層與通訊協議處理層由實際使用的通訊接口獨立維護。此設計可以在考慮不同通訊接口差異化的同時,盡量復用代碼,減少開發時間與難度。
評論