位帶操作可能現在用的比較少了,但在以前MCU性能不是很好的時候,位帶操作卻是眾多軟件工程師常用操作。
本文主要結合Cortex-M3內核(STM32F1)來講述,相信許多朋友在初學的時候都被繞暈過。
1、關于位帶操作
Bit-banding簡稱位帶,有人也叫位段。支持位帶操作后,可以使用普通的加載/存儲指令來對單一的比特進行讀寫。
很多朋友是從學習51單片機過來的,都知道P1.1這個引腳可以單獨控制,我們操作的這個引腳就是一個Bit位。
我們都知道在STM32中不能直接操作寄存器的某一個Bit位,比如單獨控制PA端口輸出數據寄存器中的ODR1,如下圖:
STM32F1內核Cortex-M3早就考慮到了這個問題,為了能達到直接操作ODR1這類Bit位,就在內核中開辟了一塊地址區域(位帶別名):可以將ODR1這類Bit位(位帶區)映射到位帶別名區域對應的地址,只需要操作映射后的地址,就可以實現操作這個ODR1位了。
簡單來說就是映射操作,只是這個映射操作有許多約定要遵循。
2、位帶操作中的映射關系
在Cortex-M3中有兩個區實現了位帶操作,其中一個是SRAM區的最低 1MB 范圍,第二個則是片內外設區的最低 1MB 范圍。
這兩個區域如下圖紅色標注的區域:
這兩個1MB將分別映射到另外兩個地址區域:1.SRAM區的最低1MB(0x2000 0000 --- 0x200F FFFF) 映射到(0x2200 0000 --- 0x23FF FFFF)。
2.片內外設區的最低1MB(0x4000 0000 --- 0x400F FFFF)映射到(0x4200 0000 --- 0x43FF FFFF)。
其實就是映射到偏移(距離自身)0x0200 0000外的32MB空間(位帶別名區),如下圖SRAM區映射關系:
提示:看圖中的有顏色的8Bit,它是映射到偏移0x0200 0000外的32Bit(4Byte)空間上。我們讀寫0x2200 0000這個地址,其實就是操作0x2000 0000中的Bit0位。
這就是所謂的“比特的膨脹對應關系”,1Bit膨脹到32Bit(4字節)。4字節對應的就是那1Bit位的地址,而這個地址中的數據只有最低一位才有效(LSB)。
解釋上面多處出現的關鍵詞:位帶區:支持位帶操作的地址區;位帶別名:對別名地址的訪問最終作用到位帶區的訪問上;
3、位帶區->別名區計算公式
位帶操作的主要目的:通過Bit位地址(A)計算得到別名區地址(AliasAddr)。
1.SARM區計算公式
AliasAddr= 0x22000000 + ((A‐0x20000000)*8+n)*4 =0x22000000+(A-0x20000000)*32 + n*4
2.片上外設區計算公式
AliasAddr= 0x42000000 + ((A-0x40000000)*8+n)*4 =0x42000000+(A-0x40000000)*32 + n*4
由于映射關系一樣,所以公式原理也一樣,只是地址不一樣。計算公式需要結合上圖比特的膨脹對應關系來理解。
*8:1個字4個字節;
*4:1個字節8Bit;
4、代碼實現
利用上面計算公式,代碼實現的過程就很簡單,我們的目的就是對“AliasAddr”這個地址進行讀寫操作。
1.RAM位帶操作宏定義
#defineBITBAND_RAM(RAM,BIT)(*((uint32_tvolatile*)(0x22000000u+(((uint32_t) (RAM)-(uint32_t)0x20000000u)<<5)?+?(((uint32_t)(BIT))<<2))))
2.外設寄存器位帶宏定義
#defineBITBAND_REG(REG,BIT)(*((uint32_tvolatile*)(0x42000000u+(((uint32_t) (REG)-(uint32_t)0x40000000u)<<5)?+?(((uint32_t)(BIT))<<2))))
方便大家對比,給一個截圖:
A.RAM地址0x20001000的Bit1位寫0
BITBAND_RAM(*(uint32_t*)0x20001000,1)=0;
B.讀取RAM地址0x20001000的Bit1位
uint8_tVal;Val=BITBAND_RAM(*(uint32_t*)0x20001000,1);
C.對PA1數據輸出寄存器輸出1
BITBAND_REG(GPIOA->ODR,1)=1;
D.讀取PA1數據輸出寄存器
uint8_tVal;Val=BITBAND_REG(GPIOA->ODR,1);
這里就是操作某一個地址,類似于操作指針一樣;
5、位帶操作優缺點
1.優點
相比直接操作寄存器代碼更簡潔,運行效率更高。避免在多任務,或中斷時出現紊亂等。
2.缺點
操作不當(傳入地址參數不對),容易出現總線Fault。
6、最后
關于Cortex-M3的位帶操作,更多詳情可以參看Cortex-M3技術參考手冊(權威指南)。
這后面的Cortex-M處理器已經不再支持位帶操作了,從兼容未來軟件的角度來說,不是很建議大家再繼續使用了。
只是位帶操作是一種經典,這里分享給大家了解一下,希望對你們有幫助。
來源:嵌入式專欄
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理
審核編輯 黃宇
-
mcu
+關注
關注
146文章
17317瀏覽量
352622 -
Cortex-M
+關注
關注
2文章
229瀏覽量
29841
發布評論請先 登錄
相關推薦
評論