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

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

野火STM32學(xué)習(xí)筆記(構(gòu)建庫(kù)函數(shù)模型第三節(jié)課)

2023-06-18 13:11 作者:是晃晃叔叔  | 我要投稿

互~涼~網(wǎng)的廣大觀眾朋友們大家好,本up豬在C站(CSDN俗稱糞坑)的ID叫飛天大司馬,鑒于C站雖然閱讀量大,但是本人反饋無法及時(shí),因此在B站同步更新創(chuàng)作內(nèi)容,歡迎各位新老粉絲前來批評(píng)指正一起學(xué)習(xí)。?

完善GPIO初始化的配置

上一節(jié)課我們已經(jīng)完成了對(duì)GPIO端口復(fù)位和置位寄存器的初始化,這節(jié)課我們來對(duì)他進(jìn)行一個(gè)完善的工作。完善工作很有必要,為什么呢?注意看如下代碼段


前三行可以很清楚地看見我們操作的是GPIOB的CRL與CRH,以及RCC的APB2ENR寄存器,但是這些16進(jìn)制數(shù)對(duì)于基礎(chǔ)知識(shí)不好的同學(xué)容易看不明白。于是我希望可以把他們封裝的更加簡(jiǎn)潔一點(diǎn)。

拿CRL這個(gè)GPIOx->CRL這個(gè)寄存器舉例,我們來看一下技術(shù)手冊(cè)中它的說明

圖一

可以看到如果想要操作這些寄存器的狀態(tài),我們要用兩位二進(jìn)制數(shù)代表(程序里面一般是用16進(jìn)制操作)它的四種狀態(tài),操作起來麻煩,讀者看起來也很抽象,尤其沒有技術(shù)手冊(cè)的時(shí)候更是不可能看明白的了。那我們能不能把這些需要16進(jìn)制數(shù)進(jìn)行|=和&=~操作的狀態(tài)也如同上節(jié)課那樣封裝起來呢?答案是肯定的。

我們還是用到C語言的結(jié)構(gòu)體進(jìn)行封裝,代碼的思路如下,首先我們要確定具體是哪一個(gè)端口,接著要確定這個(gè)GPIO端口的工作速度,最后再設(shè)置它的工作模式。結(jié)構(gòu)體代碼如下圖

圖二

? ? ? ?之前的文章里我寫到?jīng)]有看見16位的結(jié)構(gòu)體內(nèi)定義的情況,這里就是了,對(duì)之前的疑問可以說是有了答案。之前定義的GPIO_Pin是16位的,因此這里也寫的是16位。根據(jù)技術(shù)手冊(cè),可以看到輸出模式有八種,輸出速度只有有三種,16位的二進(jìn)制數(shù)有65536種情況,為了防止編程時(shí)犯錯(cuò)誤,我們希望把這些值限定在某個(gè)范圍內(nèi)。C語言里有一個(gè)叫做枚舉的工具幫助我們完成這項(xiàng)工作,枚舉的關(guān)鍵字叫做enum。

? ? ? 枚舉的結(jié)果如下圖所示

圖三

? ? ? ? 這里補(bǔ)充一些C語言的知識(shí),大家看到枚舉會(huì)感覺它和結(jié)構(gòu)體很相似,但是注意枚舉里面每一行結(jié)束是逗號(hào),而結(jié)構(gòu)體是分號(hào)。如果枚舉的第一個(gè)對(duì)象賦值為1,那么第二個(gè)對(duì)象的賦值為1+1=2,后面是以此類推加1的,如上圖工作速度枚舉。如果對(duì)象的枚舉值不是自加1的值,那么我們就要給每一個(gè)枚舉值分別定義,如上圖定義工作模式的枚舉所示,它的對(duì)象每一個(gè)值都是根據(jù)技術(shù)手冊(cè)來定義的。

工作模式枚舉的講解

? ? ? 這一部分因?yàn)槔斫馄饋磔^為困難,我單獨(dú)拎出來著重講解。首先我們看看技術(shù)手冊(cè)里面關(guān)于工作模式的各種值的定義如下圖:

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

圖四

可以發(fā)現(xiàn)都是00到11的二進(jìn)制數(shù),和枚舉里寫的不一樣呀,而且輸入輸出怎么會(huì)是一樣的值呢?答案我們只能去官方的固件庫(kù)手冊(cè)里面尋找?;鸶缫呀?jīng)把問題的答案總結(jié)為一張表格:

圖五

? ? ? ?首先我們看,這張表格的16進(jìn)制就對(duì)應(yīng)的我們枚舉里面的值,然后我們把它轉(zhuǎn)化為2進(jìn)制之后,既可以和右側(cè)的配置一一對(duì)應(yīng)了。

? ? ? ?最右側(cè)最低的兩位都是0,其實(shí)這兩個(gè)位對(duì)應(yīng)的是工作速度,但是工作速度我們已經(jīng)拿出來單獨(dú)配置了,因此在確定工作模式的時(shí)候就把它們?nèi)恐脼?,最后我們加上單獨(dú)配置好的工作速度對(duì)應(yīng)的值即可,加起來的值最終會(huì)寫入控制寄存器。

圖六

還剩下的六位我們來看看它是如何配置的

圖七

位于第三位和第四位bit2和bit3,它們的值剛好對(duì)應(yīng)圖六中輸入/輸出模式的值,因此這兩位就是控制GPIO引腳的輸入模式和輸出模式分別有四種,不過上拉和下拉輸入有點(diǎn)特殊,下面會(huì)講到。再看第五位bit4,它的作用就是區(qū)分輸入還是輸出,0為輸入1為輸出就是那么簡(jiǎn)單。把目光轉(zhuǎn)到第六位和第七位上來,輸入模式中有上拉和下拉輸入,根據(jù)技術(shù)手冊(cè)截圖圖六可以看到這兩個(gè)都是10,在圖七里的三四位都是寫成了00,所以說三四位不好直接定義是上拉還是下拉,于是就在第六位和第七位下文章了,01代表下拉,10代表上拉。最后最高位都為0。

總結(jié)一下其實(shí)這相當(dāng)于一個(gè)算法了,確實(shí)挺有難度的。

這節(jié)課的內(nèi)容先到這里,下節(jié)課我們來講,這么復(fù)雜的算法怎么用C語言,寫到配置GPIO的C文件stm32f10x_gpio.c里面去。


野火STM32學(xué)習(xí)筆記(構(gòu)建庫(kù)函數(shù)模型第三節(jié)課)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
怀来县| 炎陵县| 绥滨县| 文安县| 漾濞| 广南县| 大石桥市| 安图县| 界首市| 望江县| 冷水江市| 焦作市| 辰溪县| 武定县| 会理县| 合水县| 沙坪坝区| 通山县| 长寿区| 泸西县| 东山县| 弥勒县| 黑河市| 安福县| 东光县| 育儿| 定南县| 南雄市| 德安县| 大港区| 荥经县| 乌什县| 德保县| 库车县| 铁岭市| 依兰县| 松滋市| 凤冈县| 尚志市| 龙泉市| 库车县|