1.為什么需要BitBand
??在51系列的單片機(jī)中可以通過(guò)P1.1=1這樣的用法來(lái)設(shè)置P1口編號(hào)為1的引腳的電平,但是在STM32系列的單片機(jī)中不能直接設(shè)置某一個(gè)I/O口的電平咱台,只能對(duì)某一個(gè)PORT口進(jìn)行統(tǒng)一賦值肄程,即遵循讀--改--寫的順序進(jìn)行,但是在這個(gè)操作的過(guò)程中容易出現(xiàn)異常情況。
https://scienceprog.com/bit-band-operations-with-arm-cortex-microcontrollers/
??于是就有個(gè)BitBand,即將某一個(gè)字節(jié)中一位與別名區(qū)的一個(gè)字相對(duì)應(yīng)简肴,這樣可以通過(guò)直接給這個(gè)字賦值來(lái)直接修改與其對(duì)應(yīng)的bit,提高修改的效率和準(zhǔn)確性百侧。
??在STM32中有兩個(gè)區(qū)域支持BitBand砰识,分別是SRAM區(qū)和外設(shè)區(qū)(peripheral space),這兩個(gè)區(qū)域和同名區(qū)的對(duì)應(yīng)關(guān)系分別為:
SRAM:0x20000000(RAM_Base) ----- 0x20100000
同名區(qū):0x22000000(RAM_BB_Base) ----- 0x23FFFFFF
外設(shè): 0x40000000 ----- 0x40100000
同名區(qū):0x42000000 ----- 0x43FFFFFF
http://www.micromouseonline.com/2010/07/14/bit-banding-in-the-stm32/
2.BitBand原理
??對(duì)于SRAM中的某個(gè)bit佣渴,該bit在位帶別名區(qū)的地址:
AliasAddr = 0x22000000 + ((A‐0x20000000)8+n)4
= 0x22000000 + (A‐0x20000000)32 + n4
??對(duì)于片上外設(shè)位帶區(qū)的某個(gè)比特辫狼,該比特在位帶別名區(qū)的地址:
AliasAddr = 0x42000000 + ((A‐0x40000000)8+n)4
= 0x42000000 + (A‐0x40000000)32 + n4
??其中 A 為該比特所在的字節(jié)的地址,0 <= n <= 7辛润,“4”表示一個(gè)字為 4 個(gè)字節(jié)膨处,“8”表示一個(gè)字節(jié)中有 8 個(gè)比特。
??上式中砂竖,0x22000000 是同名區(qū)基地址(RAM_BB_BASE)真椿,0x20000000是內(nèi)存區(qū)基地址(RAM_BASE),A是該比特所在的字節(jié)的地址乎澄,所以A‐0x20000000即為需要轉(zhuǎn)化的bit所在的字節(jié)的地址與RAM基地址的差突硝,(A‐0x20000000)8即為這個(gè)字節(jié)差對(duì)應(yīng)的bit數(shù)目,n為需要修改的bit在該字節(jié)中的索引置济,((A‐0x40000000)8+n)*4即為需要修改的bit位距離RAM基地址的bit數(shù)目解恰,然后在32位機(jī)器中,應(yīng)用BitBand進(jìn)行映射的時(shí)候浙于,一位bit會(huì)膨脹成32位护盈,即4個(gè)字節(jié),所以后面要乘以4.