1.首先談下為什么要使用位帶?
在學習51單片機時就已經(jīng)使用過位操作,比如使用sbit對單片機IO口的定義,但是STM32中并沒有這類關鍵字昵骤,而是通過訪問位帶別名區(qū)來實現(xiàn),即通過將每個比特位膨脹成一個32位字肯适,當訪問這些字的時候就達到了訪問比特的目的变秦。比方說BSRR寄存器有32個位,那么可以映射到32個地址上框舔,當我們?nèi)ピL問這32個地址就達到訪問32個比特的目的蹦玫,也就是說我們可以通過位帶輕松的去控制某一位。
2.存儲單元和存儲地址的相關概念
?在計算機中最小的信息單位是bit刘绣,也就是一個二進制位樱溉,8個bit組成一個Byte,也就是字節(jié)纬凤。一個存儲單元可以存儲一個字節(jié)福贞,也就是8個二進制位。計算機的存儲器容量是以字節(jié)為最小單位來計算的停士,對于一個有128個存儲單元的存儲器挖帘,可以說它的容量為128字節(jié)。如果有一個1KB的存儲器則它有1024個存儲單元恋技,它的編號為從0-1023拇舀。存儲器被劃分成了若干個存儲單元,每個存儲單元都是從0開始順序編號蜻底,如一個存儲器有128個存儲單元骄崩,則它的編號就是從0-127。
存儲地址一般用十六進制數(shù)表示,而每一個存儲器地址中又存放著一組二進制(或十六進制)表示的數(shù)要拂,通常稱為該地址的內(nèi)容抠璃。值得注意的是,內(nèi)儲單元的地址和地址中的內(nèi)容兩者是不一樣的脱惰。前者是存儲單元的編號搏嗡,表示存儲器總的一個位置,而后者表示這個位置里存放的數(shù)據(jù)枪芒。正如一個是房間號碼彻况,一個是房間里住的人一樣。
存放一個機器字的存儲單元舅踪,通常稱為字存儲單元纽甘,相應的單元地址叫字地址。而存放一個字節(jié)的單元抽碌,稱為字節(jié)存儲單元悍赢,相應的地址稱為字節(jié)地址。如果計算機中可以編址的最小單元是字存儲單元货徙,則該計算機稱為按字尋址的計算機左权。如果計算機中可編址的最小單位是字節(jié),則該計算機稱為按字節(jié)尋址的計算機痴颊。如果機器字長等于存儲器單元的位數(shù)赏迟,一個機器字可以包含數(shù)個字節(jié),所以一個存儲單元也可以包含數(shù)個能夠單獨編址的字節(jié)地址蠢棱。例如一個16位二進制的字存儲單元可存放兩個字節(jié)锌杀,可以按字地址尋址,也可以按字節(jié)地址尋址泻仙。當用字節(jié)地址尋址時糕再,16位的存儲單元占兩個字節(jié)地址。(摘自百度百科)
以STM32來說玉转,STM32是一個32位的微控制器突想,它是按字存儲單元;每一個寄存器都是占用4個字節(jié)即32位究抓,這點將在下面位帶和位帶別名地址換算的時候用到
3.Cortex-M3位帶區(qū)和位帶映射區(qū)對應關系
STM32位帶及位帶別名區(qū)域支持位帶操作的區(qū)域是SRAM 區(qū)的最低1MB 范圍(APB1/2猾担,AHB1外設)和片內(nèi)外設區(qū)的最低1MB范圍。
對于SRAM/GPIO位帶區(qū)的某個比特(bit)漩蟆,記它所在的字節(jié)地址為A垒探,位序號為n(0<=n<=7)(如果是GPIO則n<=16),則該比特在位帶別名區(qū)中的地址為:
AliasAddr=0x22000000+((A-0x20000000)*8+n)*4
上式中‘8’表示每個字節(jié)中有8個比特怠李,‘4’表示4個字節(jié)(因為CM3是32位機,機器字為4個字節(jié))。
(A-0x20000000)表示一共用這么多個字節(jié)捺癞,(A-0x20000000)*8+n表示一共有這么多位,在別名區(qū)中夷蚊,每個位占4個字節(jié)地址,故((A-0x20000000)*8+n)*4表示該位在別名區(qū)中的偏移字節(jié)地址髓介。偏移地址加上基地址就是該比特在位帶別名區(qū)中的地址