将浮点值存储在uint32_t指针中

时间:2017-01-15 12:22:03

标签: 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;
}

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

这是我的浮动数据:

    float value = 1.25;
    uint32_t framPtr = 0xD000;

使用此功能,它无法正常工作:

void FRAM_write_float(float value,
                      uint32_t *framPtr)
{
    *framPtr++ = (float)value;
}

它将数据 1.40129846e-45(DEN)(HEX:0x00000001)保存在我的存储库中。

我希望有人可以帮我解决问题。 的谢谢!

1 个答案:

答案 0 :(得分:3)

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

float f = /* some_val */;
uint32_t fbits = 0;
memcpy(&fbits, &f, sizeof fbits);

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

如果您的编译器支持C99及更高版本。你也可以通过工会来打字。

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

// use pun.to

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

1 :如果您的编译器支持它,您可能应该_Static_assert