建立C 版本的Stm32庫

2021-09-24 00:27:36 字數 2245 閱讀 1795

為什麼使用c++?

以物件導向的方式思考,把stm32的硬體模組當作物件。

在沒有c++的情況下,我們作如下呼叫:

usart1->sr=0;

hal_uart_transmit(&huart1,"hello",5,hal_max_delay);

//這是st官方hal庫

有了c++,我們可以這樣:

usart1->sr=0;

usart1->print("hello");

//usart1是物件的指標,指向乙個usart物件

c的usart1指向乙個結構體,其中的資料對應相應的暫存器,考慮下面這個結構體:

typedef struct

usart_typedef;

#define usart1 ((usart_typedef *) 0x40011000u)

usart1指向位址0x40011000u,結構體裡的資料是按照順序,連續儲存的,

usart1->sr表示0x40011000u位置的乙個無符號整型

usart1->dr表示0x40011000u+4位置的乙個無符號整型

usart1->brr表示0x40011000u+8位置的乙個無符號整型

…通過這種方式,可以訪問串列埠1的實際暫存器。

c++的usart1應當指向乙個物件,其對應的類的成員變數應當和上述usart_typedef結構體的資料一致:

class usart

;#define usart1 ((usart *) 0x40011000u)

現在的usart1,每個成員變數對應實際暫存器,

usart1->sr表示0x40011000u位置的乙個無符號整型

usart1->dr表示0x40011000u+4位置的乙個無符號整型

usart1->brr表示0x40011000u+8位置的乙個無符號整型

…這和c裡面使用結構體沒什麼區別,但是,後面多了一堆成員函式,其儲存位置在哪呢,如果是緊跟著最後乙個成員變數那可不妙,因為這塊區域是其它外設的暫存器。

成員變數是屬於物件的,而成員函式屬於類,也就是說,成員函式不占用記憶體空間,其儲存位置還是在flash,如果你嘗試sizeof(usart),會得到28,與sizeof(usart_typedef)一致。

c++的函式呼叫是一種怎樣的機制呢?請看如下**:

usart1->println("hello");

usart2->println("hello");

函式println是屬於類的,只有乙份拷貝,usart1usart2是兩個物件的指標,指向兩塊記憶體區域,println是如何區分它們呢?事實上編譯器做了一系列操作,可以理解為編譯器多傳遞了乙個引數給println,相當於:

println(usart1,"hello");

println(usart2,"hello");

只不過這個引數由編譯器隱藏了,我們看不到。

使用c++還有很多好處,可以過載函式:

usart1->println("hello");//傳送字串

usart1->println(256);//傳送int

usart1->println(25.8f);//傳送float

過載操作符:

*usart1<<"hello";//傳送字串
值得注意,用來定義外設暫存器的類不能有虛函式,因為含有虛函式的類,例項化為物件的時候,除了給成員變數分配空間,還要額外的空間來儲存虛函式指標表。

有興趣的小夥伴請移步碼雲

stm32工程建立

1.新建乙個檔案,夾命名為proname.在該資料夾下新建四個資料夾,分別是 src 存放自己編寫的原始碼 project 存放工程檔案 output 存放輸出檔案 listing 存放listing檔案 3.點,設定工程檔案結構,包括 startup 包含啟動檔案 乙個.s檔案,具體根據晶元型號來...

STM32庫的理解

1 條件編譯的作用是避免重複包含 2 暫存器說白了就是記憶體,對暫存器的操作就是對記憶體的操作 3 51微控制器對暫存器是直接操作的,而stm32則是間接操作,如下圖 明白了以上三點,我們就可以來揭開庫的那層神秘的面紗了 因為我們對暫存器的操作,即對記憶體的操作,是間接的。是通過庫函式來實現的,也就...

STM32工程建立簡述

stm32韌體庫個資料夾介紹 libraries cmsis cm3 coresupport 子檔案裡面包含啟動檔案 libraries cmsis cm3 devicesupport 子檔案裡面包含 system stm32f10x.c 系統暫存器你定義宣告以及包裝記憶體操作 system stm...