五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(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í)筆記的評論 (共 條)

分享到微博請遵守國家法律
龙泉市| 裕民县| 青河县| 大荔县| 九龙坡区| 手游| 陆川县| 察隅县| 濮阳市| 包头市| 蓬溪县| 法库县| 贵州省| 满城县| 谷城县| 阿拉尔市| 桂东县| 昌平区| 宜昌市| 霍城县| 灵璧县| 邮箱| 平安县| 怀安县| 济宁市| 台山市| 道真| 南涧| 土默特左旗| 巴林右旗| 延川县| 科尔| 科技| 阳城县| 江源县| 句容市| 郧西县| 广饶县| 太保市| 布尔津县| 屏山县|