STM32庫中重要檔案說明詳解
1.stm32f10x.h:定義系統暫存器的地址以及使用結構體封裝。定義宣告以及包裝記憶體操作。新版的韌體庫V3.0以上main等原始檔中不再直接包含stm32f10x_conf.h,而是stm32f10x.h。
stm32f10x.h中定義了啟動設定,以及所有暫存器巨集定義,此檔案中需要注意的有:
1、device選擇;2、外部時鐘頻率選擇;3、外設巨集定義USE_STDPERIPH_DRIVER;
stm32f10x_conf.h中包含了所有外設的標頭檔案,因此任意原始檔只要包含了stm32f10x.h,就可以在原始檔呼叫任意外設的函式,而不需要的外設部分,可以在stm32f10x_conf.h中註釋掉,專案編譯時就不會再編譯以及去掉的外設。
2.stm32f10x_it.c和stm32f10x_it.h:所有中斷服務函式
中斷是嵌入式系統中重要的組成部分,但是在標準C中不包含中斷。許多編譯開發商在標準C上增加了對中斷的支援,提供新的關鍵字用於標示中斷服務程式 (ISR),類似於__interrupt、#program interrupt等。當一個函式被定義為ISR的時候,編譯器會自動為該函式增加中斷服務程式所需要的中斷現場入棧和出棧程式碼。
中斷服務程式需要滿足如下要求:
(1)不能返回值;
(2)不能向ISR傳遞引數;
(3) ISR應該儘可能的短小精悍;
(4) printf(char * lpFormatString,…)函式會帶來重入和效能問題,不能在ISR中採用。
參閱網上資料和個人的一些理解
a.為什麼不能有返回值?
中斷服務函式的呼叫是硬體級別的,當中斷產生,pc指標強制跳轉到對應的中斷服務函式入口,進入中斷具有隨機性,並不是某段程式碼對其進行呼叫,那麼如果有返回值它的返回值返回給誰?顯然這個返回值毫無意義,如果有返回值,它必定需要進行壓棧操作,這樣一來何時出棧怎麼出棧將變得無法解決。
b.不能向ISR傳遞引數?
同理,也是由於這樣會破壞棧的原因,因為函式傳遞引數必定會要求壓棧出棧操作,由於進入中斷服務函式的隨機行,誰給它傳遞引數都成問題
c.ISR應儘可能的短小精悍?
如果某個中斷頻繁產生,而它對應的ISR相當的耗時,那麼對中斷的響應就會無限的延遲,會丟掉很多的中斷請求
d.printf(char * lpFormatString,…)函式會帶來重入和效能問題,不能在ISR中採用。
這就涉及到一箇中斷巢狀問題,由於printf之類的glibc函式採用的是緩衝機制,這個緩衝區是共享的,相當於一個全域性變數,第一層中斷來時,它向緩衝裡面寫入一些部分內容,恰好這時來了個優先順序更高的中斷,它同樣呼叫了printf,也向緩衝裡面寫入一些內容,這樣緩衝區的內容就錯亂了。
3.stm32f10x_conf.h:所有外設標頭檔案
4.system_stm32f10x.c:裝置外設訪問層,主要配置時鐘頻率(設定系統以及匯流排時鐘)
system_stm32f10x.h:配置時鐘頻率相應的標頭檔案
5.下面是一些啟動檔案
6.stm32f10x_flash.icf:編譯器連結庫檔案