STM32F4處理器啓動檔案(Bootloader)
啓動檔案採用ARM彙編程式設計。主要完成堆疊初始化、復位事件處理初始化、異常向量表的初始化等工作,並呼叫C庫__main函數進入基於c語言的主檔案中。
在復位後,Cortex-M4處理器進入了執行緒模式、特權級,且使用主堆疊指針(MSP)。
啓動檔案中輸入了多個全域性標號,即表示將會呼叫多個其他檔案中的程式端來完成啓動過程。
因此該啓動檔案僅能反映系統啓動時主要流程,不能夠體現其內部具體操作。
以下內容參考:http://m.elecfans.com/article/811542.html
一、啓動檔案的作用是:
1.初始化堆疊指針SP;
2.初始化程式計數器指針PC;
3.設定堆、棧的大小;
4.設定異常向量表的入口地址;
5.設定外部SRAM作爲數據記憶體(這個由使用者設定,一般的開發板可沒
有外部SRAM);
6.設定C庫的分支入口__main(最終用來呼叫main函數);
7.在3.5版的啓動檔案還呼叫了在system_stm32f10x.c檔案中的
SystemInit()函數設定系統時鐘,在舊版本的工程中要使用者進入
main函數自己呼叫SystemInit()函數。
至此可以總結一下STM32的啓動檔案和啓動過程。首先對棧和堆的大小進行定義,並在程式碼區的起始處建立中斷向量表,其第一個表項是棧頂地址,第二個表項是復位中斷服務入口地址。然後在復位中斷服務程式中跳轉??C/C++標準實時庫的__main函數,完成使用者堆疊等的初始化後,跳轉.c檔案中的main函數開始執行C程式。假設STM32被設定爲從內部FLASH啓動(這也是最常見的一種情況),中斷向量表起始地位爲0x8000000,則棧頂地址存放於0x8000000處,而復位中斷服務入口地址存放於0x8000004處。當STM32遇到復位信號後,則從0x80000004處取出復位中斷服務入口地址,繼而執行復位中斷服務程式,然後跳轉__main函數,最後進入main函數,來到C的世界。
二、bootloader檔案的作用。
1、可以參考《嵌入式系統bootloader技術內幕》
鏈接:http://blog.csdn.net/phunxm/article/details/6897541
bootloader 分爲boot 和loader,更多的時候是針對於linux系統,windows系統裡的bios也是這個功能。就是boot 的功能是初始化堆疊、中斷向量表等參數,loader就是跳轉到main函數裡,載入使用者程式。從這個層面來理解的話,其實STM32的啓動檔案就相當於是一個bootloader程式。
2、在做STM32線上升級的時候,常常可以聽到要自己寫一個bootloader程式。這個就很容易造成誤解,比如,升級的時候要寫bootloader程式,那不升級的時候,bootloader難道就不需要了嗎?如果需要是在哪一個檔案中,完成這個功能的呢?
其實,在IAP的時候,我們寫的只是相當於一個跳轉並下載的功能的程式,這個程式實現的就是IAP的功能,或者說是軟的IAP功能。這個不是bootloader。在iap程式裡,我們是用C語言實現的,也只是一個main函數,裏面可能會根據需要有定時器、串列埠、led驅動等功能。但是真正開始執行這個main函數,還是由啓動檔案完成,也就是bootloader完成。
STM32的內部快閃記憶體(FLASH)地址起始於0x08000000,一般情況下,程式檔案就從此地
址開始寫入。此外STM32是基於Cortex-M3內核的微控制器,其內部通過一張「中斷向量表」來響應中斷,程式啓動後,將首先從「中斷向量表」取出復位中斷向量執行復位中斷程式完成啓動,而這張「中斷向量表」的起始地址是0x08000004(0x8003000的程式中,中斷向量表的地址是0x8003000),當中斷來臨,STM32的內部硬體機制 機製亦會自動將PC指針定位到「中斷向量表」處,並根據中斷源取出對應的中斷向量執行中斷服務程式。
在圖53.1.1中,STM32在復位後,先從0X08000004地址取出復位中斷向量的地址,並跳轉到復位中斷服務程式,如圖示號①所示;在復位中斷服務程式執行完之後,會跳轉到我們的main函數,如圖示號②所示;而我們的main函數一般都是一個死回圈,在main函數執行過程中,如果收到中斷請求(發生重中斷),此時STM32強制將PC指針指回中斷向量表處,如圖示號③所示;然後,根據中斷源進入相應的中斷服務程式,如圖示號④所示;在執行完中斷服務程式以後,程式再次返回main函數執行,如圖示號⑤所示。