STM32 寄存器位操作详解

在对STM32寄存器操作时,我们经常会对寄存器的某一位或几位进行修改并且保持其他位不变,这时候就会用到C语言的位操作方法。那么如何进行位操作,以及位操作的原理是什么呢?话不多说直接开冲:

1、把变量的某位清零

//先定义一个随机变量a
unsigned char a = 0x9f;
//对bit2位进行清零操作
a &= ~(1 << 2);

首先,随便给一个变量,为了跟32的代码接近点,我们也用16进制,然后0x9f就是1001 1111 b(二进制)
要求对bit2位清零,也就是说要将1001 1111变成1001 1011。这里注意一下,bit位是从0开始的,bit2是倒数第三位,别搞错了。
然后就是重点了,怎么理解 a &= ~(1<<2)呢?
第一步,先看括号里的,1左移两位,得到一个二进制数:0000 0100 b
第二步,~是一个取反符号,我们对(1<<2)取反就可以得到1111 1011 b
第三步,a &= 1111 1011可以拆分为:a = (1001 1111 b)&(1111 1011)
经过与运算之后 a = 1001 1011 b,这就完成了我们的目的,对bit2位清零,同时不改变其他位。

2、 把变量的连续几位清零

将a中的bit2和bit3位清零。


a &= ~(3<<2*1);    // a &= ~(数值<<每组位数*组编号)

如果想要对a中的连续几位进行操作,首先要将二进制位分组,在这里我们将其按照两个位一组的方式进行分组,也就是bit0bit1为第0组,bit2bit3为第1组,bit4bit5为第2组,bit6bit7为第3组。现在我们想要对bit2,bit3位清零,也就是对第1组进行清零。感兴趣的可以思考一下为什么要分组这个问题,因为我们马上就会用到。

3的二进制为:0011
(3<<21)我们现在将其左移两位得到 0000 1100 b
~(3<<2
1)得到 —————————>1111 0011 b
在对a做位与运算 a = (1001 1111 b)&(1111 0011 b)=1001 0011 b

在这里大家可能有点懵的点在于括号里的321都是个啥?一个一个来解释:
这里的"1"就是我们刚才分的组号,如果想要清除第3组bit6bit7,那么将这里的1换成3即可。"2"是每组的位数,每组有两个二进制位,如果我们在分组的时候分成4个一组,那么这里就是4。"3"是我们的一组两个数二进制表示 11 时的值,如果是一组4个,此处就是二进制数1111 b了。
在这里插入图片描述
大家可以用上面的方法自己试试对第二组bit4bit5进行清零操作,答案在最后。

3、对变量的某一位进行赋值操作

这个比较简单,直接往位上写就可以了:

//a = 1001 0011 b
a |= (1<<3);
//a = 1001 1011 b

4、对变量的某几位进行赋值操作

寄存器在经过清零操作之后,就可以很方便的在某几位写入所需要的数值且保持其他位不变,这时候写入的数值一般就是需要设置的寄存器位参数了。

//假设a = 1000 0011 b,将第二组bit4bit5设置成二进制数 01 b
a |= (1<<2*2);

5、对某位进行取反操作

//a = 1001 0011 b 对bit6位进行取反
a ^= (1<<6);
//a = 1101 0011 b

最后是之前留下的小问题:a &= ~(3<<2*2);

猜你喜欢

转载自blog.csdn.net/qq_36535414/article/details/115074898