文档详情

嵌入式系統建構開發運作於STM32的韌體程式.pdf

发布:2017-07-30约3.47万字共28页下载文档
文本预览下载声明
嵌入式系統建構 :開發運作於STM32的韌體程式    台灣成功大學資訊工程系嵌入式系統開放教材: ​.tw/embedded/schedule  改編自: ​/module/forum/thread­599882­1­1.html  編譯者: 黃敬群 j​serv.tw@​    本文探討如何開發一個得以獨立運作於​STM32​硬體的韌體程式,會談到程式執行的原理、硬體運作機制 ,以及GNU Toolchain如何編譯和連結我們撰寫的程式,過程中也探討如何使用OpenOCD把程式燒錄 寫到STM32晶片內部的Flash並執行,對於沒有實體裝置的開發者,本文也介紹QEMU系統模擬。    程式的運行方式  在開始進行程式開發前,我們先來探討最簡單的C程式如何運作。    為了使程式足夠簡單,我們可讓CPU直接從Flash上取得指令(fetch instruction)並執行,而且程式中沒用 到全域變數,因此編譯出來的目的檔(object file)中是data section長度是0,如此一來,避免了初始化 RAM的步驟,因為data section是可讀寫的,如果目的檔中有data section,我們就必須在程式的啟動過 程中,將data section複製到RAM中,方可確保程式得以正常工作。    程式的執行環境  我們來定義一下程式執行時的記憶體映射 (memory map) :    Flash的陰影區域表示保存的程式映像(program image),程式執行過程中的堆疊(stack)當然只能存於  RAM 中,示意圖右方黑點標註堆疊頂端指標。    Reset​後程式的運行流程  一旦處理器Reset後,就會進行 「取得指令—解碼—執行」的循環,也就是3­stage pipeline。因此,PC  (program counter; 以下PC均指此暫存器,而非個人電腦)暫存器在Reset後的值就顯得關鍵。在 《​The  Definitive Guide To ARM Cortex M3​》中 (簡體中文​電子書​),我們知道,在離開Reset狀態後,ARM  Cortex M3所做的第一件事,就是讀取下列兩個 32位元整數的值 :  ● 從位址​0處取出MSP (Main Stack Point)的初始值  ● 從位址​0處取出PC的初始值,處理器隨即自這個值所對應的位址處取值    可用下方示意圖說明 :      要注意,從位址​0處取出PC的初始值,裡頭的LSB 必須為1 (稍後的實驗可察覺這點)。為什 麼呢?當一個例外處理程式(exception handler)的位址在LSB設定為1,代表該例外處理程式運作於 Thumb模式(Thumb mode),對ARM Cortex­M3來說,這是必要的,因為該處理器核心只支援Thumb­2 指令集,而不支援ARM模式(也稱ARM code或ARM state),當然,該例外處理程式都運行於Thumb模 式,底下節錄 《​The Definitive Guide To ARM Cortex M3​》的描述 :    With the introduction of the Thumb­2 instruction set, it is now possible to handle all processing  requirements in one operation state. There is no need to switch between the two. In fact, the  Cortex­M3 does not support the
显示全部
相似文档