說(shuō)到位帶操作,可能很多人比較陌生,但說(shuō)到控制IO,你肯定不會(huì)陌生。有的項(xiàng)目為了最大效率控制IO,使用位帶操作。下面就來(lái)簡(jiǎn)單說(shuō)說(shuō)未帶操作的內(nèi)容。
一、初識(shí)位帶操作
Bit-banding簡(jiǎn)稱(chēng)位帶,有人也叫位段。支持位帶操作后,可以使用普通的加載/存儲(chǔ)指令來(lái)對(duì)單一的比特進(jìn)行讀寫(xiě)。很多朋友是從學(xué)習(xí)51單片機(jī)過(guò)來(lái)的,都知道P1.1這個(gè)引腳可以單獨(dú)控制,我們操作的這個(gè)引腳就是一個(gè)Bit位。我們都知道在STM32中不能直接操作寄存器的某一個(gè)Bit位,比如單獨(dú)控制PA端口輸出數(shù)據(jù)寄存器中的ODR1,如下圖:
這兩個(gè)1MB將分別映射到另外兩個(gè)地址區(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)。
其實(shí)就是映射到偏移(距離自身)0x0200 0000外的32MB空間(位帶別名區(qū)),如下圖SRAM區(qū)映射關(guān)系:
提示:看圖中的有顏色的8Bit,它是映射到偏移0x0200 0000外的32Bit(4Byte)空間上。我們讀寫(xiě)0x2200 0000這個(gè)地址,其實(shí)就是操作0x2000 0000中的Bit0位。
這就是所謂的“比特的膨脹對(duì)應(yīng)關(guān)系”,1Bit膨脹到32Bit(4字節(jié))。4字節(jié)對(duì)應(yīng)的就是那1Bit位的地址,而這個(gè)地址中的數(shù)據(jù)只有最低一位才有效(LSB)。解釋上面多處出現(xiàn)的關(guān)鍵詞
位帶區(qū):支持位帶操作的地址區(qū);
位帶別名:對(duì)別名地址的訪問(wèn)最終作用到位帶區(qū)的訪問(wèn)上;
三、位帶區(qū)->別名區(qū)計(jì)算公式
位帶操作的主要目的:通過(guò)Bit位地址(A)計(jì)算得到別名區(qū)地址(AliasAddr)。1.SARM區(qū)計(jì)算公式
AliasAddr= 0x22000000 + ((A‐0x20000000)*8+n)*4 =0x22000000+(A-0x20000000)*32 + n*4
2.片上外設(shè)區(qū)計(jì)算公式
AliasAddr= 0x42000000 + ((A-0x40000000)*8+n)*4 =0x42000000+(A-0x40000000)*32 + n*4
由于映射關(guān)系一樣,所以公式原理也一樣,只是地址不一樣。計(jì)算公式需要結(jié)合上圖比特的膨脹對(duì)應(yīng)關(guān)系來(lái)理解。*8:1個(gè)字4個(gè)字節(jié);
*4:1個(gè)字節(jié)8Bit;
四、代碼實(shí)現(xiàn)
利用上面計(jì)算公式,代碼實(shí)現(xiàn)的過(guò)程就很簡(jiǎn)單,我們的目的就是對(duì)“AliasAddr”這個(gè)地址進(jìn)行讀寫(xiě)操作。1.RAM位帶操作宏定義
#defineBITBAND_RAM(RAM, BIT) (*((uint32_t volatile*)(0x22000000u + (((uint32_t)&(RAM) - (uint32_t)0x20000000u)<<5) + (((uint32_t)(BIT))<<2))))2.外設(shè)寄存器位帶宏定義
#defineBITBAND_REG(REG, BIT) (*((uint32_t volatile*)(0x42000000u + (((uint32_t)&(REG) - (uint32_t)0x40000000u)<<5) + (((uint32_t)(BIT))<<2))))方便大家對(duì)比,給一個(gè)截圖:
A.RAM地址0x20001000的Bit1位寫(xiě)0
BITBAND_RAM(*(uint32_t *)0x20001000, 1) = 0;
B.讀取RAM地址0x20001000的Bit1位
uint8_t Val;
Val=BITBAND_RAM(*(uint32_t *)0x20001000, 1);
C.對(duì)PA1數(shù)據(jù)輸出寄存器輸出1
BITBAND_REG(GPIOA->ODR, 1) = 1;
D.讀取PA1數(shù)據(jù)輸出寄存器
uint8_t Val;
Val=BITBAND_REG(GPIOA->ODR, 1);
這里就是操作某一個(gè)地址,類(lèi)似于操作指針一樣;
五、位帶操作優(yōu)缺點(diǎn)
1.優(yōu)點(diǎn)
相比直接操作寄存器代碼更簡(jiǎn)潔,運(yùn)行效率更高。避免在多任務(wù),或中斷時(shí)出現(xiàn)紊亂等。2.缺點(diǎn)
操作不當(dāng)(傳入地址參數(shù)不對(duì)),容易出現(xiàn)總線Fault。
六、說(shuō)明
關(guān)于Cortex-M3的位帶操作,詳情可以參看Cortex-M3技術(shù)參考手冊(cè)(權(quán)威指南)。 我了解Cortex-M處理器中,Cortex-M3、Cortex-M4都具有位帶操作,Cortex-M0,Cortex-M+好像不支持。具體可以下載相關(guān)的技術(shù)參考手冊(cè)查看。 原文標(biāo)題:快速理解STM32位帶操作原理和用途文章出處:【微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
STM32
+關(guān)注
關(guān)注
2289文章
11011瀏覽量
362302
原文標(biāo)題:快速理解STM32位帶操作原理和用途
文章出處:【微信號(hào):strongerHuang,微信公眾號(hào):strongerHuang】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
一文講清:PWMV2快速入門(mén)

液位變送器工作原理解析
STM32WB55RG開(kāi)發(fā)(2)----STM32CubeProgrammer燒錄

STM32H503開(kāi)發(fā)(2)----STM32CubeProgrammer燒錄

stm32 GPIO中斷配置教程
工業(yè)智能網(wǎng)關(guān)快速接入移動(dòng)OneNET平臺(tái)配置操作

氧化鋅避雷器直流參數(shù)測(cè)試儀的使用方法——每日了解電力知識(shí)

LM98725高性能16位81 MSPS信號(hào)處理解決方案

STM32H743系列支持位帶操作嗎?
請(qǐng)問(wèn)一下ESP8266有沒(méi)有位操作或者位帶的功能?
RA6T2的16位模數(shù)轉(zhuǎn)換器操作 [13] 運(yùn)行應(yīng)用項(xiàng)目
![RA6T2的16<b class='flag-5'>位</b>模數(shù)轉(zhuǎn)換器<b class='flag-5'>操作</b> [13] 運(yùn)行應(yīng)用項(xiàng)目](https://file1.elecfans.com/web2/M00/BB/1B/wKgZomWXtb6ACk_NAAARMuEl9ZA261.png)
RA6T2的16位模數(shù)轉(zhuǎn)換器操作 [12] 應(yīng)用項(xiàng)目簡(jiǎn)介
![RA6T2的16<b class='flag-5'>位</b>模數(shù)轉(zhuǎn)換器<b class='flag-5'>操作</b> [12] 應(yīng)用項(xiàng)目簡(jiǎn)介](https://file1.elecfans.com/web2/M00/BB/1B/wKgZomWXtb6ACk_NAAARMuEl9ZA261.png)
大語(yǔ)言模型(LLM)快速理解

評(píng)論