你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103的flash存储float变量,读取时只有整数部分

[复制链接]
那就地方 提问时间:2015-10-8 15:12 /
5ST金币
        用STM32F103VET6flash存储float变量,读取时只有整数部分。代码如下:往flash写13.12,读出来DATAW[0]显示13.0。解决送ST金币!

#define FLASH_PAGE_SIZE         ((uint32_t)0x00000800)   /* FLASH Page Size */
#define FLASH_USER_START_ADDR   ((uint32_t)0x0803F800)   /* Start @ of user Flash area */
#define FLASH_USER_END_ADDR     ((uint32_t)0x0803FFFF)   /* End @ of user Flash area */

void Save_factory_parameter()
{
  uint32_t Addr = FLASH_USER_START_ADDR , i;        //FLASH_USER_START_ADDR的地址留给出厂值设置标志位用的
  FLASH_Unlock();
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
  while( FLASH_ErasePage(FLASH_USER_START_ADDR ) != FLASH_COMPLETE );
  while( FLASH_ProgramWord( Addr , 13.12 ) != FLASH_COMPLETE ) ;
  FLASH_Lock();
}

void Read_factory_parameter()
{
  uint32_t Addr = FLASH_USER_START_ADDR ;

  DATAW[0] = *(__IO uint32_t *)Addr;
}

最佳答案

查看完整内容

虽然float和int在内存中都占用4个字节,但是你在调用 FLASH_ProgramWord( Addr , 13.12 )的时候,编译器会把13.12转换成整数13。 要想写入float 13.12,你得定义一个float变量。 伪代码演示: float f = 13.12; FLASH_ProgramWord( Addr , *((uint32_t*)&f )) //这样就把内存的4个字节写入到FLASH中。 读的时候是相反的过程。读出是一个整数,然后转换成float型的指针,读出float值。 ...
1 收藏 3 评论21 发布时间:2015-10-8 15:12

举报

21个回答
党国特派员 最优答案 回答时间:2015-10-8 15:12:09
虽然float和int在内存中都占用4个字节,但是你在调用 FLASH_ProgramWord( Addr , 13.12 )的时候,编译器会把13.12转换成整数13。
要想写入float 13.12,你得定义一个float变量。
伪代码演示:
float f = 13.12;
FLASH_ProgramWord( Addr , *((uint32_t*)&f )) //这样就把内存的4个字节写入到FLASH中。
读的时候是相反的过程。读出是一个整数,然后转换成float型的指针,读出float值。

creep 回答时间:2015-10-8 15:45:36
本帖最后由 creep 于 2015-10-8 15:50 编辑

浮点数在内存中存储方式和整数不太相同,要先转换下才能能存储,你这样直接写进去应该是被强制转换成了整数进行存储所以小数部分会丢失。

具体的转换方法:float数据在内存中的存储方法
比较简单的方法是先乘个因子放大若干倍转换为整数存储然后读取时再除以这个因子还原。
Mandelbrot_Set 回答时间:2015-10-8 16:28:20
union TEST
{
unsigned int hexvalue;//4 byte
float floatvalue;//4 byte
};
存储读取时用hexvalue成员,
当float用时用floatvalue成员。
你好我好大家好! 回答时间:2015-10-8 16:55:23
帮顶                             
那就地方 回答时间:2015-10-8 17:03:25
creep 发表于 2015-10-8 15:45
浮点数在内存中存储方式和整数不太相同,要先转换下才能能存储,你这样直接写进去应该是被强制转换成了整数 ...

"比较简单的方法是先乘个因子放大若干倍转换为整数存储然后读取时再除以这个因子还原。"这个方法还不错
那就地方 回答时间:2015-10-8 17:05:04
Mandelbrot_Set 发表于 2015-10-8 16:28
union TEST
{
unsigned int hexvalue;//4 byte

用联合体来做,我等会试一下,谢谢帮忙
chifen 回答时间:2015-10-8 17:05:19
FLASH_ProgramWord函数不是以float 方式做存储的,原型 FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data);    其中 uint32_t 是整数型含数,建议你 把  float进两 两次转换成整数型,可以放大100倍方式存入
lkl0305 回答时间:2015-10-8 23:43:53
联合体应该不错
wofei1314 回答时间:2015-10-9 07:30:40
本帖最后由 wofei1314 于 2015-10-9 07:31 编辑

while( FLASH_ProgramWord( Addr , 13.12 ) != FLASH_COMPLETE ) ;
最好改为while( FLASH_ProgramWord( Addr , 13.12f ) != FLASH_COMPLETE ) ;

然后 float DATAW[n];定义成float比较好,不知道你是如何定义的

最后用这个读:  DATAW[0] = *(__IO uint32_t *)Addr;

那就地方 回答时间:2015-10-9 09:45:46
wofei1314 发表于 2015-10-9 07:30
while( FLASH_ProgramWord( Addr , 13.12 ) != FLASH_COMPLETE ) ;
最好改为while( FLASH_ProgramWord( Add ...

谢谢你的回答,数组我也是定义成float型的,如右 float Data1W[2];

9楼的方法可行,我试过了。
那就地方 回答时间:2015-10-9 09:46:59
党国特派员 发表于 2015-10-9 01:14
虽然float和int在内存中都占用4个字节,但是你在调用 FLASH_ProgramWord( Addr , 13.12 )的时候,编译器会 ...

非常感谢,你的方法我试了一下,可行!
那就地方 回答时间:2015-10-9 09:51:41
wofei1314 发表于 2015-10-9 07:30
while( FLASH_ProgramWord( Addr , 13.12 ) != FLASH_COMPLETE ) ;
最好改为while( FLASH_ProgramWord( Add ...

感谢你的回答,while( FLASH_ProgramWord( Addr , 13.12f ) != FLASH_COMPLETE ) ;这样写法编译器报错!
11.png
22.png
那就地方 回答时间:2015-10-9 09:54:38
chifen 发表于 2015-10-8 17:05
FLASH_ProgramWord函数不是以float 方式做存储的,原型 FLASH_Status FLASH_ProgramWord(uint32_t Address, ...

谢谢,你的答复
JackieLaura 回答时间:2015-10-9 09:59:27
float乘多少倍后存int
stmcu.org.png
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版