STM32中的位变量实现

本文介绍如何在C语言中使用位操作和Bit Banging技术优化内存使用及提高访问速度。通过实例展示了如何将多个bit型变量合并到一个字节中,并利用Bit Banging快速访问特定位,适用于定时中断等场景。

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

1bit

注意每个变量后面有个:1表示占用几个bit, 查查c语言的语法书就知道了.
一般排在前面的变量在字节中的低位.(不同系统的编译器可能会不同)

补充: 如果有很多零散的bit型变量也可以合并到一个字节中:
struct{
  u32 var1:1;
  u32 var2:1;
  ...
}VarName;

如果在循环或者中断里要求快速访问某个bit, 可以用bit banding.地址换算:
SRAM_BB_BASE + ((addr-SRAM_BASE)*32) + (bit*4))
其中SRAM_BB_BASE/SRAM_BASE在3.0的库里面有定义的
可以将多个需要快速访问的bit合到一个32bit word里, 其地址可以用&得到, 换算出其中一个bit的地址然后赋给一个u32型的指针就行了. 具体原理请查手册.

对于外设寄存器的位也可以用这种方法, 换算公式:
PERIPH_BB_BASE + (addr-PERIPH_BASE)*32 + (bit)*4. 这个我有现成的例子, q我有8个按键接在GPIOB上, 
每个按键的位地址定义到一个数组里: 
u32 KeyIO[]={
    BB_Periph_addr((GPIOB_BASE+8),6),//GPIOB_6
    BB_Periph_addr((GPIOB_BASE+8),7),//GPIOB_7
    BB_Periph_addr((GPIOB_BASE+8),8),
    BB_Periph_addr((GPIOB_BASE+8),9),
    BB_Periph_addr((GPIOB_BASE+8),12),
    BB_Periph_addr((GPIOB_BASE+8),13),
    BB_Periph_addr((GPIOB_BASE+8),14),
    BB_Periph_addr((GPIOB_BASE+8),15),
};
注GPIOB_BASE+8是&GPIOB->IDR, 前者是常量, 可以赋初值, 后者是取地址,不能用来赋初值. 

在定时中断中读按键:
    for(i=0;i<8;i++) {
        pKeyIO=(volatile u32 *)KeyIO;//按键的位地址
        if (*pKeyIO==0){//有键压下
            .......
        }else{//无键压下
            ......
        }

我这个方案也没有加快多少速度, 只是试验了一下bit banding, 然后也懒得再优化了. 通常直接用(GPIOB->IDR & KEYx_MASK)来判断也就行了.

方法是活的, 看自己怎么选择就是了.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值