1 定義
首先需要明確下,位段,位帶和別名區這三個名詞
名詞定義
位段
STM32用戶參考手冊使用的名字
位帶
CortexM3參考手冊使用的
別名區
地址總線上用來位訪問地址區域,
所以說,位段和位帶是一個意思,是不同手冊的不同叫法。
由上述的名詞解釋得知,位帶功能并不是STM32獨有的,是CortexM3的功能(CortexM4也有這樣的功能)。MCS51有位操作,以一位(bit)為數據對象的操作,MCS51可以簡單的將P1口的第2位獨立操作:P1.2=0;P1.2=1 ;這樣就把P1口的第三個腳(bit2)置0置1。而STM32的位段、位帶別名區最重要的就為了實現這樣的功能。
2 位帶操作
2.1 范圍
位帶是有范圍的,并不是CortexM3全部地址空間都支持的。在 CM3中,有兩個區中實現了位帶。其中一個是 SRAM 區的最低 1MB 范圍,第二個則是片內外設區的最低 1MB 范圍。這兩個區中的地址除了可以像普通的 RAM 一樣使用外,它們還都有自己的“位帶別名區”,位帶別名區把每個比特膨脹成一個 32 位的字。當你通過位帶別名區訪問這些字時,就可以達到訪問原始比特的目的。
支持位帶操作的兩個內存區的范圍是:
0x2000_0000‐0x200F_FFFF (SRAM 區中最低1MB區域)
0x4000_0000‐0x400F_FFFF (片上外設區中的最低 1MB)
2.2 位帶操作
對 SRAM 位帶區的某個比特,記該比特所在字節的地址為A,位序號為 n (0<=n<=7),則它在別名區的地址為:
AliasAddr = 0x22000000 + ((A‐0x20000000)*8+n)*4 =0x22000000 + (A‐0x20000000)*32 + n*4
對于片上外設位帶區的某個比特,記該比特所在字節的地址為A,位序號為 n (0<=n<=7),則該比特在別名區的地址為:
AliasAddr = 0x42000000 + ((A‐0x40000000)*8+n)*4 = 0x42000000 + (A‐0x40000000)*32 + n*4
上式中,“*4”表示一個字為 4 個字節,“*8”表示一個字節中有 8 個比特。
2.3代碼實現
把“位帶地址+位序號”轉換別名地址宏為:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000 + ((addr &0xFF FFF)< 5) + (bitnum 2))
把該地址轉換成一個指針:
#define MEM_ADDR(addr, bitnum) *((volatile unsigned long *)((addr & 0xF0000000)+0x2000000 + ((addr &0xFF FFF)< 5) + (bitnum< 2)))
其中
addr的取值范圍:
0x2000_0000‐0x200F_FFFF
0x4000_0000‐0x400F_FFFF
注意:addr取值要32位對齊
bitnum的取值范圍:
0-31
解析:
(addr & 0xf0000000) + 0x02000000:
區分SRAM還是外設,如果是外設,結果為4,再加0x2000000就等于0x4200000,0x42000000就是外設別名位帶區。如果是SRAM,結果為2,再加上0x2000000就等于0x22000000,0x22000000就是SRAM別名位帶區。
addr & 0x00ffffff:
屏蔽了最高2位,相當于減去0x20000000或者0x40000000。因為位帶區的有效范圍是1M,即0x100000,這樣子就做到了低6位有效。
<< 5:
等價于乘以32
<< 2:
等價于乘以4
特別提醒
當你使用位帶功能時,要訪問的變量必須用 volatile 來定義。因為 C 編譯器并不知道同一個比特可以有兩個地址。所以就要通過 volatile,使得編譯器每次都如實地把新數值寫入存儲器,而不再會出于優化的考慮。
3 位段的優點
最容易想到的就是通過 GPIO 的管腳來單獨控制每盞 LED 的點亮與熄滅。另一方面,也對操作串行接口器件提供了很大的方便(典型如 74HC165,CD4094)。位帶操作可以把代碼縮小, 速度更快,效率更高,更安全??傊粠Р僮鲗τ?a target="_blank">硬件 I/O 密集型的底層程序最有用處了
位帶操作還能用來化簡跳轉的判斷。
當跳轉依據是某個位時,以前必須這樣做
1、讀取整個寄存器
2、掩蔽不需要的位
3、比較并跳轉
使用位帶操作后
1、從未帶別名區讀取狀態位
2、比較并跳轉
當然,對于寫入操作也從4步精簡到3步
-
存儲器
+關注
關注
38文章
7484瀏覽量
163776 -
STM32
+關注
關注
2270文章
10896瀏覽量
355781 -
GPIO
+關注
關注
16文章
1204瀏覽量
52060 -
MCS51單片機
+關注
關注
0文章
24瀏覽量
14695 -
SRAM控制器
+關注
關注
0文章
11瀏覽量
5892
發布評論請先 登錄
相關推薦
評論