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;
}
虽然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成员。 帮顶 creep 发表于 2015-10-8 15:45
浮点数在内存中存储方式和整数不太相同,要先转换下才能能存储,你这样直接写进去应该是被强制转换成了整数 ...
"比较简单的方法是先乘个因子放大若干倍转换为整数存储然后读取时再除以这个因子还原。"这个方法还不错 Mandelbrot_Set 发表于 2015-10-8 16:28
union TEST
{
unsigned int hexvalue;//4 byte
用联合体来做,我等会试一下,谢谢帮忙 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;定义成float比较好,不知道你是如何定义的
最后用这个读:DATAW = *(__IO uint32_t *)Addr;