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
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    struts学习struts.xml
    ie6 7中span右浮动折行问题解决
    java中的overload,override
    java中的专业术语POJO(转)
    javascript中","的作用
    线程和进程的区别(转)
    java学习servlet/filter/listener/interceptor区别与联系(转)
    struts 2.3.8中可能导致上传文件时获取不到文件信息的错误原因
    java中enum的使用(转载)
    什么叫面向接口编程以及面向接口编程的好处
  • 原文地址:https://www.cnblogs.com/zhangbing12304/p/11255567.html
Copyright © 2011-2022 走看看