国产精品久久久久影院,成人午夜福利视频,国产精品久久久久高潮,国产精品 欧美 亚洲 制服,国产精品白浆无码流出

STM32總結(jié)一 STM32三種點亮LED燈方式的不同之處

發(fā)布者:書卷氣息最新更新時間:2019-07-18 來源: eefocus 手機看文章 掃描二維碼
隨時隨地手機看文章

STM32點亮LED燈有很多種方法。第一種是操作寄存器來點亮LED燈,(以GPIOC的第一個LED為例)操作的方法是首先在中文手冊,首先要聲明的是,手冊里面看到的地址,都是字節(jié),表示第多少多少個字節(jié),然后這個數(shù)字對應(yīng)一個字節(jié)位,所以每一個32位的寄存器占四個字節(jié),找到block2(這個是外設(shè)區(qū),所有的外設(shè)地址都在這個區(qū))的基地址,然后加上第一段偏移地址,就越過APB1總線的內(nèi)存區(qū),到達了APB2總線這個區(qū)的基地址。然后再加上相對于APB2的偏移地址就可以定位出某個特定外設(shè)的基地址,這里所指的是GPIOC端口的基地址,然后再在這個端口外設(shè)基地址的基礎(chǔ)上,加上相應(yīng)的偏移地址,就可以定義出這個端口的寄存器地址,這些寄存器是緊緊的挨著的,一個接一個的,每個寄存器占四個字節(jié)。然后就參考手冊的寄存器介紹圖來編程,從而操作寄存器相應(yīng)的位來實現(xiàn)引腳輸入輸出的不同,也就是配置寄存器實現(xiàn)相關(guān)的功能。(要注意的是:其實這里我們所定義的宏(也就是定義的地址)其實就是相關(guān)的寄存器的基地址,這個寄存器的全程還包括這個基地址以后的四個字節(jié),其實這里定義的這個宏代表的就是這個寄存器,雖然它只用了每個寄存器的基地址來表示),其實都是一樣的,每個數(shù)字對應(yīng)著一個位。要讓GPIOC的引腳0輸出低電平的意思就是配置BSRR寄存器的BS0位為1。當(dāng)然在配置這個之前,我們還需要了解GPIOC的基本結(jié)構(gòu)(其實每個GPIO的結(jié)構(gòu)都是一樣的,這里用GPIOC引腳來舉例子)和它的八種工作模式。這里需要著重說一下的是,除了模擬輸入和模擬輸出這兩種工作模式用的是模擬量以外,其他的工作模式,如果是輸入則從引腳處進去模擬量通過施密特觸發(fā)器以后變成數(shù)字0和1,如果是輸出則通過一個模擬量輸出然后經(jīng)過MOS管的處理變成了輸出量為高電平和低電平,這里本質(zhì)上就是把控制引腳輸出高低電平的寄存器位設(shè)置為0或者1,然后會讓相應(yīng)的引腳輸出高低電平。當(dāng)然在配置寄存器讓引腳輸出高低電平之前,還需要配置其他的寄存器,讓這個引腳位置有相應(yīng)的工作模式和工作速度。這樣就實現(xiàn)了LED點亮(本質(zhì)上就是引腳位置輸出了一個低電平接在LED燈的一端,LED燈的另一端接了一個VDD正電源,然后燈就亮了)。所有的點亮LED燈的操作說白了都是這個最基本原理,配置寄存器,輸出低電平,點亮燈。在GPIO每個端口的某個引腳輸出電平時,其實可以在輸入端測出到底輸出的是高電平還是低電平(測的原理就和輸入原理一樣)。


第二種方式用的是固件庫模板點亮LED。這種方法的本質(zhì)和第一種是一樣的都是操作寄存器的位從而實現(xiàn)對應(yīng)引腳輸出不同的電平。使用這種方法首先需要創(chuàng)建一個模板,創(chuàng)建方式可以參考中文參考手冊和開發(fā)攻略。然后再自己新定義一個函數(shù),將用到的函數(shù)從已經(jīng)定義好的庫文件中調(diào)用出來即可。再在main.c函數(shù)中調(diào)用新定義的函數(shù)初始化寄存器即可。雖然與第一種方式不同,但實際上達到的效果是一樣的(也就是說最后實現(xiàn)的配置結(jié)構(gòu)是一樣的,只是配置的方式并不相同)。


第三種方法是位帶操作。


STM32所基于的ARM Cortex-M3內(nèi)核引入了一種新穎的“位帶”技術(shù)(英文稱為Bit

Band),這種“位帶”技術(shù)將部分其片內(nèi)的部分稱為“位帶區(qū)”的存儲區(qū)域和另外一部分稱為“位帶別名區(qū)”的區(qū)域映射起來。一個比較完整的描述是:Cortex-M3的內(nèi)部存儲空間有2個“位帶區(qū)”,分別稱為“SRAM位帶區(qū)”和“外設(shè)存儲位帶區(qū)”,各自位于SRAM區(qū)和外設(shè)存儲區(qū)各自最低的1MBit空間;并有對應(yīng)的2個“位帶別名區(qū)”,分別稱為“SRAM位帶別名區(qū)”和“外設(shè)存儲位帶別名區(qū)”,每個別名區(qū)大小為32MBit?!拔粠А奔夹g(shù)將兩個“位帶區(qū)”的每一位分別映射帶對應(yīng)的“位帶別名區(qū)”的一個“字”(即32位)的最低位上。圖1展示了這種關(guān)系:


圖1


圖1中,左邊的0x40000000表示“外設(shè)存儲位帶區(qū)”的起始地址,而右邊的0x42000000則表示“外設(shè)存儲位帶別名區(qū)”的存儲地址,0th Bit、1th Bit等表示從地址0x40000000依次往后的第0位,第1位等。右邊的0x42000000表示STM32內(nèi)部的“外設(shè)存儲位帶別名區(qū)”起始地址,而下面的0x42000000 – 0x420000010、0x42000010 – 0x420000020等則表示從地址0x42000000依次往后的第1個、第二個“字”空間。在此要注意到的是,STM32作為一款32位控制器,其數(shù)據(jù)總線當(dāng)然是32位的,但其內(nèi)部存儲空間不僅支持32位存取,同時也支持8位(字節(jié))、16位(半字)存取方式,因此其內(nèi)部存儲空間是按照最小存取長度(8位)來對齊的,以圖1中的0x42000000 – 0x420000010為例,其存儲空間的排列情況如下圖2所示。假設(shè)想這段空間內(nèi)寫入數(shù)據(jù)0x12345678,則實際內(nèi)容(假設(shè)是小端存儲格式)如圖3所示。


圖2  圖3


8位長度的對齊方式?jīng)Q定了用戶通過應(yīng)用程序操作存儲空間的最小長度為8位,亦即1個字節(jié)。因此如果要單獨對某一“位”進行操作,則必須使用上文中所講述的辦法。

但通過這種“位帶”技術(shù)進行存儲空間的映射后,可以很輕易快捷的實現(xiàn)位操作。當(dāng)對“位帶別名區(qū)”的某一個“字”空間的最低位進行清除操作時,則對應(yīng)的“位帶區(qū)”所對應(yīng)的“位”即會被清除,反之當(dāng)對“位帶別名區(qū)”的某一個“字”空間的最低位進行置位操作時,,則對應(yīng)的“位帶區(qū)”所對應(yīng)的“位”也會被置位。這樣一來,前文所講述的“讀出——修改——寫入”就變成了只有“寫入”的過程,這是一種非常典型的空間換時間的做法。也許有讀者會疑問,這樣豈不是損失掉了2個32MBit的存儲空間?答案是這部分存儲空間是通過映射技術(shù)“虛擬”出來的,STM32片內(nèi)的這部分地址空間并沒有物理存儲介質(zhì)存在。


下面通過一個簡單的例子講述如何實現(xiàn)STM32微控制器平臺上的“位帶”技術(shù)實現(xiàn)一個簡單的點亮發(fā)光二極管的操作。其中發(fā)光二極管使用STM32的PA4引腳的輸出高電平點亮,則只要在PA4引腳輸出一個高電平,即可點亮該發(fā)光二極管。


通過查閱STM32的開發(fā)手冊可以知道,要在PA4引腳輸出高電平,則只需要在初始化完畢GPIOA設(shè)備之后對GPIOA的ODR寄存器的第4位寫入一個“1”即可。這個目的很簡單,重點是如何計算ODR寄存器的第4位在“位帶別名區(qū)”中所對應(yīng)的“字”空間地址。獲取該地址的過程如下圖4所示。


圖4


事實上有了前文的描述,相信圖4是比較容易理解的。圖中自上往下最終推算出了GPIOA的ODR各個位的“位帶別名區(qū)”的地址,可以看到ODR寄存器的第4位所對應(yīng)的“字”空間地址為0x42210190。從STM32的開發(fā)手冊上也可以獲取“位帶別名區(qū)”的字空間所對應(yīng)的“位”:

bit_word_addr = bit_band_base + (byte_offset×32) + (bit_number×4)

上述公式中,bit_word_addr表示“位帶別名區(qū)”字空間,bit_band_base表示對應(yīng)的“位帶區(qū)別名區(qū)”起始地址,byte_offset表示“位”在“位帶區(qū)”中的字節(jié)偏移地址,bit_number則表示“位”在對應(yīng)“位帶區(qū)”字節(jié)中的位置。


以對GPIOA的ODR寄存器的第4位寫入一個“1”為例,首先要找到ODR寄存器的第4位的“位帶區(qū)”起始地址,字節(jié)偏移地址和在字節(jié)中的位置。其中“位帶區(qū)”起始地址已知為0x42000000,而字節(jié)偏移地址由在圖4找出為0x0001080C(注意是此處偏移地址,不是圖中的絕對地址),同時位置為第4位,因此可以套用上述公式計算對應(yīng)的“字空間”

bit_word_addr = 0x42000000 + (0x0001080C × 32) + (4 × 4) = 0x42210190

可知可圖中推算的結(jié)果一致。因此,只要向地址為0x42210190的空間寫入“1”即可點亮發(fā)光二極管。

引用地址:STM32總結(jié)一 STM32三種點亮LED燈方式的不同之處

上一篇:STM32F401利用CubeMX實現(xiàn)按鍵中斷翻轉(zhuǎn)LED
下一篇:STM32F411 Discovery學(xué)習(xí)筆記(二)點亮你的第一個LED

小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機文章
隨便看看

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機器人開發(fā)圈

電子工程世界版權(quán)所有 京B2-20211791 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved