STM32點(diǎn)亮LED燈有很多種方法。第一種是操作寄存器來(lái)點(diǎn)亮LED燈,(以GPIOC的第一個(gè)LED為例)操作的方法是首先在中文手冊(cè),首先要聲明的是,手冊(cè)里面看到的地址,都是字節(jié),表示第多少多少個(gè)字節(jié),然后這個(gè)數(shù)字對(duì)應(yīng)一個(gè)字節(jié)位,所以每一個(gè)32位的寄存器占四個(gè)字節(jié),找到block2(這個(gè)是外設(shè)區(qū),所有的外設(shè)地址都在這個(gè)區(qū))的基地址,然后加上第一段偏移地址,就越過(guò)APB1總線的內(nèi)存區(qū),到達(dá)了APB2總線這個(gè)區(qū)的基地址。然后再加上相對(duì)于APB2的偏移地址就可以定位出某個(gè)特定外設(shè)的基地址,這里所指的是GPIOC端口的基地址,然后再在這個(gè)端口外設(shè)基地址的基礎(chǔ)上,加上相應(yīng)的偏移地址,就可以定義出這個(gè)端口的寄存器地址,這些寄存器是緊緊的挨著的,一個(gè)接一個(gè)的,每個(gè)寄存器占四個(gè)字節(jié)。然后就參考手冊(cè)的寄存器介紹圖來(lái)編程,從而操作寄存器相應(yīng)的位來(lái)實(shí)現(xiàn)引腳輸入輸出的不同,也就是配置寄存器實(shí)現(xiàn)相關(guān)的功能。(要注意的是:其實(shí)這里我們所定義的宏(也就是定義的地址)其實(shí)就是相關(guān)的寄存器的基地址,這個(gè)寄存器的全程還包括這個(gè)基地址以后的四個(gè)字節(jié),其實(shí)這里定義的這個(gè)宏代表的就是這個(gè)寄存器,雖然它只用了每個(gè)寄存器的基地址來(lái)表示),其實(shí)都是一樣的,每個(gè)數(shù)字對(duì)應(yīng)著一個(gè)位。要讓GPIOC的引腳0輸出低電平的意思就是配置BSRR寄存器的BS0位為1。當(dāng)然在配置這個(gè)之前,我們還需要了解GPIOC的基本結(jié)構(gòu)(其實(shí)每個(gè)GPIO的結(jié)構(gòu)都是一樣的,這里用GPIOC引腳來(lái)舉例子)和它的八種工作模式。這里需要著重說(shuō)一下的是,除了模擬輸入和模擬輸出這兩種工作模式用的是模擬量以外,其他的工作模式,如果是輸入則從引腳處進(jìn)去模擬量通過(guò)施密特觸發(fā)器以后變成數(shù)字0和1,如果是輸出則通過(guò)一個(gè)模擬量輸出然后經(jīng)過(guò)MOS管的處理變成了輸出量為高電平和低電平,這里本質(zhì)上就是把控制引腳輸出高低電平的寄存器位設(shè)置為0或者1,然后會(huì)讓相應(yīng)的引腳輸出高低電平。當(dāng)然在配置寄存器讓引腳輸出高低電平之前,還需要配置其他的寄存器,讓這個(gè)引腳位置有相應(yīng)的工作模式和工作速度。這樣就實(shí)現(xiàn)了LED點(diǎn)亮(本質(zhì)上就是引腳位置輸出了一個(gè)低電平接在LED燈的一端,LED燈的另一端接了一個(gè)VDD正電源,然后燈就亮了)。所有的點(diǎn)亮LED燈的操作說(shuō)白了都是這個(gè)最基本原理,配置寄存器,輸出低電平,點(diǎn)亮燈。在GPIO每個(gè)端口的某個(gè)引腳輸出電平時(shí),其實(shí)可以在輸入端測(cè)出到底輸出的是高電平還是低電平(測(cè)的原理就和輸入原理一樣)。
第二種方式用的是固件庫(kù)模板點(diǎn)亮LED。這種方法的本質(zhì)和第一種是一樣的都是操作寄存器的位從而實(shí)現(xiàn)對(duì)應(yīng)引腳輸出不同的電平。使用這種方法首先需要?jiǎng)?chuàng)建一個(gè)模板,創(chuàng)建方式可以參考中文參考手冊(cè)和開(kāi)發(fā)攻略。然后再自己新定義一個(gè)函數(shù),將用到的函數(shù)從已經(jīng)定義好的庫(kù)文件中調(diào)用出來(lái)即可。再在main.c函數(shù)中調(diào)用新定義的函數(shù)初始化寄存器即可。雖然與第一種方式不同,但實(shí)際上達(dá)到的效果是一樣的(也就是說(shuō)最后實(shí)現(xiàn)的配置結(jié)構(gòu)是一樣的,只是配置的方式并不相同)。
第三種方法是位帶操作。
STM32所基于的ARM Cortex-M3內(nèi)核引入了一種新穎的“位帶”技術(shù)(英文稱為Bit
Band),這種“位帶”技術(shù)將部分其片內(nèi)的部分稱為“位帶區(qū)”的存儲(chǔ)區(qū)域和另外一部分稱為“位帶別名區(qū)”的區(qū)域映射起來(lái)。一個(gè)比較完整的描述是:Cortex-M3的內(nèi)部存儲(chǔ)空間有2個(gè)“位帶區(qū)”,分別稱為“SRAM位帶區(qū)”和“外設(shè)存儲(chǔ)位帶區(qū)”,各自位于SRAM區(qū)和外設(shè)存儲(chǔ)區(qū)各自最低的1MBit空間;并有對(duì)應(yīng)的2個(gè)“位帶別名區(qū)”,分別稱為“SRAM位帶別名區(qū)”和“外設(shè)存儲(chǔ)位帶別名區(qū)”,每個(gè)別名區(qū)大小為32MBit。“位帶”技術(shù)將兩個(gè)“位帶區(qū)”的每一位分別映射帶對(duì)應(yīng)的“位帶別名區(qū)”的一個(gè)“字”(即32位)的最低位上。圖1展示了這種關(guān)系:
圖1
圖1中,左邊的0x40000000表示“外設(shè)存儲(chǔ)位帶區(qū)”的起始地址,而右邊的0x42000000則表示“外設(shè)存儲(chǔ)位帶別名區(qū)”的存儲(chǔ)地址,0th Bit、1th Bit等表示從地址0x40000000依次往后的第0位,第1位等。右邊的0x42000000表示STM32內(nèi)部的“外設(shè)存儲(chǔ)位帶別名區(qū)”起始地址,而下面的0x42000000 – 0x420000010、0x42000010 – 0x420000020等則表示從地址0x42000000依次往后的第1個(gè)、第二個(gè)“字”空間。在此要注意到的是,STM32作為一款32位控制器,其數(shù)據(jù)總線當(dāng)然是32位的,但其內(nèi)部存儲(chǔ)空間不僅支持32位存取,同時(shí)也支持8位(字節(jié))、16位(半字)存取方式,因此其內(nèi)部存儲(chǔ)空間是按照最小存取長(zhǎng)度(8位)來(lái)對(duì)齊的,以圖1中的0x42000000 – 0x420000010為例,其存儲(chǔ)空間的排列情況如下圖2所示。假設(shè)想這段空間內(nèi)寫入數(shù)據(jù)0x12345678,則實(shí)際內(nèi)容(假設(shè)是小端存儲(chǔ)格式)如圖3所示。
圖2 圖3
8位長(zhǎng)度的對(duì)齊方式?jīng)Q定了用戶通過(guò)應(yīng)用程序操作存儲(chǔ)空間的最小長(zhǎng)度為8位,亦即1個(gè)字節(jié)。因此如果要單獨(dú)對(duì)某一“位”進(jìn)行操作,則必須使用上文中所講述的辦法。
但通過(guò)這種“位帶”技術(shù)進(jìn)行存儲(chǔ)空間的映射后,可以很輕易快捷的實(shí)現(xiàn)位操作。當(dāng)對(duì)“位帶別名區(qū)”的某一個(gè)“字”空間的最低位進(jìn)行清除操作時(shí),則對(duì)應(yīng)的“位帶區(qū)”所對(duì)應(yīng)的“位”即會(huì)被清除,反之當(dāng)對(duì)“位帶別名區(qū)”的某一個(gè)“字”空間的最低位進(jìn)行置位操作時(shí),,則對(duì)應(yīng)的“位帶區(qū)”所對(duì)應(yīng)的“位”也會(huì)被置位。這樣一來(lái),前文所講述的“讀出——修改——寫入”就變成了只有“寫入”的過(guò)程,這是一種非常典型的空間換時(shí)間的做法。也許有讀者會(huì)疑問(wèn),這樣豈不是損失掉了2個(gè)32MBit的存儲(chǔ)空間?答案是這部分存儲(chǔ)空間是通過(guò)映射技術(shù)“虛擬”出來(lái)的,STM32片內(nèi)的這部分地址空間并沒(méi)有物理存儲(chǔ)介質(zhì)存在。
下面通過(guò)一個(gè)簡(jiǎn)單的例子講述如何實(shí)現(xiàn)STM32微控制器平臺(tái)上的“位帶”技術(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的點(diǎn)亮發(fā)光二極管的操作。其中發(fā)光二極管使用STM32的PA4引腳的輸出高電平點(diǎn)亮,則只要在PA4引腳輸出一個(gè)高電平,即可點(diǎn)亮該發(fā)光二極管。
通過(guò)查閱STM32的開(kāi)發(fā)手冊(cè)可以知道,要在PA4引腳輸出高電平,則只需要在初始化完畢GPIOA設(shè)備之后對(duì)GPIOA的ODR寄存器的第4位寫入一個(gè)“1”即可。這個(gè)目的很簡(jiǎn)單,重點(diǎn)是如何計(jì)算ODR寄存器的第4位在“位帶別名區(qū)”中所對(duì)應(yīng)的“字”空間地址。獲取該地址的過(guò)程如下圖4所示。
圖4
事實(shí)上有了前文的描述,相信圖4是比較容易理解的。圖中自上往下最終推算出了GPIOA的ODR各個(gè)位的“位帶別名區(qū)”的地址,可以看到ODR寄存器的第4位所對(duì)應(yīng)的“字”空間地址為0x42210190。從STM32的開(kāi)發(fā)手冊(cè)上也可以獲取“位帶別名區(qū)”的字空間所對(duì)應(yīng)的“位”:
bit_word_addr = bit_band_base + (byte_offset×32) + (bit_number×4)
上述公式中,bit_word_addr表示“位帶別名區(qū)”字空間,bit_band_base表示對(duì)應(yīng)的“位帶區(qū)別名區(qū)”起始地址,byte_offset表示“位”在“位帶區(qū)”中的字節(jié)偏移地址,bit_number則表示“位”在對(duì)應(yīng)“位帶區(qū)”字節(jié)中的位置。
以對(duì)GPIOA的ODR寄存器的第4位寫入一個(gè)“1”為例,首先要找到ODR寄存器的第4位的“位帶區(qū)”起始地址,字節(jié)偏移地址和在字節(jié)中的位置。其中“位帶區(qū)”起始地址已知為0x42000000,而字節(jié)偏移地址由在圖4找出為0x0001080C(注意是此處偏移地址,不是圖中的絕對(duì)地址),同時(shí)位置為第4位,因此可以套用上述公式計(jì)算對(duì)應(yīng)的“字空間”
bit_word_addr = 0x42000000 + (0x0001080C × 32) + (4 × 4) = 0x42210190
可知可圖中推算的結(jié)果一致。因此,只要向地址為0x42210190的空間寫入“1”即可點(diǎn)亮發(fā)光二極管。
上一篇:STM32F103利用定時(shí)器2與串口接收指令控制LED亮度
下一篇:stm32 pwm 呼吸燈
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦
- Microchip 升級(jí)數(shù)字信號(hào)控制器(DSC)產(chǎn)品線 推出PWM 分辨率和 ADC 速度業(yè)界領(lǐng)先的新器件
- 意法半導(dǎo)體STM32MP23x:突破成本限制的工業(yè)AI應(yīng)用核心
- 意法半導(dǎo)體推出用于匹配遠(yuǎn)距離無(wú)線微控制器STM32WL33的集成的匹配濾波芯片
- ESP32開(kāi)發(fā)板連接TFT顯示屏ST7789跳坑記
- 如何讓ESP32支持analogWrite函數(shù)
- LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇
- 使用樹(shù)莓派進(jìn)行 ESP32 Jtag 調(diào)試
- ESP32怎么在SPIFFS里面存儲(chǔ)html,css,js文件,以及網(wǎng)頁(yè)和arduino的通訊
- ESP32 freeRTOS使用測(cè)試
- 上汽大眾:汽車網(wǎng)絡(luò)安全漏洞防護(hù)
- 恩智浦推出全新電池控制IC系列 助力新能源解決方案發(fā)展
- 全球首條GWh級(jí)新型固態(tài)電池生產(chǎn)線樣件下線
- 總投資455億元!三大動(dòng)力電池項(xiàng)目齊刷進(jìn)度條
- 現(xiàn)代汽車韓國(guó)建氫燃料電池廠,2028年投產(chǎn)
- 6月融資一覽:智能汽車芯片、第三代半導(dǎo)體、機(jī)器人成資本焦點(diǎn)
- 艙駕一體“點(diǎn)燃”新戰(zhàn)事
- 汽車智能化2.0引爆「萬(wàn)億蛋糕」,誰(shuí)在改寫游戲規(guī)則?
- 2025研華智能系統(tǒng)產(chǎn)業(yè)伙伴峰會(huì)成功舉辦
- 意法半導(dǎo)體公布2025年第二季度財(cái)報(bào)和電話會(huì)議時(shí)間安排
- 有獎(jiǎng)直播:AC/DC 在 ATX 及 Server 電源解決方案及應(yīng)用 報(bào)名開(kāi)始啦!
- 更直觀的了解5G?觀看羅德與施瓦茨主題演講,填問(wèn)卷贏好禮!
- 邀你聊一聊:學(xué)習(xí)MCU的正確方法和你的學(xué)習(xí)之路
- 村田在線課堂:工業(yè)&環(huán)境、通信篇
- STM32全國(guó)巡回研討會(huì)高能來(lái)襲, 快告訴小伙伴們
- 真香!泰克示波器全新升級(jí),速來(lái)解鎖!不看感覺(jué)錯(cuò)過(guò)一個(gè)億!
- Digi-key干貨視頻教程來(lái)襲,意見(jiàn)領(lǐng)袖講解疑難設(shè)計(jì)問(wèn)題,帶你突破成長(zhǎng)瓶頸~
- 助力初創(chuàng)公司~21種Maxim評(píng)估板來(lái)了!免費(fèi)領(lǐng)取進(jìn)行中!
- 韶音發(fā)布新骨傳導(dǎo)耳機(jī)Aeropex 還有一款可在水下使用
- 韶音Aeropex AS800骨傳導(dǎo)耳機(jī)體驗(yàn):變成小而強(qiáng)
- 三星Galaxy Note 10邀請(qǐng)函開(kāi)箱設(shè)計(jì)
- 北京7月將全面取消手機(jī)一卡通開(kāi)卡費(fèi)
- 三星Galaxy Note 10將于8月7日發(fā)布
- 三星Galaxy S9宣傳語(yǔ)曝光 確認(rèn)最強(qiáng)拍照
- HomePod即將上市:已知的新細(xì)節(jié)匯總
- 手頭現(xiàn)金飽滿 蘋果2018年的購(gòu)并動(dòng)向備受矚目
- 東莞智能手機(jī)產(chǎn)業(yè) 按下發(fā)展快進(jìn)鍵
- 傳歐盟今天將向高通開(kāi)出巨額罰單
- 請(qǐng)問(wèn)NK調(diào)入內(nèi)存并開(kāi)始執(zhí)行后,為何還要讀FLASH?
- 單片機(jī)學(xué)習(xí)方面的問(wèn)題!
- LIST BOX顯示數(shù)據(jù)的問(wèn)題
- 使用IAR編譯Em357的Z3SmartOutletSoc工程出錯(cuò)總結(jié)
- ucos-ii任務(wù)劃分設(shè)計(jì)
- 俺的C習(xí)題(7)——這其實(shí)也是個(gè)沒(méi)啥技術(shù)含量的
- 幫看看串口通信用不了
- 麥克風(fēng)陣列評(píng)估板PXVF3000-KIT
- Agitek工程師—如何利用矢量網(wǎng)絡(luò)分析儀測(cè)量電纜阻抗和損耗
- 出多點(diǎn)溫度采集模塊LCT2662M