将浮点值存储在 uint32_t 指针中

Pan*_*sch 3 c msp430

我想在我的 TI MSP430 微控制器的 FRAM 寄存器中存储一些浮点数据并且有一些问题。

我不知道我怎么能做到这一点。

使用普通整数变量没有问题。

普通整数变量:

void main()
{
    uint32_t value = 25;
    uint32_t framPtr = 0xD000;

    FRAMC_write_uint32_t(value, (uint32_t*)framPtr);
}

void FRAMC_write_uint32_t(uint32_t value,
                          uint32_t *framPtr)
{
    *framPtr = value;
}
Run Code Online (Sandbox Code Playgroud)

但是对于浮点值它不起作用。我试图将函数内的值更改为浮动,但没有结果。

这是我的浮动数据:

    float value = 1.25;
    uint32_t framPtr = 0xD000;
Run Code Online (Sandbox Code Playgroud)

使用此功能不起作用:

void FRAM_write_float(float value,
                      uint32_t *framPtr)
{
    *framPtr++ = (float)value;
}
Run Code Online (Sandbox Code Playgroud)

它在我的记忆库中保存了数据1.40129846e-45 (DEN) (HEX: 0x00000001)

我希望有人能帮助我解决我的问题。 谢谢!

Sto*_*ica 7

重新解释这些位的最简单方法是使用memcpy,如果您知道sizeof(float) == sizeof(uint32_t) 1

float f = /* some_val */;
uint32_t fbits = 0;
memcpy(&fbits, &f, sizeof fbits);
Run Code Online (Sandbox Code Playgroud)

应该足够安全,因为无符号整数通常没有陷阱值。

如果您的编译器支持 C99 及更高版本。您还可以通过联合进行类型双关。

union {
  float    from;
  uint32_t to;
} pun = { .from = /*some val*/ };

// use pun.to
Run Code Online (Sandbox Code Playgroud)

以上实际上并没有复制任何内容,因此在紧密循环中可能会稍微快一点。(正如Olaf指出的,这是现代 C标准兼容方式)。


1 : 如果你的编译器支持它,你可能应该_Static_assert使用它。