51单片机是8位的,寄存器有8位,每一位都代表不同的含义;STM32单片机是32位的,寄存器也是32位的,每一位也有不同的含义。在配置寄存器时,同一个寄存器会用到多次,如果直接赋值而不用“与”、“或”会发生什么情况呢?下面分析一下。
为什么要用逻辑“与”、逻辑“或”赋值
在操作寄存器时,可能需要对同一个寄存器要配置多次,如果每次都要直接赋值的话,最后的赋值会把前面的赋值覆盖掉,这样程序就无法实现应有的功能了。所以,为了不改变前面的设置,通常会用逻辑“与”、逻辑“或”来赋值
如何用逻辑“或”给寄存器赋值
逻辑或的特性是,有1输入即输出1;全0输入时才输出0。所以,可以看出,如果要不改变某一位的值的话,可以用0与其做或运算。
所以,在设置寄存器时,如果要将某一位置1,而将其他位保持不变的话,可以将该位和1作或运算,比如下面的语句:
GPIOA->CRH|=0X00000003;//低两位置1
上面的语句就是将低两位设置为了11,而其他位保持不变。
如何用逻辑“与”给寄存器赋值
逻辑与的特性是,有0输入即输出0;全1输入时才输出1。可以看出,如果要不改变某一位的值的话,可以用1与其做与运算。如下图所示:
所以,在设置寄存器时,如果要将某一位清零,而将其他位保持不变的话,可以将该位和0作与运算,比如下面的语句:
GPIOA->CRH&=0XFFFFFFF0;//低两位清零
上面的语句就是将低两位设置为了00,而其他位保持不变。
由上可知,合理的运用逻辑与、逻辑或运算可以其到只改变某几位,而不影响其他位的目的,并且可以大大提高到编写代码的效率。