嵌入式里面最难的是什么?我想不是初始化,也不是一个逻辑,而是使用位运算来处理数据。
还有什么?对寄存器的设置,某一位,连着好几个,等等的。
我以前一直不知道这个寄存器的概念到底在哪里?
直到,昨天看了一晚上的数字电路的教程,救命,原来这么多内容这么系统,科班出生可能就这点好了,虽然没学会,但是也是系统的学到了知识。
看的这个版本,一板一眼的,硬死了
其实这个描述也极其的少,让我再补充一点吧!
一个寄存器可以看作是一个由多个触发器组成的存储单元。每个触发器可以存储一位二进制数据(0或1)。
寄存器的位数决定了它能存储数据的范围。例如,一个8位寄存器可以存储0到255之间的整数。
寄存器 是计算机处理器内部用来临时存储数据的存储单元。你可以把它想象成计算机大脑中的一个小小抽屉,用来存放一些常用的数据,比如要进行运算的数字、指令的地址等等。
高速存储: 寄存器的存取速度非常快,远快于内存。这是因为寄存器距离CPU核心非常近,数据传输的路径短,延迟小。
临时存储: 寄存器用来存储CPU正在处理的数据,比如正在执行的指令、运算中的数据等。
控制单元: 一些寄存器还用于控制CPU的工作状态,比如程序计数器(PC)用来记录下一条指令的地址。
寄存器最本真的含义可能就是寄存两个字了
就是放一些东西
根据寄存器的用途,可以分为以下几种:
通用寄存器: 可以用来存储各种类型的数据,如整数、浮点数、地址等。
专用寄存器: 有特定的用途,如程序计数器(PC)、指令寄存器(IR)、栈指针寄存器(SP)等。
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)判断正负。
左移 (<<) 和按位或 (|) 是位操作中常用的组合,用于拼接高低字节。