03.06 单片机中操控特殊寄存器时,为什么用“或”、“与”而不是直接16进制赋值?

无牌名biao


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,而其他位保持不变。

由上可知,合理的运用逻辑与、逻辑或运算可以其到只改变某几位,而不影响其他位的目的,并且可以大大提高到编写代码的效率。

以上就是这个问题的回答,感谢留言、评论、转发。更多精彩内容请关注本头条号:玩转嵌入式。感谢大家。


玩转嵌入式


最主要怕把不想动的位给改了。


MyJPXF


为了不影响其他位的状态


陪我闯荡


问这样的问题,肯定硬件基础不太好。单片机硬件,情况太多了。有些寄存器是只能写不能读的,有些是只能读不能写的。还有些保留位不能被改变的。。。更有读和写的含义是不同的。比如有些硬件功能是靠写寄存器启动的。。。按技术文档来操作寄存器就可以了。非要搞清楚,大公司产品技术文档中会有交代的。


GPS跟踪器LED大灯


不要扯一堆乱七八糟的,最根本的原因是寄存器的每个位都有不同的功能,而c语言通常无法直接访问某一位,而必须把一个寄存器当作单元进行读取(只读只写位先不管),通过与或改变其中的某些位,然后再写回去。如果单片机将寄存器的位映射到了字节单元地址中,就可以通过对映射地址单元写0写1去改变修改了,这时可以没有与或操作,但每次仅修改一位对于连续修改多个位的操作是相当麻烦的。


just_仰望星空


cpu能操作的最小状态单位是字节,对于字节中的位进行操作,只能通过位运算来操作。


用户72565784349


这应该是只改变其中的某一位或某几位的情况吧


徐君93794277


直接赋值,慢。更重要的是逻辑操作有规律,代码更简洁。


科里嘛匝


很多时候,不同的IO口有不同的用途,直接赋值会改变IO口的其他功能。


分享到:


相關文章: