
說到位帶操作,可能很多人比較陌生,但說到控制IO,你肯定不會陌生。有的項目為了最大效率控制IO,使用位帶操作。下面就來簡單說說位帶操作的內容。
一、初識位帶操作


這兩個1MB將分別映射到另外兩個地址區域:
1.SRAM區的最低1MB(0x2000 0000 --- 0x200F FFFF) 映射到(0x2200 0000 --- 0x23FF FFFF)。
2.片內外設區的最低1MB(0x4000 0000 --- 0x400F FFFF)映射到(0x4200 0000 --- 0x43FF FFFF)。

提示:看圖中的有顏色的8Bit,它是映射到偏移0x0200 0000外的32Bit(4Byte)空間上。我們讀寫0x2200 0000這個地址,其實就是操作0x2000 0000中的Bit0位。
解釋上面多處出現的關鍵詞
位帶區:支持位帶操作的地址區;
位帶別名:對別名地址的訪問最終作用到位帶區的訪問上。
三、位帶區->別名區計算公式
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;
四、代碼實現
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);
這里就是操作某一個地址,類似于操作指針一樣;
五、位帶操作優缺點
1.優點
2.缺點
操作不當(傳入地址參數不對),容易出現總線Fault。
六、說明

1.芯師爺|2020硬核中國芯 重磅啟動!
2.【直播福利+預告】第三期“嵌入式與物聯網開發技術”線上分享即將開始啦~
3.使用ZYNQ實現復雜嵌入式系統,真的好用!
4.工業互聯網:嵌入式系統的機遇和挑戰
5.余承東簽發內部文件:華為要造屏幕芯片!
6.RTOS是如何實現多任務的?

免責聲明:本文系網絡轉載,版權歸原作者所有。如涉及作品版權問題,請與我們聯系,我們將根據您提供的版權證明材料確認版權并支付稿酬或者刪除內容。