STM32(一)- 基於固件庫的工程模板


一、背景知識

ARM是Contex內核設計公司,設計方案;

STM是Contex微控制器芯片生產廠商,根據內核方案、添加片上外設資源生產MCU芯片;

野火、正點原子等公司基於MCU芯片制作片外資源豐富的PCB電路板;

為了解決不同芯片廠商生產的Contex微控制器在軟件上的兼容性,ARM與芯片廠商建立了CMSIS標准。(Cortex MicroController Software Interface Standard/Contex 微控制器軟件接口標准)

CMSIS 標准中最主要的為 CMSIS 核心層,它包括了:
(1)內核函數層:其中包含用於訪問內核寄存器的名稱、地址定義,主要由 ARM 公司提供。
(2)設備外設訪問層:提供了片上的核外外設的地址和中斷定義,主要由芯片生產商提供。


1-匯編編寫的啟動文件
startup_stm32f10x_hd.s:設置堆棧指針、設置PC指針、初始化中斷向量表、配置系統時鍾、對用C庫函數_main最終去到C的世界

2-時鍾配置文件
system_stm32f10x.c:把外部時鍾HSE=8M,經過PLL倍頻為72M。

3-外設相關的
stm32f10x.h:實現了內核之外的外設的寄存器映射
stm32f10x_xx.c:外設的驅動函數庫文件                                 注:xx表示:GPIO、USRAT、I2C、SPI、FSMC
stm32f10x_xx.h:存放外設的初始化結構體,外設初始化結構體成員的參數列表,外設固件庫函數的聲明

4-內核相關的
CMSIS - Cortex 微控制器軟件接口標准
core_cm3.h:實現了內核外設的寄存器映射
core_cm3.c:內核外設的驅動固件庫

NVIC(嵌套向量中斷控制器)、SysTick(系統滴答定時器)
misc.h
misc.c

5-頭文件的配置文件
stm32f10x_conf.h:頭文件的頭文件
//stm32f10x_usart.h    //stm32f10x_i2c.h     //stm32f10x_spi.h    //stm32f10x_adc.h    //stm32f10x_fsmc.h   ......

6-專門存放中斷服務函數的C文件
stm32f10x_it.c
stm32f10x_it.h

中斷服務函數你可以隨意放在其他的地方,並不是一定要放在stm32f10x_it.c

#include "stm32f10x.h" 

int main(void)
{
// 來到這里的時候,系統的時鍾已經被配置成72M。
}

 

二、基於固件庫的工程模板—重要文件分析

新建demo文件夾放新建工程的所有文件,個人選擇保持keil軟件中的文件夾路徑與demo文件路徑一致,demo文件夾下多一個Project文件夾。

                                    

1、CMSIS文件夾

 

                              startup_stm32f10x_hd.s:啟動文件。設置堆棧指針、設置PC指針、初始化中斷向量表、配置系統時鍾、

                                                                       用C庫函數_main最終去到C的世界

                              core_cm3.c:操作內核外設寄存器函數

                              core_cm3.h:內核外設的寄存器映射,對應於內核外外設(片上外設)的寄存器映射stm32f10x.h

                              stm32f10x.h:內核外外設(片上外設)的寄存器映射,uint8_t、uint16_t類型定義也在其中。

                              system_stm32f10x.c:這個文件包含了 STM32 芯片上電后初始化系統時鍾、擴展外部存儲器用的函數 。

                                                                 實現了 STM32 的時鍾配置, 操作片上RCC 外設。系統在上電之后,首選會執行
                                                                 由匯編編寫的啟動文件, 啟動文件中的復位函數中調用的SystemInit 函數就在
                                                                 這個文件里面定義。調用完之后,系統的時鍾就被初始化成 72M。 如果需要重新

                                                                 配置系統時鍾,我們就可以參考這個函數重寫為了維持庫的完整性,不會直接在這個

                                                                 文件里面修改時鍾配置函數。

                              system_stm32f10x.h:

  2、Fwlib文件夾ST 公司針對每個 STM32 外設而編寫的庫函數文件。

                                 CMSIS之外的片上外設部分,incinclude 的縮寫),srcsource 的簡寫) 

                               inc文件夾:每個片上外設的驅動源程序的頭文件,存放外設的初始化結構體,外設初始化結構體成員的參數列表,外設固件庫函數的聲明。

                                                misc.h:提供了外設對內核中的NVIC(中斷向量控制器)的訪問函數,配置中斷時必須把這個文件添加到工程中 

                                                stm32f10x_adc.h

                                                stm32f10x_gpio.h等

                               src文件夾每個片上外設的驅動源程序。

                                                misc.c

                                                stm32f10x_adc.c

                                                stm32f10x_gpio.c等

3、User文件夾

在后續開發中,在此建立用戶硬件文件夾,如文件夾LED,目錄下建立bsp_led.c和bsp_led.h。

注bsp:板級支持包(board support package) ,受限於具體型號的板子。

             main.c:

             stm32f10x_conf.h:這個文件被包含進 stm32f10x.h 文件。 當我們使用固件庫編程的時
                                           候,如果需要某個外設的驅動庫,就需要包含該外設的頭文件: stm32f10x_xx.h,包含一
                                           個還好,如果是用了多外設,就需要包含多個頭文件,這不僅影響代碼美觀也不好管理,
                                           現我們用一個頭文件 stm32f10x_conf.h 把這些外設的頭文件都包含在里面,讓這個配置頭
                                           文件統一管理這些外設的頭文件,我們在應用程序中只需要包含這個配置頭文件即可,我
                                            們又知道這個頭文件在 stm32f10x.h 的最后被包含,所以最終我們只需要包含 stm32f10x.h
                                            這個頭文件即可,非常方便。 默認情況下是所以頭文件都被包含,沒有被注釋掉。
                                            我們也可以把不要的都注釋掉,只留下需要使用的即可。

             stm32f10x_it.c:這個文件是專門用來編寫中斷服務函數的,在我們修改前,這個文件
                                         已經定義了一些系統異常(特殊中斷)的接口,其它普通中斷服務函數由我們自己添加。
                                         中斷服務函數的接口可以在匯編啟動文件中找到, 在學習中斷和啟動文件的時候我們會詳細介紹

             stm32f10x_it.h:

 

4、Doc文件夾

     說明文件。

 

5、Project文件夾

     工程文件。

 

 三、注意細節

1、宏定義

此處需要定義兩個宏,原因如下:

(1)

編譯   stm32f10x_conf.h   頭文件,調用stm32外設庫函數。

(2)

 

選擇stm32芯片類型,這里stm32f103zet6為   STM32F10X_HD

 

2、SystemInit函數

在啟動文件中有這樣一段

 

開頭的是程序注釋,在匯編里面注釋用的是“;”,相當於 C 語言的“//”注釋符
第二行是定義了一個子程序:Reset_Handler。PROC 是子程序定義偽指令。這里就相
當於 C語言里定義了一個函數,函數名為 Reset_Handler。
第三行 EXPORT 表示 Reset_Handler 這個子程序可供其他模塊調用。相當於 C語言的
函數聲明。關鍵字[WEAK] 表示弱定義,如果編譯器發現在別處定義了同名的函數,則在
鏈接時用別處的地址進行鏈接,如果其它地方沒有定義,編譯器也不報錯,以此處地址進
行鏈接。
第四行和第五行 IMPORT 說明 SystemInit 和__main 這兩個標號在其他文件,在鏈接的
時候需要到其他文件去尋找。相當於 C 語言中,從其它文件引入函數聲明。以便下面對外
部函數進行調用。
SystemInit 需要由我們自己實現,即我們要編寫一個具有該名稱的函數,用來初始化
STM32 芯片的時鍾,一般包括初始化 AHB、APB 等各總線的時鍾,需要經過一系列的配
置 STM32才能達到穩定運行的狀態。其實這個函數在固件庫里面有提供,官方已經為我們
寫好。即下圖中的System_stm32f10x.c,用庫函數編程時SystemInit函數不要自己重新定義。

__main 其實不是我們定義的(不要與 C 語言中的 main 函數混淆),這是一個 C 庫函數,
當編譯器編譯時,只要遇到這個標號就會定義這個函數,該函數的主要功能是:負責初始
化棧、堆,配置系統環境,並在函數的最后調用用戶編寫的 main 函數,從此來到 C 的世
界。
第六行把 SystemInit 的地址加載到寄存器 R0。
第七行程序跳轉到 R0 中的地址執行程序,即執行 SystemInit函數的內容。
第八行把__main 的地址加載到寄存器 R0。
第九行程序跳轉到 R0 中的地址執行程序,即執行__main 函數,執行完畢之后就去到
我們熟知的 C 世界,進入 main 函數。
第十行表示子程序的結束。
總之,看完這段代碼后,了解到如下內容即可:我們需要在外部定義一個 SystemInit
函數設置 STM32 的時鍾(這是針對寄存器版編程來說的);STM32 上電后,會
執行 SystemInit 函數,最后執行我們 C 語言中的 main 函數。

 

 

這個函數在 STM32 標准庫的“system_stm32f10x.c”文件中定義了,而我們的工程已
經包含該文件。標准庫中的 SystemInit 函數把 STM32 芯片的系統時鍾設置成了 72MHz,
即此時 AHB時鍾頻率為 72MHz,APB2 為 72MHz,APB1 為 36MHz。當 STM32 芯片上電
后,執行啟動文件中的指令后,會調用該函數,設置系統時鍾為以上狀態。

 

 

 

7

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM