在底层开发中我们经常需要对寄存器进行配置,通常我们并不需要对寄存器的全部位进行配置,只需要修改其中的几个位即可。
例如我们想要完成一个功能A,只需要将一个八位寄存器4-6位配置成110即可。如果生硬的将寄存器赋值为00 01 10 00 ,就会影响其他位。
那么这个时候我们该如何配置呢?
首先我们需要先掌握几个运算符:
&与运算:0&1=0,0&0=0,1&1=1;
| 或运算:0|0=0,1|0=1,1|1=1;
<<左移位运算:0x6<<2 就等同于 0110<<2 = 11000
知道了以上运算符的规则,现在我们需要将一个 XX XX XX XX的寄存器配置成XX 01 1X XX
不影响其他位的配置方法,需要将1和0分开来配置。
首先我们来配置1,XX XX XX XX 或运算 00 01 10 00 即可在不改变其他位的情况下将 4-5位配置成1
在实际代码中,我们可以这样来写:
volatile unsigned int* GPFSEL0=NULL; //volatile不会因编译器的优化而省略,每次直接读值
*GPFSEL0|=(0x6<<2);// 0x6左移动三位是11000,与GPFSEL0|=11000后即为XX X1 1X XX
这样原寄存器就被我们配置成了XX X1 1X XX
再来配置0,只需要将第六位配置成0即可,我们可以用XX XX XX XX 来 与运算 11 01 11 11,这样就只改变了第6位为0。
实际代码中我们可以这样写:
*GPFSEL0&=~(0x1<<5); //0x1<<5=100000,~为取反运算,运算后得到011111,GPFSEL0&=011111后得到
XX 0X XX XX
这样分开两次配置后我们就得到了想要的XX 01 1X XX。