今天重溫一下經(jīng)典的位帶操作,主要結(jié)合Cortex-M3內(nèi)核(STM32)來講述,相信許多朋友在初學(xué)的時候都被繞暈過。
關(guān)于位帶操作,它的難點其實在于需要理解或掌握較多基礎(chǔ)知識。當(dāng)你掌握這些基礎(chǔ)知識,它其實就不難了。
接下來帶領(lǐng)大家掌握關(guān)于Cortex-M3的位帶操作,順便讓大家回顧一下這些基礎(chǔ)知識。
1初識位帶操作
Bit-banding簡稱位帶,有人也叫位段。支持位帶操作后,可以使用普通的加載/存儲指令來對單一的比特進(jìn)行讀寫。
很多朋友是從學(xué)習(xí)51單片機(jī)過來的,都知道P1.1這個引腳可以單獨控制,我們操作的這個引腳就是一個Bit位。
我們都知道在STM32中不能直接操作寄存器的某一個Bit位,比如單獨控制PA端口輸出數(shù)據(jù)寄存器中的ODR1,如下圖:
STM32F1內(nèi)核Cortex-M3早就考慮到了這個問題,為了能達(dá)到直接操作ODR1這類Bit位,就在內(nèi)核中開辟了一塊地址區(qū)域(位帶別名):可以將ODR1這類Bit位(位帶區(qū))映射到位帶別名區(qū)域?qū)?yīng)的地址,只需要操作映射后的地址,就可以實現(xiàn)操作這個ODR1位了。
簡單來說就是映射操作,只是這個映射操作有許多約定要遵循。
2位帶操作中的映射關(guān)系
在Cortex-M3中有兩個區(qū)實現(xiàn)了位帶操作,其中一個是SRAM區(qū)的最低 1MB 范圍,第二個則是片內(nèi)外設(shè)區(qū)的最低 1MB 范圍。
這兩個區(qū)域如下圖紅色標(biāo)注的區(qū)域:
這兩個1MB將分別映射到另外兩個地址區(qū)域:
1.SRAM區(qū)的最低1MB(0x2000 0000 --- 0x200F FFFF) 映射到(0x2200 0000 --- 0x23FF FFFF)。
2.片內(nèi)外設(shè)區(qū)的最低1MB(0x4000 0000 --- 0x400F FFFF)映射到(0x4200 0000 --- 0x43FF FFFF)。
其實就是映射到偏移(距離自身)0x0200 0000外的32MB空間(位帶別名區(qū)),如下圖SRAM區(qū)映射關(guān)系:
提示:看圖中的有顏色的8Bit,它是映射到偏移0x0200 0000外的32Bit(4Byte)空間上。我們讀寫0x2200 0000這個地址,其實就是操作0x2000 0000中的Bit0位。
這就是所謂的“比特的膨脹對應(yīng)關(guān)系”,1Bit膨脹到32Bit(4字節(jié))。4字節(jié)對應(yīng)的就是那1Bit位的地址,而這個地址中的數(shù)據(jù)只有最低一位才有效(LSB)。
解釋上面多處出現(xiàn)的關(guān)鍵詞
位帶區(qū): 支持位帶操作的地址區(qū);
位帶別名: 對別名地址的訪問最終作用到位帶區(qū)的訪問上;
3位帶區(qū)->別名區(qū)計算公式
位帶操作的主要目的:通過Bit位地址(A)計算得到別名區(qū)地址(AliasAddr)。
1.SARM區(qū)計算公式
AliasAddr= 0x22000000 + ((A‐0x20000000)*8+n)*4 =0x22000000+(A-0x20000000)*32 + n*4
2.片上外設(shè)區(qū)計算公式
AliasAddr= 0x42000000 + ((A-0x40000000)*8+n)*4 =0x42000000+(A-0x40000000)*32 + n*4
由于映射關(guān)系一樣,所以公式原理也一樣,只是地址不一樣。計算公式需要結(jié)合上圖比特的膨脹對應(yīng)關(guān)系來理解。
*8:1個字4個字節(jié);
*4:1個字節(jié)8Bit;
4代碼實現(xiàn)
利用上面計算公式,代碼實現(xiàn)的過程就很簡單,我們的目的就是對“AliasAddr”這個地址進(jìn)行讀寫操作。
1.RAM位帶操作宏定義
#define BITBAND_RAM(RAM, BIT) (*((uint32_t volatile*)(0x22000000u + (((uint32_t)&(RAM) - (uint32_t)0x20000000u)<<5) + (((uint32_t)(BIT))<<2))))
2.外設(shè)寄存器位帶宏定義
#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數(shù)據(jù)輸出寄存器輸出1
BITBAND_REG(GPIOA->ODR, 1) = 1;
D.讀取PA1數(shù)據(jù)輸出寄存器
uint8_t Val;
Val=BITBAND_REG(GPIOA->ODR, 1);
這里就是操作某一個地址,類似于操作指針一樣;
5位帶操作優(yōu)缺點
1.優(yōu)點
相比直接操作寄存器代碼更簡潔,運行效率更高。避免在多任務(wù),或中斷時出現(xiàn)紊亂等。
2.缺點
操作不當(dāng)(傳入地址參數(shù)不對),容易出現(xiàn)總線Fault。
-
STM32
+關(guān)注
關(guān)注
2272文章
10924瀏覽量
357608 -
51單片機(jī)
+關(guān)注
關(guān)注
274文章
5705瀏覽量
124313 -
Cortex-M3
+關(guān)注
關(guān)注
9文章
270瀏覽量
59591
發(fā)布評論請先 登錄
相關(guān)推薦
減速機(jī)的原理和用途知識你了解多少?
![減速機(jī)的原理和<b class='flag-5'>用途</b>知識<b class='flag-5'>你</b><b class='flag-5'>了解</b>多少?](https://file1.elecfans.com/web1/M00/F4/55/wKgaoWcpsoqAQw_AAACB5_rnlvI928.png)
評論