This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430FR6889:如何存储24位变量?

Guru**** 2378650 points
Other Parts Discussed in Thread: MSP430FR6889
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1127165/msp430fr6889-how-to-store-a-24-bit-variable

器件型号:MSP430FR6889

您好!

我是 MSP430FR6889和 BMI160传感器。 BMI160具有24位定时器计数器(BMI 数据表 第53页)。  

我正在尝试存储此数据、但不确定我是否 遵循了正确的程序。

我已经编写了一个 I2C 函数、该函数可以访问 I2C 从器件并从地址开始读取、然后读取到指定的字节数。

I2C_Master_ReadReg(SLAVE_ADDR, 0x18, 3);  //(slave address, Start register address, how many bytes to read)

然后、我尝试将数据存储到变量中、但 MSP430正在向我展示以下内容:"64-D 移位计数太大"。  

这是代码的那一部分:

    uint32_t SENSORTIME;
    uint8_t time_0 = 0;
    uint16_t time_1 = 0;
    uint32_t time_2 = 0;
    
    time_0 = ReceiveBuffer[0];
    time_1 = (uint16_t)(ReceiveBuffer[1] << 8);
    time_2 = (uint32_t)(ReceiveBuffer[2] << 16);
    SENSORTIME = (uint32_t)(time_2 | time_1 | time_0);

我想我知道我在这里做错了什么。 MSP430不是32位 MCU。 是否有关于如何执行此操作的建议?

谢谢你。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您需要在执行移位之前转换值、而不是在之后转换值。 除非您需要它们、否则我会放弃中间变量并使用类似如下的内容:

    > SENSORTIME =((uint32_t) ReceiveBuffer[2]<< 16)|((uint32_t) ReceiveBuffer[1]<< 8)|((uint32_t) ReceiveBuffer[0]< 0);//重构值(小端字节序)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    或者、您也可以通过使用 UNION 来避免这些缓慢的移位。 这种情况不易移植(不可能是问题)、需要对整数的存储方式有很好的了解。