為什麼使用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
是屬於類的,只有乙份拷貝,usart1
和usart2
是兩個物件的指標,指向兩塊記憶體區域,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...