最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

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

2023-06-14 23:06 作者:是晃晃叔叔  | 我要投稿

互~涼~網(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é))。

定義用來16位和32位寄存器地址的變量

但是我們在看到固件庫的封裝時(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


野火STM32學(xué)習(xí)筆記的評論 (共 條)

分享到微博請遵守國家法律
开鲁县| 武威市| 大渡口区| 鄂尔多斯市| 洪湖市| 榆社县| 滦南县| 太谷县| 东阳市| 龙口市| 扎赉特旗| 汪清县| 凌海市| 永平县| 云阳县| 龙山县| 西丰县| 曲阳县| 兴国县| 灵石县| 平南县| 尼勒克县| 昆明市| 水城县| 东莞市| 日喀则市| 象山县| 榆林市| 武冈市| 广平县| 凉山| 福建省| 龙口市| 余干县| 雅江县| 隆尧县| 长兴县| 古丈县| 元阳县| 大港区| 鹿邑县|