用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; } |
【MCU实战经验】基于STM32F103C8T6的hart总线调试器设计
求教STM32F103进入STOP模式后用外部中断唤醒的问题
基于STM32F103RCT6的无源蜂鸣器音乐播放(生日快乐歌)
STM32F103c8t6有没有DAC 功能?
STM32F103x中文数据手册
新手求教,为何在我电脑上找不到STM32F1Xx.h文件
金龙107例程汇总(STM32F107)
万利STM32F107VC 原理图
STM32F103 ADC多通道检测必须要DMA吗?
【官方例程】STM32F107以太网官方例程
要想写入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;
谢谢你的回答,数组我也是定义成float型的,如右 float Data1W[2];
9楼的方法可行,我试过了。
非常感谢,你的方法我试了一下,可行!
感谢你的回答,while( FLASH_ProgramWord( Addr , 13.12f ) != FLASH_COMPLETE ) ;这样写法编译器报错!
谢谢,你的答复