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