打印

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

[复制链接]
6453|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ylmting|  楼主 | 2023-1-16 10:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
读写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 其他类型的数据,就不会受到影响。

使用特权

评论回复
沙发
yeah200032| | 2023-1-16 10:53 | 只看该作者
a是什么?做强制类型转换试试

使用特权

评论回复
评论
ylmting 2023-1-16 11:41 回复TA
a是用作测试的float类型,我测试了字符串还有各种类型的数据,发现就只有float类型的会影响 
板凳
coody| | 2023-1-16 13:14 | 只看该作者
我都是直接强制类型转换,操作简单。

使用特权

评论回复
地板
R2D2| | 2023-1-17 01:16 | 只看该作者
强制类型转换写起来简单。定义union对于老手来说看起来比较啰嗦,但实际上并没有增加代码量,编译器聪明着呢。

使用特权

评论回复
5
timerc| | 2023-1-17 09:05 | 只看该作者
本帖最后由 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的数据也不被修改 
6
ylmting|  楼主 | 2023-1-17 10:38 | 只看该作者

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

感谢感谢各位,剩下的问题我查询清楚了再来说说。

使用特权

评论回复
7
ylmting|  楼主 | 2023-2-17 16:13 | 只看该作者
程序没啥问题,问题出在存储的位置,被程序段覆盖了。我把存储的位置从0x0800 4000 移到 6000 再也没出现问题。
还是得注意存在系统flash的数据不要太靠前了  

使用特权

评论回复
8
sagade| | 2023-2-17 18:29 | 只看该作者
直接指定在某个地址存储这个float,编译器就不会在这个地址弄上程序段了,不然哪怕移到6000是不是还是有隐患

使用特权

评论回复
9
ylmting|  楼主 | 2023-2-20 10:59 | 只看该作者
sagade 发表于 2023-2-17 18:29
直接指定在某个地址存储这个float,编译器就不会在这个地址弄上程序段了,不然哪怕移到6000是不是还是有隐 ...

哦哦~谢谢,还有这种方法,我去查查

使用特权

评论回复
10
sagade| | 2023-2-20 15:24 | 只看该作者
ylmting 发表于 2023-2-20 10:59
哦哦~谢谢,还有这种方法,我去查查

MDK下的话const u32 data __attribute__((section(".ARM.__AT_0x08004000"))) = 0xXXXX;
我是感觉可以的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

13

帖子

0

粉丝