野火STM32學(xué)習(xí)筆記

互~涼~網(wǎng)的廣大觀眾朋友們大家好,本up豬在C站(CSDN俗稱糞坑)的ID叫飛天大司馬,鑒于C站雖然閱讀量大,但是本人反饋無法及時(shí),因此在B站同步更新創(chuàng)作內(nèi)容,歡迎各位新老粉絲前來批評指正一起學(xué)習(xí)。
開始進(jìn)入固件庫編程
學(xué)習(xí)原因即優(yōu)缺點(diǎn):
固件庫的出現(xiàn)讓STM32的開發(fā)難度大大下降,它通過庫文件的封裝,把眾多的內(nèi)存元整合為一個(gè)整體,在我們想要操作某一位寄存器時(shí)只要調(diào)用它所在的固件庫就可以。缺點(diǎn)是不同型號的單片機(jī)的固件庫有所區(qū)別,如果移植需要很大的工作量。
構(gòu)建庫函數(shù)的模型
介紹
學(xué)習(xí)固件庫之前,為了更了解底層的一些東西,我們來先嘗試寫一下固件庫,來體驗(yàn)固件庫是怎么形成的。
寄存器地址在控制單片機(jī)的C語言中是一個(gè)32位的指針,可以看作是四個(gè)字節(jié)的內(nèi)存。而且其分布也是有規(guī)律的,我們看上一節(jié)課中GPIOB寄存器的地址,從基地址(CRL)的最后2位的00(16進(jìn)制數(shù)),到第二個(gè)寄存器(CRH)04,第三個(gè)寄存器(IDR)是08,第四個(gè)寄存器(ODR)是0C······依次增加4個(gè)字節(jié)。

這時(shí)候,偉大的C語言又給我們提供了一個(gè)工具用來封裝它們,這個(gè)工具就是結(jié)構(gòu)體??赡苡蠧語言不好的同學(xué),不了解結(jié)構(gòu)體,我簡單打個(gè)比方:它像一個(gè)書柜的一列,從上到下有好幾格,每一格從上到下按順序編號,最上面是第一個(gè),最下面是最后一個(gè)。學(xué)過8086匯編的朋友可能想到了什么:堆棧。沒錯(cuò),這和堆棧非常相似。那我們根據(jù)結(jié)構(gòu)體和寄存器內(nèi)存的特點(diǎn)自然的就把他們倆聯(lián)系起來了。
結(jié)構(gòu)體的封裝方法
在STM32里面,寄存器的大小基本上都是32位的,有的寄存器只用了一半,低16位有效或者高16位有效。因此我們先定義可以在結(jié)構(gòu)體內(nèi)使用的,可以代表寄存器地址32位(4個(gè)字節(jié))和16位變量(2個(gè)字節(jié))。

但是我們在看到固件庫的封裝時(shí),發(fā)現(xiàn)結(jié)構(gòu)體內(nèi)的數(shù)據(jù)類型都是32位的沒有16位,具體原因我也不知道在這里也不敢亂說。不過本著多了不影響,少了不可以的原則,這樣做也沒什么大問題,浪費(fèi)一些內(nèi)存資源罷了?,F(xiàn)在我們來看看結(jié)構(gòu)體封裝的廬山真面目。如圖

typedef struct是結(jié)構(gòu)體關(guān)鍵字,變量名是GPIO_TypeDef,里面都是32位代表寄存器地址的16進(jìn)制數(shù)。理論上,結(jié)構(gòu)體內(nèi)的數(shù)據(jù)是在內(nèi)存中連續(xù)存儲的,但是目前這些結(jié)構(gòu)體內(nèi)的數(shù)據(jù)還不是寄存器地址而是立即數(shù),如何把他們變成地址呢?這里又用到指針強(qiáng)制類型轉(zhuǎn)換,將這個(gè)結(jié)構(gòu)體轉(zhuǎn)換為指針類型,基地址是GPIOx_BASE,比如定義GPIOB內(nèi)的寄存器要這樣寫:((GPIO_TypeDef﹡)GPIOB_BASE)。這樣寫呢過于冗長,我們又可以通過一個(gè)宏定義,把這個(gè)地址的格式簡單化:

這樣一個(gè)GPIO固件庫形式的寄存器映射就封裝完畢了。我們也可以用同樣的方式封裝RCC寄存器,代碼如圖:

結(jié)構(gòu)體封裝的RCC寄存器
再用宏定義簡化封裝:

此時(shí)再回到之前的點(diǎn)燈代碼當(dāng)中,看看我們用固件庫如何點(diǎn)亮一個(gè)LED燈。

可以看到好像并沒有什么變化,其實(shí)它的奧妙在于編寫時(shí)無需再查技術(shù)手冊尋找寄存器的地址了。我們想要打開RCC寄存器中使能APB2中的時(shí)鐘,只要輸入RCC->

我們就可以打開RCC寄存器中任意的寄存器了。GPIO寄存器同理。
野火視頻教程B站鏈接
https://www.bilibili.com/video/BV1yW411Y7Gw/?p=6&spm_id_from=333.880.my_history.page.click&vd_source=16419a44923b86308e680f95ec76193a
————————————————
版權(quán)聲明:本文為CSDN博主「飛天大司馬」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_51019960/article/details/129131707