完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
用STM32F103VET6flash存储float变量,读取时只有整数部分。代码如下:往flash写13.12,读出来DATAW[0]显示13.0。
#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; } |
|
相关推荐
21个回答
|
|
|
虽然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:50 编辑
浮点数在内存中存储方式和整数不太相同,要先转换下才能能存储,你这样直接写进去应该是被强制转换成了整数进行存储所以小数部分会丢失。 具体的转换方法:float数据在内存中的存储方法 比较简单的方法是先乘个因子放大若干倍转换为整数存储然后读取时再除以这个因子还原。 |
|
|
|
|
|
union TEST
{ unsigned int hexvalue;//4 byte float floatvalue;//4 byte }; 存储读取时用hexvalue成员, 当float用时用floatvalue成员。 |
|
|
|
|
|
|
|
|
"比较简单的方法是先乘个因子放大若干倍转换为整数存储然后读取时再除以这个因子还原。"这个方法还不错
|
|
|
|
|
|
用联合体来做,我等会试一下,谢谢帮忙 |
|
|
|
|
|
FLASH_ProgramWord函数不是以float 方式做存储的,原型 FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data); 其中 uint32_t 是整数型含数,建议你 把 float进两 两次转换成整数型,可以放大100倍方式存入
|
|
|
|
|
|
联合体应该不错
|
|
|
|
|
|
本帖最后由 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; |
|
|
|
|
zhhx1985 发表于 2019-2-14 17:26 谢谢你的回答,数组我也是定义成float型的,如右 float Data1W[2]; 9楼的方法可行,我试过了。 |
|
|
|
|
你我然后 发表于 2019-2-14 15:49 非常感谢,你的方法我试了一下,可行! |
|
|
|
|
zhhx1985 发表于 2019-2-14 17:26 感谢你的回答,while( FLASH_ProgramWord( Addr , 13.12f ) != FLASH_COMPLETE ) ;这样写法编译器报错! |
|
|
|
|
yuxiangxyz 发表于 2019-2-14 16:55 谢谢,你的答复 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float i;
int j i=13.12; j=(i)*100; while( FLASH_ProgramWord( Addr ,j ) != FLASH_COMPLETE ) ; 试一下行不行 |
|
|
|
|
szzjfyp 发表于 2019-2-14 18:10 FLASH_ProgramWord这个函数的第二个参数你看看是啥?应该是不支持直接传float格式的,所以错误,可以这样 float val=13.12; while( FLASH_ProgramWord( Addr ,(WORD *)(&val)) != FLASH_COMPLETE ) ; |
|
|
|
|
|
过来支持下!
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32F405驱动DS1302时钟模块,输出时间错乱该怎么排查?
2797 浏览 2 评论
stm32f405rgt6驱动DS1302ZN出现时间错乱问题
2403 浏览 1 评论
stm32用fsmc读取ad7606采集数据,数据不变,只有开发版复位才更新数据
2276 浏览 0 评论
2388 浏览 1 评论
1637 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 21:55 , Processed in 1.333764 second(s), Total 109, Slave 92 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
11578