【轉】位帶操作的原理及使用


位帶操作原理

把每個比特膨脹(映射)為一個32位的字,當訪問這些字的時候就達到了訪問比特的目的,比如說BSRR寄存器有32個位,那么可以映射到32個地址上,我們去訪問(讀-改-寫)這32個地址就達到訪問32個比特的目的。

即如果要改寫某個寄存器的某一位,通過改寫這一位映射的地址即可

 
原理圖1

 
 
原理圖2

 
映射對應關系圖

位帶操作的優越性

 
 

例子

sys.h里面對GPIO輸入輸出部分功能實現了位帶操作:

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum)) //IO口地址映射 #define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOF_ODR_Addr (GPIOF_BASE+12) //0x40011A0C #define GPIOG_ODR_Addr (GPIOG_BASE+12) //0x40011E0C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 #define GPIOG_IDR_Addr (GPIOG_BASE+8) //0x40011E08 //IO口操作,只對單一的IO口! //確保n的值小於16! #define PAout(n) BIT_ADDR(GPIOA_ODR_Addr,n) //輸出 #define PAin(n) BIT_ADDR(GPIOA_IDR_Addr,n) //輸入 #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //輸出 #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //輸入 … #define PFout(n) BIT_ADDR(GPIOF_ODR_Addr,n) //輸出 #define PFin(n) BIT_ADDR(GPIOF_IDR_Addr,n) //輸入 #define PGout(n) BIT_ADDR(GPIOG_ODR_Addr,n) //輸出 #define PGin(n) BIT_ADDR(GPIOG_IDR_Addr,n) //輸入 

輸出:(操作ODR寄存器)
BIT_ADDR可以理解為是一個映射關系,用過寫PAout(n)=1,即往它映射的地址寫1

輸入:(操作IDR寄存器)
同上

跑馬燈實例

 int main(void) { delay_init(); //延時函數初始化 LED_Init(); //初始化與LED連接的硬件接口 while(1) { PAout(8)=1; //LED0輸出低 PDout(2)=0;//LED1輸出高 delay_ms(500); PAout(8)=0;//LED0輸出高 PDout(2)=1;//LED1輸出低 delay_ms(500); } } 



作者:GODD6
鏈接:https://www.jianshu.com/p/030b8d427d18
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM