问答

汇集网友智慧,解决技术难题

21ic问答首页 - 使用flash读写float类型数据时,遇到的问题

使用flash读写float类型数据时,遇到的问题

ylmting2023-01-16
读写flash,将float类型的数据存放在flash中,
使用的是联合体操作
union var
{
        float zero_angle;
        uint32_t s;
};  


#define FMC_WRITE_START_ADDR    ((uint32_t)0x08004000U)
void write_page(uint32_t data)
{
        fmc_unlock();
        fmc_page_erase(FMC_WRITE_START_ADDR);
        fmc_word_program(FMC_WRITE_START_ADDR,data);
        fmc_lock();
}

//获取float类型的数据
flo_flash.zero_angle = AS5600_ReadAngle(0x0c,0x0d);
//将数据写入flash
write_page(flo_flash.s);

//读取数据
flo_flash.s = (*(volatile uint32_t *)(uint32_t)(FMC_WRITE_START_ADDR));

以上操作,在没有进行下一步的时候都没问题。

使用printf函数重定向 打印浮点型数据就会将flash的数据给影响到,
里面的数据就会变成一个不确定的数值,且非常小。
printf("%f\n",a);

但是printf 其他类型的数据,就不会受到影响。
回答 +关注 15
6441人浏览 9人回答问题 分享 举报
9 个回答
  • ylmting 发表于 2023-2-20 10:59
    哦哦~谢谢,还有这种方法,我去查查

    MDK下的话const u32 data __attribute__((section(".ARM.__AT_0x08004000"))) = 0xXXXX;
    我是感觉可以的
  • sagade 发表于 2023-2-17 18:29
    直接指定在某个地址存储这个float,编译器就不会在这个地址弄上程序段了,不然哪怕移到6000是不是还是有隐 ...

    哦哦~谢谢,还有这种方法,我去查查
  • 直接指定在某个地址存储这个float,编译器就不会在这个地址弄上程序段了,不然哪怕移到6000是不是还是有隐患
  • 程序没啥问题,问题出在存储的位置,被程序段覆盖了。我把存储的位置从0x0800 4000 移到 6000 再也没出现问题。
    还是得注意存在系统flash的数据不要太靠前了  
  • 感谢感谢各位,剩下的问题我查询清楚了再来说说。
  • 本帖最后由 timerc 于 2023-1-17 09:24 编辑

    flo_flash.s = (*(volatile uint32_t *)(uint32_t)(FMC_WRITE_START_ADDR));
    这个读取的是个整数吧,然后你把他强制转换成float会不会有问题啊,
    读取完flo_flash.s后,直接打印printf("%f",flo_flash.zero_angle);试试看,不要去强制转换
    运行结果:

    ylmting 2023-1-17 10:38 回复TA
    #define PWM_PERIOD_COUNT ((48000000/((0)+1)/12000)/2)-1 带入后pwm_out = 120*100.0/((48000000/((0)+1)/12000)/2)-1 就会出错,后面宏定义的加个括号就可以了, 不过为何这个float参数的计算会影响到我写入到flash里面的数值,还要进一步去了解。 以及为何之前的 那块板子打印一个普通的float也会改写的原因还要去查一下,有结果了再来说说。 
    ylmting 2023-1-17 10:34 回复TA
    今天早上重新换了个板子测试了一下,发现别的float类型也不会受到影响了,正当我怀疑另一块板子是不是存放float类型的寄存器出了问题,然后又一个个之前打印的float类型的数据,发现都能打印了,但是到了一个有一个数的时候,突然坏了,重新看了一下那个数,pwm_out = pwm_not_filter *100.0/PWM_PERIOD_COUNT 发现是这个宏定义的问题,,哎~~,宏定义带计算的一定要记得加括号啊... 
    ylmting 2023-1-17 10:32 回复TA
    只打印printf("%f",flo_flash.zero_angle); 这个是没问题的,结果跟我debug的数据一样。 但是打印别的float类型数据的话,我写入这个flash里面的数据就会被更改 我一开始以为是printf函数重定向的影响,因为之前出现过使用printf还有写入flash一起就会卡住的情况。但是别的数据类型都没问题,写入flash的数据也不被修改 
  • 强制类型转换写起来简单。定义union对于老手来说看起来比较啰嗦,但实际上并没有增加代码量,编译器聪明着呢。
  • 我都是直接强制类型转换,操作简单。
  • a是什么?做强制类型转换试试
    ylmting 2023-1-16 11:41 回复TA
    a是用作测试的float类型,我测试了字符串还有各种类型的数据,发现就只有float类型的会影响 

您需要登录后才可以回复 登录 | 注册