位帶操作的概念其實30年前就有了,那還是 8051 單片機開創(chuàng)的先河。如今,CM3 將此能力進化,這里的位帶操作是 8051 位尋址區(qū)的威力大幅加強版。在學習 51 單片機的時候就使用過位操作,通過關鍵字 sbit 對單片機 IO 口進行位定義。但是 STM32 沒有這樣的關鍵字,而是通過訪問位帶別名區(qū)來實現。即將每個比特位膨脹成一個 32 位字,當訪問這些字的時候就達到了訪問比特的目的。比方說 BSRR 寄存器有 32 個位,那么可以映射到 32 個地址上,當我們去訪問這 32 個地址就達到訪問 32 個比特的目的。
STM32F1 中有兩個區(qū)域支持位帶操作,一個是 SRAM 區(qū)的最低 1MB 范圍,一個是片內外設區(qū)的最低 1MB 范圍(APB1、APB2、AHB 外設)。
STM32F1 位帶區(qū)
位帶區(qū): 支持位帶操作的地址區(qū)
位帶別名: 對別名地址的訪問最終作用到位帶區(qū)的訪問上
在位帶區(qū)中,每個比特都映射到別名地址區(qū)的一個字——這是只有 LSB 有效的字。當一個別名地址被訪問時,會先把該地址變換成位帶地址。對于讀操作,讀取位帶地址中的一個字,再把需要的位右移到 LSB,并把 LSB 返回。對于寫操作,把需要寫的位左移至對應的位序號處,然后執(zhí)行一個原子的“讀-改-寫”過程。
支持位帶操作的兩個內存區(qū)的范圍是:
0x2000_0000‐0x200F_FFFF(SRAM 區(qū)中的最低 1MB)
0x4000_0000‐0x400F_FFFF(片上外設區(qū)中的最低 1MB)
對 SRAM 位帶區(qū)的某個比特,記它所在字節(jié)地址為 A,位序號在別名區(qū)的地址為:
AliasAddr= 0x22000000+((A‐0x20000000)*8+n)*4 =0x22000000+ (A‐0x20000000)*32 + n*4
對于片上外設位帶區(qū)的某個比特,記它所在字節(jié)的地址為 A,位序號為 n(0<=n<=7),則該比特
AliasAddr= 0x42000000+((A‐0x40000000)*8+n)*4 =0x42000000+ (A‐0x40000000)*32 + n*4
上式中,“*4”表示一個字為 4 個字節(jié),“*8”表示一個字節(jié)中有 8 個比特。
位帶操作的優(yōu)越性
位帶操作有什么優(yōu)越性喃?最容易想到的就是通過 GPIO 的管腳來單獨控制每盞 LED 的點亮與熄滅。另一方面,也對操作串行接口器件提供了很大的方便(74HC165,CD4094)??傊粠Р僮鲗τ谟布?I/O 密集型的底層程序最有用處了。CM3 中還有一個為“bitbang”的概念,它通常是通過“bit‐band”實現的,但是它倆在個不同的概念。
位帶操作還能用來化簡跳轉的判斷。當跳轉依據是某個位時,以前必須這樣做。
1 讀取整個寄存器
2 掩蔽不需要的位
3 比較并跳轉
現在只需:
從位帶別名區(qū)讀取狀態(tài)位
比較并跳轉
使代碼更簡潔,這只位帶操作優(yōu)越性的初等體現,位帶操作還有一個重要的好處是在多任務中,用于實現共享資源在任務間的“互鎖”訪問。
1.《如何寫74hc4094的代碼》援引自互聯網,旨在傳遞更多網絡信息知識,僅代表作者本人觀點,與本網站無關,侵刪請聯系頁腳下方聯系方式。
2.《如何寫74hc4094的代碼》僅供讀者參考,本網站未對該內容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。
3.文章轉載時請保留本站內容來源地址,http://f99ss.com/keji/3215425.html