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 其他类型的数据,就不会受到影响。
使用的是联合体操作
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 其他类型的数据,就不会受到影响。
赞0
MDK下的话const u32 data __attribute__((section(".ARM.__AT_0x08004000"))) = 0xXXXX;
我是感觉可以的
评论
2023-02-20
赞0
哦哦~谢谢,还有这种方法,我去查查
评论
2023-02-20
赞0
评论
2023-02-17
赞0
还是得注意存在系统flash的数据不要太靠前了
评论
2023-02-17
赞0
评论
2023-01-17
赞1
flo_flash.s = (*(volatile uint32_t *)(uint32_t)(FMC_WRITE_START_ADDR));
这个读取的是个整数吧,然后你把他强制转换成float会不会有问题啊,
读取完flo_flash.s后,直接打印printf("%f",flo_flash.zero_angle);试试看,不要去强制转换
1630363c5f885564b1.png (25.44 KB )
下载附件
2023-1-17 09:23 上传
运行结果:
910363c5f8be068f1.png (1.56 KB )
下载附件
2023-1-17 09:24 上传
评论
2023-01-17
#define PWM_PERIOD_COUNT ((48000000/((0)+1)/12000)/2)-1 带入后pwm_out = 120*100.0/((48000000/((0)+1)/12000)/2)-1 就会出错,后面宏定义的加个括号就可以了, 不过为何这个float参数的计算会影响到我写入到flash里面的数值,还要进一步去了解。 以及为何之前的 那块板子打印一个普通的float也会改写的原因还要去查一下,有结果了再来说说。
今天早上重新换了个板子测试了一下,发现别的float类型也不会受到影响了,正当我怀疑另一块板子是不是存放float类型的寄存器出了问题,然后又一个个之前打印的float类型的数据,发现都能打印了,但是到了一个有一个数的时候,突然坏了,重新看了一下那个数,pwm_out = pwm_not_filter *100.0/PWM_PERIOD_COUNT 发现是这个宏定义的问题,,哎~~,宏定义带计算的一定要记得加括号啊...
只打印printf("%f",flo_flash.zero_angle); 这个是没问题的,结果跟我debug的数据一样。 但是打印别的float类型数据的话,我写入这个flash里面的数据就会被更改 我一开始以为是printf函数重定向的影响,因为之前出现过使用printf还有写入flash一起就会卡住的情况。但是别的数据类型都没问题,写入flash的数据也不被修改
赞1
评论
2023-01-17
赞1
评论
2023-01-16
赞1
评论
2023-01-16
a是用作测试的float类型,我测试了字符串还有各种类型的数据,发现就只有float类型的会影响
您需要登录后才可以回复 登录 | 注册