我一直想把嵌入式学到精通,学到现在终于是有点感觉了。MCU永远离不开一个个寄存器的bit。而且对于数据来讲也是字节的流转。
我觉得嵌入式精通第一课应该是位运算。
我们对寄存器的操作其实就是两个:读,写。
这个东西就像勺子,把我们感兴趣的东西挖走
记忆:看见&就是读取位。
读取到ADC就绪,开始读取
清除其实是复杂的
最关键一步就是这个取反
记住这个开关的样子
就好像是开关的竖
置位,直接|
清除的步骤多,要与运算和掩码翻转
读取位为清除步骤的一半儿
请把这个刻在骨子里面。
我们还有一个是这样的
寄存器的操作是连续的,如果这个寄存器很大,我们一位一位的就不好了。可以先都清了,然后直接把值放进去。
(~Mask) 取反,生成一个 仅 Mask 指定位为 0,其余位为 1 的掩码 Reg & (~Mask) 先清零 Mask 指定的位 | (Value) 再用 Value 赋值
看这个ADC的看门狗功能
看
|是或运算,有1为1,所以也就是像加法。
通过 |(按位或)操作,将这两个掩码组合成一个掩码,表示要操作的位区域。
在这里
分了俩半了,各16位
看见了新的运算符号
我们假设这个值是这样的
ADC_WatchdogStruct->ADC_WatchdogVth << 16 // 结果:0x12340000
ADC_WatchdogStruct->ADC_WatchdogVtl // 结果:0x5678
(0x12340000 | 0x5678) // 结果:0x12345678
ADS1115
要发送两个字节的数据,先搞个数组:
regData[0] = data >> 8;
regData[1] = data & 0xFF;
data
的低 8 位,而高位部分由于与 0 相与,结果都为 0。data
的高 8 位进行与运算时,结果必定为 0。而 data
的低 8 位与 0xFF 的低 8 位进行与运算,则保留了原来的值。最后发个数组出去
通过这两个位运算操作,我们可以将一个 16 位的无符号整数拆分成两个 8 位的无符号整数,分别存储在 regData[0] 和 regData[1] 中。这在处理多字节数据时非常常见。
regData[0] = data >> 8;
regData[1] = data & 0xFF;
从MPU6050看传感器原始数据的处理方式-位运算 以往的位运算。