那就地方iv 发表于 2015-10-8 15:12:08

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

      用STM32F103VET6flash存储float变量,读取时只有整数部分。代码如下:往flash写13.12,读出来DATAW显示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 = *(__IO uint32_t *)Addr;
}

党国特派员 发表于 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

帮顶                           

那就地方iv 发表于 2015-10-8 17:03:25

creep 发表于 2015-10-8 15:45
浮点数在内存中存储方式和整数不太相同,要先转换下才能能存储,你这样直接写进去应该是被强制转换成了整数 ...

"比较简单的方法是先乘个因子放大若干倍转换为整数存储然后读取时再除以这个因子还原。"这个方法还不错

那就地方iv 发表于 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;定义成float比较好,不知道你是如何定义的

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

页: [1] 2 3
查看完整版本: STM32F103的flash存储float变量,读取时只有整数部分