位带操作原理

博客介绍了位带操作,即把每个比特膨胀为32位的字,通过访问映射地址来访问比特,改写寄存器某一位只需改写其映射地址。还提及sys.h里对GPIO输入输出部分功能实现位带操作,并给出跑马灯实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

把每个比特膨胀(映射)为一个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);
    }
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值