今天重溫一下經典的位帶操作,主要結合Cortex-M3內核(STM32)來講述,相信許多朋友在初學的時候都被繞暈過。
關于位帶操作,它的難點其實在于需要理解或掌握較多基礎知識。當你掌握這些基礎知識,它其實就不難了。
接下來帶領大家掌握關于Cortex-M3的位帶操作,順便讓大家回顧一下這些基礎知識。
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位帶操作宏定義
#define BITBAND_RAM(RAM, BIT) (*((uint32_t volatile*)(0x22000000u + (((uint32_t)&(RAM) - (uint32_t)0x20000000u)<<5) + (((uint32_t)(BIT))<<2))))
2.外設寄存器位帶宏定義
#define BITBAND_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);
這里就是操作某一個地址,類似于操作指針一樣;
5位帶操作優缺點
1.優點
相比直接操作寄存器代碼更簡潔,運行效率更高。避免在多任務,或中斷時出現紊亂等。
2.缺點
操作不當(傳入地址參數不對),容易出現總線Fault。
-
STM32
+關注
關注
2272文章
10923瀏覽量
357554 -
51單片機
+關注
關注
274文章
5705瀏覽量
124294 -
Cortex-M3
+關注
關注
9文章
270瀏覽量
59589
發布評論請先 登錄
相關推薦
評論