說到位帶操作,可能很多人比較陌生,但說到控制IO,你肯定不會陌生。有的項目為了最大效率控制IO,使用位帶操作。下面就來簡單說說未帶操作的內容。
一、初識位帶操作
Bit-banding簡稱位帶,有人也叫位段。支持位帶操作后,可以使用普通的加載/存儲指令來對單一的比特進行讀寫。很多朋友是從學習51單片機過來的,都知道P1.1這個引腳可以單獨控制,我們操作的這個引腳就是一個Bit位。我們都知道在STM32中不能直接操作寄存器的某一個Bit位,比如單獨控制PA端口輸出數據寄存器中的ODR1,如下圖:
這兩個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)。解釋上面多處出現的關鍵詞
位帶區:支持位帶操作的地址區;
位帶別名:對別名地址的訪問最終作用到位帶區的訪問上;
三、位帶區->別名區計算公式
位帶操作的主要目的:通過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;
四、代碼實現
利用上面計算公式,代碼實現的過程就很簡單,我們的目的就是對“AliasAddr”這個地址進行讀寫操作。1.RAM位帶操作宏定義
#defineBITBAND_RAM(RAM, BIT) (*((uint32_t volatile*)(0x22000000u + (((uint32_t)&(RAM) - (uint32_t)0x20000000u)<<5) + (((uint32_t)(BIT))<<2))))2.外設寄存器位帶宏定義
#defineBITBAND_REG(REG, BIT) (*((uint32_t volatile*)(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_t Val;
Val=BITBAND_RAM(*(uint32_t *)0x20001000, 1);
C.對PA1數據輸出寄存器輸出1
BITBAND_REG(GPIOA->ODR, 1) = 1;
D.讀取PA1數據輸出寄存器
uint8_t Val;
Val=BITBAND_REG(GPIOA->ODR, 1);
這里就是操作某一個地址,類似于操作指針一樣;
五、位帶操作優缺點
1.優點
相比直接操作寄存器代碼更簡潔,運行效率更高。避免在多任務,或中斷時出現紊亂等。2.缺點
操作不當(傳入地址參數不對),容易出現總線Fault。
六、說明
關于Cortex-M3的位帶操作,詳情可以參看Cortex-M3技術參考手冊(權威指南)。 我了解Cortex-M處理器中,Cortex-M3、Cortex-M4都具有位帶操作,Cortex-M0,Cortex-M+好像不支持。具體可以下載相關的技術參考手冊查看。 原文標題:快速理解STM32位帶操作原理和用途文章出處:【微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
-
STM32
+關注
關注
2270文章
10895瀏覽量
355743
原文標題:快速理解STM32位帶操作原理和用途
文章出處:【微信號:strongerHuang,微信公眾號:strongerHuang】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論