STM32 进阶教程 8 - 位带操作
前言
有過51單片機開發(fā)經(jīng)歷的朋友應(yīng)該都對51的IO口或一些特殊寄存器可以直接按位操作的方式不陌生吧,那么在stm32中有沒有類似的操作呢,答案是肯定的,本節(jié)將給大家介紹如何在STM32中實現(xiàn)位帶操作。
在《ARM Cortex-M3權(quán)為指南》中的第87頁對位帶操作如下描述:
位帶操作
支持了位帶操作后,可以使用普通的加載/存儲指令來對單一的比特進行讀寫。在 CM3中,有兩個區(qū)中實現(xiàn)了位帶。其中一個是 SRAM 區(qū)的最低 1MB 范圍,第二個則是片內(nèi)外設(shè)區(qū)的最低 1MB 范圍。這兩個區(qū)中的地址除了可以像普通的 RAM 一樣使用外,它們還都有自己的“位帶別名區(qū)”,位帶別名區(qū)把每個比特膨脹成一個 32 位的字。當(dāng)你通過位帶別名區(qū)訪問這些字時,就可以達到訪問原始比特的目的。
位帶區(qū)與位帶別名區(qū)的膨脹關(guān)系圖 A
位帶區(qū)與位帶別名區(qū)的膨脹對應(yīng)關(guān)系圖 B
?
示例詳解
基于硬件平臺: STM32F10C8T6最小系統(tǒng)板, MCU 的型號是?STM32F103c8t6, 使用stm32cubemx 工具自動產(chǎn)生的配置工程,使用KEIL5編譯代碼。
?
?
本示例所用的最小系統(tǒng)板原理圖:
?
?
?
?
位帶操作的概念其實30年前就有了,那還是8051 單片機開創(chuàng)的先河。如今,CM3 將此能力進化,這里的位帶操作是 8051 位尋址區(qū)的威力大幅加強版。
?
CM3 使用如下術(shù)語來表示位帶存儲的相關(guān)地址
z 位帶區(qū): 支持位帶操作的地址區(qū)
z 位帶別名: 對別名地址的訪問最終作用到位帶區(qū)的訪問上(注意:這中途有一個對
地址映射過程)
在位帶區(qū)中,每個比特都映射到別名地址區(qū)的一個字——這是只有 LSB 有效的字。當(dāng)一個別名地址被訪問時,會先把該地址變換成位帶地址。對于讀操作,讀取位帶地址中的一個字,再把需要的位右移到 LSB,并把 LSB 返回。對于寫操作,把需要寫的位左移至對應(yīng)的位序號處,然后執(zhí)行一個原子的“讀-改-寫”過程。
?
支持位帶操作的兩個內(nèi)存區(qū)的范圍是:
0x2000_0000‐0x200F_FFFF(SRAM 區(qū)中的最低 1MB)
0x4000_0000‐0x400F_FFFF(片上外設(shè)區(qū)中的最低 1MB)
對于 SRAM 位帶區(qū)的某個比特,記它所在字節(jié)地址為 A, 位序號為 n(0<=n<=7),則該比特在別名區(qū)的地址為:
AliasAddr= 0x22000000+((A‐0x20000000)*8+n)*4 =0x22000000+ (A‐0x20000000)*32 + n*4
對于片上外設(shè)位帶區(qū)的某個比特,記它所在字節(jié)的地址為 A,位序號為 n(0<=n<=7),則該比特在別名區(qū)的地址為:
AliasAddr= 0x42000000+((A‐0x40000000)*8+n)*4 =0x42000000+ (A‐0x40000000)*32 + n*4
上式中,“*4”表示一個字為 4 個字節(jié),“*8”表示一個字節(jié)中有 8 個比特。
?
對于 SRAM 內(nèi)存區(qū),位帶別名的重映射如表 5.2 所示:
表 5.2 SRAM 區(qū)中的位帶地址映射
位帶區(qū) ????????等效的別名地址
0x20000000.0 0x22000000.0
0x20000000.1 0x22000004.0
0x20000000.2 0x22000008.0
…
0x20000000.31 0x2200007C.0
0x20000004.0 0x22000080.0
0x20000004.1 0x22000084.0
0x20000004.2 0x22000088.0
…
0x200FFFFC.31 0x23FFFFFC.0
?
對于片上外設(shè),映射關(guān)系如下表所示:
表 5.3 SRAM 區(qū)中的位帶地址映射
位帶區(qū) ????????等效的別名地址
0x40000000.0 0x42000000.0
0x40000000.1 0x42000004.0
0x40000000.2 0x42000008.0
…
0x40000000.31 0x4200007C.0
0x40000004.0 0x42000080.0
0x40000004.1 0x42000084.0
0x40000004.2 0x42000088.0
…
0x400FFFFC.31 0x43FFFFFC.0
?
?
?
通過上面的實例,我們成功地通過使用位帶別名地址實現(xiàn)對寄存器中位的操作程,成功控制PC13引腳來控制LED的亮滅。是不是很簡單,對于在SRAMSRAM 內(nèi)存區(qū),通過位帶別名同樣可以輕易實現(xiàn)對位操作,有興趣的同學(xué)可以自行實險一下。
OK,本期實驗完成!下期見!同時如果大家有什么疑問或是有想了解的其它內(nèi)容,也歡迎大家留言!!最后喜歡這個公眾號的同學(xué)們記得加關(guān)注了,會有不定期技術(shù)干貨推出!!
文中源碼資料下載,在公眾號里給十三發(fā)消息:
下載|STM32進階教程 8
?
關(guān)注十三公眾號
?
?
總結(jié)
以上是生活随笔為你收集整理的STM32 进阶教程 8 - 位带操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32 进阶教程 7 - C与C+
- 下一篇: STM32 进阶教程 9 - 芯片维一码