STM32 固件庫與 CMSIS 標准如何理解?


一: STM32 固件庫就是函數的集合,那么對這些函數有什么要求呢??這里就涉及到一個 CMSIS 標准的基礎知識,這部分知識可以從《Cortex-M3 權威指南》中了解到,我們這里只是對權威指南的講解做個概括性的介紹。經常有人問到 STM32 和 ARM 以及 ARM7是什么關系這樣的問題,其實 ARM 是一個做芯片標准的公司,它負責的是芯片內核的架構設計,而 TI,ST 這樣的公司,他們並不做標准,他們是芯片公司,他們是根據 ARM 公司提供的芯片內核標准設計自己的芯片。所以,任何一個做 Cortex-M3 芯片,他們的內核結構都是一樣的,不同的是他們的存儲器容量,片上外設,IO 以及其他模塊的區別。所以你會發現,不同公司設計的 Cortex-M3 芯片他們的端口數量,串口數量,控制方法這些都是有區別的,這些資源他們可以根據自己的需求理念來設計。同一家公司設計的多種 Cortex-m3 內核芯片的片上外設也會有很大的區別,比如 STM32F103RBT 和 STM32F103ZET,他們的片上外設就有很大的區別。我們可以通過《Cortex-M3 權威指南》中的一個圖來理解解。

既然大家都使用的是 Cortex-M3 核,也就是說,本質上大家都是一樣的,這樣 ARM 公司為了能讓不同的芯片公司生產的 Cortex-M3 芯片能在軟件上基本兼容,和芯片生產商共同提出了一套標准 CMSIS 標准(Cortex  Microcontroller  Software  Interface  Standard)  ,翻譯過來是“ARM Cortex™  微控制器軟件接口標准”。 ST 官方庫就是根據這套標准設計的。CMSIS 應用程序基本結構:

 

我們在使用 STM32 芯片的時候首先要進行系統初始化, CMSIS 規范就規定,系統初始化函數名字必須為 SystemInit,所以各個芯片公司寫自己的庫函數的時候就必須用 SystemInit 對系統進行初始化。CMSIS 還對各個外設驅動文件的文件名字規范化,以及函數名字規范化等等一系列規定。上一節講的函數GPIO_ResetBits 這個函數名字也是不能隨便定義的,是要遵循 CMSIS 規范的。我們使用的是 V3.5 版本的固件庫,Libraries 文件夾下面有 CMSIS 和 STM32F10x_StdPeriph_Driver 兩個目錄,這兩個目錄包
含 固 件 庫 核 心 的 所 有 子 文 件 夾 和 文 件 。 其 中 CMSIS 目 錄 下 面 是 啟 動 文 件 ,STM32F10x_StdPeriph_Driver 放的是 STM32 固件庫源碼文件。源文件目錄下面的 inc 目錄存放的是 stm32f10x_xxx.h 頭文件,無需改動。src 目錄下面放的是 stm32f10x_xxx.c 格式的固件庫源碼文件。每一個.c 文件和一個相應的.h 文件對應。這里的文件也是固件庫的核心文件,每個外設對應一組文件。

 

二:在 STM32 中,有五個時鍾源,為 HSI、HSE、LSI、LSE、PLL。從時鍾頻率來分可以分為高速時鍾源和低速時鍾源,在這 5 個中 HIS,HSE 以及 PLL 是高速時鍾,LSI 和 LSE 是低速時鍾。從來源可分為外部時鍾源和內部時鍾源,外部時鍾源就是從外部通過接晶振的方式獲取時鍾源,其中 HSE 和 LSE 是外部時鍾源,其他的是內部時鍾源。下面我們看看 STM32 的 5 個時鍾源,我們講解順序是按圖中紅圈標示的順序:
①、HSI 是高速內部時鍾,RC 振盪器,頻率為 8MHz。
② 、 HSE 是高速外部時鍾,可接石英 / 陶瓷諧振器,或者接外部時鍾源,頻率范圍為
4MHz~16MHz。我們的開發板接的是 8M 的晶振。
③、LSI 是低速內部時鍾,RC 振盪器,頻率為 40kHz。獨立看門狗的時鍾源只能是 LSI,同
時 LSI 還可以作為 RTC 的時鍾源。
④、LSE 是低速外部時鍾,接頻率為 32.768kHz 的石英晶體。這個主要是 RTC 的時鍾源。
⑤、PLL 為鎖相環倍頻輸出,其時鍾輸入源可選擇為 HSI/2、HSE 或者 HSE/2。倍頻可選擇為2~16 倍,但是其輸出頻率最大不得超過 72MHz

三:端口重映射

為了使不同器件封裝的外設 IO 功能數量達到最優,可以把一些復用功能重新映射到其他一些引腳上。在 STM32 中引入了外設引腳重映射的概念,即一個
外設的引腳除了具有默認的端口外,還可以通過設置重映射寄存器的方式,把這個外設的引腳映射到其它的端口。

四:中斷優先級管理

CM3 內核支持 256 個中斷,其中包含了 16 個內核中斷和 240 個外部中斷,並且具有 256級的可編程中斷設置。但 STM32 並沒有使用 CM3 內核的全部東西,而是只用了它的一部分。STM32 有 84 個中斷,包括 16 個內核中斷和 68 個可屏蔽中斷,具有 16 級可編程的中斷優先級。而我們常用的就是這 68 個可屏蔽中斷,但是 STM32 的 68 個可屏蔽中斷,在 STM32F103 系列上面,又只有 60 個(在 107 系列才有 68 個)。因為我們開發板選擇的芯片是 STM32F103 系列的所以我們就只針對 STM32F103 系列這 60 個可屏蔽中斷進行介紹。

五:結構體:

聲明結構體類型:
Struct  結構體名

{
成員列表;
}變量名列表;
例如: 
Struct U_TYPE

{
Int BaudRate
Int   WordLength; 
}usart1,usart2;

在結構體申明的時候可以定義變量,也可以申明之后定義,方法是:
Struct  結構體名字    結構體變量列表  ;
例如:struct U_TYPE usart1,usart2; 

結構體成員變量的引用方法是:
結構體變量名字.成員名

結構體指針變量定義也是一樣的,跟其他變量沒有啥區別。
例如:struct U_TYPE *usart3;//定義結構體指針變量 usart1;
結構體指針成員變量引用方法是通過“->”符號實現,比如要訪問 usart3 結構體指針指向的結
構體的成員變量 BaudRate,方法是:
Usart3->BaudRate;

六:MDK 中寄存器地址名稱映射分析:

GPIOA 的寄存器的地址=GPIOA 基地址+寄存器相對 GPIOA 基地址的偏移值=PB2 總線的基地址+GPIOA 在 APB2 總線上的偏移地址+寄存器相對 GPIOA 基地址的偏移值;

七 :STM32每個通用定時器都是完全獨立,沒有互享任何資源。


免責聲明!

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



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