嵌入式里面最难的是什么?我想不是初始化,也不是一个逻辑,而是使用位运算来处理数据。
还有什么?对寄存器的设置,某一位,连着好几个,等等的。
我以前一直不知道这个寄存器的概念到底在哪里?
直到,昨天看了一晚上的数字电路的教程,救命,原来这么多内容这么系统,科班出生可能就这点好了,虽然没学会,但是也是系统的学到了知识。

看的这个版本,一板一眼的,硬死了

其实这个描述也极其的少,让我再补充一点吧!
一个寄存器可以看作是一个由多个触发器组成的存储单元。每个触发器可以存储一位二进制数据(0或1)。
寄存器的位数决定了它能存储数据的范围。例如,一个8位寄存器可以存储0到255之间的整数。
寄存器 是计算机处理器内部用来临时存储数据的存储单元。你可以把它想象成计算机大脑中的一个小小抽屉,用来存放一些常用的数据,比如要进行运算的数字、指令的地址等等。

寄存器最本真的含义可能就是寄存两个字了

就是放一些东西
根据寄存器的用途,可以分为以下几种:
OK~我们来看一个人人皆知的器件MPU6050:

6个ADC的数据存到这个传感器寄存器里面,接着到IIC里面,传出去。

以及这个器件也可以在级联一个IIC的输入,Bypass IIC-旁路IIC

这个就是需要读取的地方,可以看着连在一起

来看一个ACC的

重力加速度的参数范围

3个16位来描述

好,我偷的
接下来看代码:

不管如何设置,我们最终就要获得这6个轴的数据
在代码中:
(MPU6050_Raw_Data[x] << 8) | MPU6050_Raw_Data[y])
的位运算用于将从MPU6050读取的两字节数据组合成一个16位的有符号整数值。
这是因为MPU6050的加速度计和陀螺仪数据是以16位的格式存储的,每个测量值分为高字节和低字节,分别存储在两个连续的寄存器中。
(MPU6050_Raw_Data[x] << 8)将高字节左移8位。将高字节放到16位数据的高8位位置。箭头就是移动方向,往高处放,挪8下。
假设高字节 MPU6050_Raw_Data[x] = 0x1A,二进制为 00011010。左移 8 位后,结果为 00011010 00000000,即 0x1A00。
16位数据 = (高字节 << 8) | 低字节<< 8 (左移操作)将高字节的值左移8位,为低字节腾出位置。
将高字节放到16位整数的高8位。高字节 0x1A 左移 8 位后:0x1A << 8 = 0x1A00
<< 就是移动的意思,就好像移动格子一样,把靠左的东西移动到右边。现在就是16位的格子,满了8个,右边还剩8个,怎么办呢?就是或运算吧。
| MPU6050_Raw_Data[y]通过按位或操作,将低字节合并到高字节后面。
组合高字节和低字节形成完整的16位数据。移动了
假设低字节 MPU6050_Raw_Data[y] = 0x2B,二进制为 00101011。高字节左移后的结果为 0x1A00,低字节为 0x002B。按位或操作:0x1A00 | 0x002B = 0x1A2B。
| (按位或操作),将低字节合并到高字节之后。将高字节和低字节拼接成一个完整的16位数据。
高字节结果 0x1A00 和低字节 0x002B 进行按位或操作:0x1A00 | 0x002B = 0x1A2B
组合后的16位值是一个有符号整数。在读取时,需要根据最高位(符号位,bit 15)判断正负。
左移 (<<) 和按位或 (|) 是位操作中常用的组合,用于拼接高低字节。
