認識STM32開發環境的韌體庫

2021-10-11 09:39:52 字數 3544 閱讀 5992

stm32的韌體庫又叫韌體函式包,它是由程式、資料結構和巨集組成,包括了微控制器所有外設的效能特徵。該函式庫還包括每乙個外設的驅動描述和應用例項,為開發者訪問底層硬體提供了乙個中間api,通過使用韌體函式庫,無需深入掌握底層硬體細節,開發者就可以輕鬆應用每乙個外設。因此,使用固態函式庫可以大大減少開發者開發使用片內外設的時間,進而降低開發成本。每個外設驅動都由一組函式組成,這組函式覆蓋了該外設所有功能。同時,stm32官方還給出了大量的示例**以供學習。

st公司的st(意法半導體)為了方便使用者開發程式,提供了一套豐富的 stm32 韌體庫。韌體庫就是函式的集合,韌體庫函式的作用是向下負責與暫存器直接打交道,向上提供使用者函式呼叫的介面(api) 。韌體庫將這些暫存器底層操作都封裝起來,提供一整套介面(api)供開發者呼叫,大多數場合下,你不需要去知道操作的是哪個暫存器,你只需要知道呼叫哪些函式即可。

arm 公司為了能讓不同的晶元公司生產的 cortex-m3 晶元能在軟體上基本相容,和晶元生產商共同提出了一套標準 cmsis 標準(cortex microcontroller software inte***ce standard) ,翻譯過來是「arm cortex 微控制器軟體介面標準」。 st 官方庫就是根據這套標準設計的。

cmsis 分為 3 個基本功能層:

中介軟體訪問層:定義訪問中介軟體的通用 api,也是 arm 公司提供。

外設訪問層:定義硬體暫存器的位址以及外設的訪問函式。

cmsis 層在整個系統中是處於中間層,向下負責與核心和各個外設直接打交道,向上提供實時作業系統使用者程式呼叫的函式介面。如果沒有 cmsis 標準,那麼各個晶元公司就會設計自己喜歡的風格的庫函式,而 cmsis 標準就是要強制規定,晶元生產公司設計的庫函式必須按照 cmsis 這套規範來設計。

乙個簡單的例子,我們在使用 stm32 晶元的時候首先要進行系統初始化, cmsis 規範就規定,系統初始化函式名字必須為 systeminit,所以各個晶元公司寫自己的庫函式的時候就必須用 systeminit 對系統進行初始化。cmsis 還對各個外設驅動檔案的檔案名字規範化,以及函式名字規範化等等一系列規定。

在講解之前,先給大家展示乙個例子。之前我們在學習c語言的開發中,經常會用到printf()函式。該函式可以很容易的實現所謂的格式化輸出,相信很多人都和我一樣在使用函式的時候不去關注他具體是怎樣實現的,只看重最終的結果。

一樣的道理,我們在使用st公司提供的韌體庫的時候,尤其是在前期學習階段,我們應該把重點放在熟悉韌體庫提供的函式上,著重分析幾個函式即可,先熟悉函式,然後才是去關注,具體的實現方式。

以流水燈為例,下面給出了流水燈使用到的函式。

gpio_inittypedef gpio_structure;

gpio_structure.gpio_pin=gpio_pin_5;

gpio_structure.gpio_mode=gpio_mode_out_pp;

gpio_init

(gpiob,

&gpio_structure)

;gpio_setbits

(gpiob,gpio_pin_5)

;gpio_resetbits

(gpiob,gpio_pin_5)

;

上述6行**基本可以實現點亮乙個led了!就是可以這麼簡單,下面對其進行分析,著重說明其原理及設計方法。

第1行,首先定義乙個結構體變數gpio_structure,其型別gpio_inittypedef。為什麼要定義這麼乙個結構體呢?

一般來說,gpio口的暫存器都是一組,例如輸入和輸出控制暫存器、資料暫存器、上拉控制暫存器、輸出位置復位暫存器等,通常這些暫存器的位址都是連續的,所以,請明白一點gpio_inittypedef結構體中的各個變數是用來初始化gpio口有關的暫存器,因此,只需要通過gpio_structure結構體變數,就可以「間接的」訪問gpio口的所有的暫存器了。

間接的?為什麼是「間接的」呢?

第2行,對結構體變數gpio_structure中的gpio_pin賦值為gpio_pin_5,其中gpio_pin_5是乙個巨集定義。

第3行,對結構體變數gpio_structure中的gpio_mode賦值為gpio_mode_out_pp,其中,gpio_mode_out_pp是乙個巨集定義。從字面的意思來看該變數控制gpio口的輸入和輸出模式。

第4行,呼叫gpio_init()函式,那麼該函式完成什麼工作呢?可能有人會想這個函式是如何實現的?還是得換個角度看問題,這裡的主要問題是盡快的弄明白這個函式到底完成什麼事情就可以了,其他工作可適當延後完成。

我們可以聯想一下現實,郵寄快遞的時候,一般快遞公司都有相應的包裝盒,使用者只需要根據郵寄的物品選擇不同的包裝即可,剩下的就靠快遞公司就可以了。

這裡的gpio_structure結構類似體就類似於乙個包裝盒,只要將該結構體裡面的變數初始化,然後呼叫gpio_init()函式,就可以實現對相應的暫存器的初始化工作,此時gpio_init()函式就是快遞公司了,我們只需要按照呼叫方法呼叫就可以了,沒必要去關心他是怎麼實現的。

第5行,gpio_setbits()函式,實現對某個io口的位置操作,即使其輸出高電平。

第6行,gpio_resetbits()函式,實現對某個io口的復位操作,即使其輸出低電平。

經過以上的介紹,可以完成下面的子程式。

已知led2接在pd6引腳,當pd6引腳輸出高電平時,點亮led2,我們對比前面的例子,來寫具體程式。

首先,我們得先找什麼?「快遞的包裝盒」,也就是定義乙個結構體變數,其型別為gpio_inittypedef,然後對其初始化。可以看上面的那張圖。

「快遞包裝盒」程式

gpio_inittypedef gpio_structure;

gpio_structure.gpio_pin=gpio_pin_6;

gpio_structure.gpio_mode=gpio_mode_out_pp;

然後將這個「快遞包裝盒」給「快遞公司」也就是呼叫gpio_init()函式,這時候,gpio口的初始化工作結束,gpio——init()函式就會完成pd口的相應暫存器初始化工作。

gpio_init

(gpiod,

&gpio_structure)

;

最後了,我們就可以去呼叫io口的置位和復位函式來實現相應的io輸出高低電平了。

gpio_setbits

(gpiod,gpio_pin_6)

;gpio_resetbits

(gpiod,gpio_pin_6)

;

還有個問題,需要宣告一下。上述的所有函式都是st公司韌體庫中的函式,既然是使用了人家公司的韌體庫,那麼就需要有包含韌體庫的標頭檔案,例如#include"stm32f10x.h",stm32f10x.**件中包含了stm32f10xx系列的處理器所用到的大量庫函式以及暫存器定義,我們在以後的學習中會經常用到這個在檔案裡的函式。

STM32韌體庫開發GPIO部分

使用條件 stm32韌體庫開發 1 使能時鐘 rcc apb2periphclockcmd rcc apb2periph gpioc,enable 2 管腳設定結構體 gpio inittypedef gpio initstructure gpio initstructure.gpio pin gp...

STM32韌體庫模版

開發工具 keil4 剛開始用這個庫的時候很無助,因為第一次用韌體庫 以下是我建立模版的步驟和注意事項 1.解壓韌體庫後先觀察目錄的整體結構,可以知道韌體庫裡面要弄出來的東西是libraries目錄,project目錄是韌體庫的應用,可以為今後開發專案做參考。2.現在建立乙個keil4的新工程,規劃...

STM32韌體庫介紹

前言 主要內容 htmresc 資料夾 libraries 資料夾 project 資料夾 utilities 資料夾 stm32f10x stdperiph lib um.chm 前言 本文以stm32f1韌體庫包為例,其他的資料夾目錄結構一樣的。解壓後出現四個資料夾,乙個幫助文件,乙個網頁鏈結。...