zoukankan      html  css  js  c++  java
  • 【转】位带操作的原理及使用

    位带操作原理

    把每个比特膨胀(映射)为一个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
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    ionic localstorage
    angular 中文鏈接
    把jqmobi 變成jQuery 的插件 從此使用jQuery
    jqmobi 的一些設置
    ionic ngcordova map 地圖
    ionic pull to refresh 下拉更新頁面
    json 對象的序列化
    鍵盤彈出,頁面佈局被推上去了.....
    Cordova V3.0.0中config.xml配置文件的iOS Configuration
    android ios 只能輸入數字 不能輸入小數點的 函數 cordova
  • 原文地址:https://www.cnblogs.com/zhangbing12304/p/11255567.html
Copyright © 2011-2022 走看看