用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 13.12,你得定义一个float变量。
伪代码演示:
float f = 13.12;
FLASH_ProgramWord( Addr , *((uint32_t*)&f )) //这样就把内存的4个字节写入到FLASH中。
读的时候是相反的过程。读出是一个整数,然后转换成float型的指针,读出float值。
浮点数在内存中存储方式和整数不太相同,要先转换下才能能存储,你这样直接写进去应该是被强制转换成了整数进行存储所以小数部分会丢失。
具体的转换方法:float数据在内存中的存储方法
比较简单的方法是先乘个因子放大若干倍转换为整数存储然后读取时再除以这个因子还原。
{
unsigned int hexvalue;//4 byte
float floatvalue;//4 byte
};
存储读取时用hexvalue成员,
当float用时用floatvalue成员。
"比较简单的方法是先乘个因子放大若干倍转换为整数存储然后读取时再除以这个因子还原。"这个方法还不错
用联合体来做,我等会试一下,谢谢帮忙
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;