OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10179|回复: 19

W25Q64flash存储时如果要存浮点型数据怎么办?

[复制链接]

8

主题

36

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-9-1
在线时间
0 小时
发表于 2013-9-24 21:59:19 | 显示全部楼层 |阅读模式
//写SPI FLASH  
//在指定地址开始写入指定长度的数据
//该函数带擦除操作!
//pBuffer:数据存储区
//WriteAddr:开始写入的地址(24bit)
//NumByteToWrite:要写入的字节数(最大65535)   
u8 SPI_FLASH_BUFFER[4096];  
void SPI_Flash_Write(u8* pBuffer,u32 WriteAddr,u16 NumByteToWrite)   
u32 secpos;
u16 secoff;
u16 secremain;   
  u16 i;    
u8 * SPI_FLASH_BUF;  
    SPI_FLASH_BUF=SPI_FLASH_BUFFER;     
  secpos=WriteAddr/4096;//扇区地址  
secoff=WriteAddr%4096;//在扇区内的偏移
secremain=4096-secoff;//扇区剩余空间大小   
  //printf("ad:%X,nb:%X\r\n",WriteAddr,NumByteToWrite);//测试用
  if(NumByteToWrite<=secremain)secremain=NumByteToWrite;//不大于4096个字节
while(1) 
{
SPI_Flash_Read(SPI_FLASH_BUF,secpos*4096,4096);//读出整个扇区的内容
for(i=0;i<secremain;i++)//校验数据
{
if(SPI_FLASH_BUF[secoff+i]!=0XFF)break;//需要擦除    
}
if(i<secremain)//需要擦除
{
SPI_Flash_Erase_Sector(secpos);//擦除这个扇区
for(i=0;i<secremain;i++)   //复制
{
SPI_FLASH_BUF[i+secoff]=pBuffer;  
}
SPI_Flash_Write_NoCheck(SPI_FLASH_BUF,secpos*4096,4096);//写入整个扇区  

}else SPI_Flash_Write_NoCheck(pBuffer,WriteAddr,secremain);//写已经擦除了的,直接写入扇区剩余区间.   
if(NumByteToWrite==secremain)break;//写入结束了
else//写入未结束
{
secpos++;//扇区地址增1
secoff=0;//偏移位置为0  

  pBuffer+=secremain;  //指针偏移
WriteAddr+=secremain;//写地址偏移   
  NumByteToWrite-=secremain; //字节数递减
if(NumByteToWrite>4096)secremain=4096; //下一个扇区还是写不完
else secremain=NumByteToWrite; //下一个扇区可以写完了
}  
};  
}

如上函数所示,我想存一个浮点型数据比如1.234,该怎么办,难道要把浮点型先转成字符型,再存到字符数组里调用吗?有没有简便的方法?

http://blog.sina.com.cn/u/2126609520 新浪微博@开着拖拉机还唱歌
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

274

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2011-11-2
在线时间
11 小时
发表于 2013-9-24 22:03:08 | 显示全部楼层
浮点数据强制转换成字符BUF。 字符BUF读出来再强制转换成浮点数据。就这么简单。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-24 22:03:17 | 显示全部楼层
还是老办法,强奸法。
如:
float a;
a=1.234;
SPI_Flash_Write((u8*)a,100,4);
这样,就把浮点数a,写到地址100的地方了
然后读取的时候
SPI_Flash_Read((u8*)a,100,4);
就读出来了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

36

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-24 22:08:23 | 显示全部楼层
回复【2楼】zenghi:
---------------------------------
哦 我去试试看哈
http://blog.sina.com.cn/u/2126609520 新浪微博@开着拖拉机还唱歌
回复 支持 反对

使用道具 举报

8

主题

36

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-24 22:10:25 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
谢谢原子哥教导 好形象的名字!
http://blog.sina.com.cn/u/2126609520 新浪微博@开着拖拉机还唱歌
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-24 22:36:26 | 显示全部楼层
 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

36

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-26 21:31:18 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
老大为什么我按你的方法编译器会报错诶
http://blog.sina.com.cn/u/2126609520 新浪微博@开着拖拉机还唱歌
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-26 22:54:15 | 显示全部楼层
回复【7楼】wan296555869:
---------------------------------
提示什么错误?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

36

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-27 20:38:44 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
display.c(9910): error:  #171: invalid type conversion
display.c:      SPI_Flash_Write((u8*)p,FLASH_SIZE-200,7);
http://blog.sina.com.cn/u/2126609520 新浪微博@开着拖拉机还唱歌
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-9-27 23:21:31 | 显示全部楼层
回复【9楼】wan296555869:
---------------------------------
应该是你代码输入有问题,呵呵。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

156

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2013-9-24
在线时间
0 小时
发表于 2013-9-28 13:36:49 | 显示全部楼层
强奸法
人需要沐浴阳光,也必将经历风雨
回复 支持 反对

使用道具 举报

8

主题

36

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2013-9-1
在线时间
0 小时
 楼主| 发表于 2013-9-28 22:48:32 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
一直找不出来 后来用sprintf这个函数转换成字符串解决了
http://blog.sina.com.cn/u/2126609520 新浪微博@开着拖拉机还唱歌
回复 支持 反对

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
发表于 2014-6-26 15:45:11 | 显示全部楼层
回复【9楼】wan296555869:
---------------------------------
我的也是这个问题
本人新人,各位多包涵!
回复 支持 反对

使用道具 举报

53

主题

175

帖子

1

精华

高级会员

Rank: 4

积分
516
金钱
516
注册时间
2014-5-16
在线时间
7 小时
发表于 2014-6-26 15:45:47 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
我的也是8楼的问题,为什么会产生这样的错误呢?
本人新人,各位多包涵!
回复 支持 反对

使用道具 举报

13

主题

185

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2014-4-9
在线时间
9 小时
发表于 2014-6-26 15:59:36 | 显示全部楼层
回复【9楼】wan296555869:
---------------------------------
浮点数4字节的你怎么写长度7?
大海啊,全是水; 骏马啊,四条腿。
回复 支持 反对

使用道具 举报

6

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
341
金钱
341
注册时间
2013-11-10
在线时间
91 小时
发表于 2015-5-14 22:31:37 | 显示全部楼层
回复【14楼】x1213378204:
---------------------------------
我也遇到了,郁闷...
回复 支持 反对

使用道具 举报

13

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
130
金钱
130
注册时间
2014-10-13
在线时间
4 小时
发表于 2015-5-14 23:30:44 | 显示全部楼层
感觉这个方法不错,我也遇到了这个问题
回复 支持 反对

使用道具 举报

5

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2016-12-26
在线时间
8 小时
发表于 2017-2-17 15:50:34 | 显示全部楼层
少个地址符号&
回复 支持 反对

使用道具 举报

3

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
275
金钱
275
注册时间
2012-6-19
在线时间
37 小时
发表于 2017-2-17 16:48:17 | 显示全部楼层
快速的学习一下C语言的共用体,这个问题很容易!
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2020-8-2
在线时间
1 小时
发表于 2021-2-12 17:44:45 | 显示全部楼层
float wr_pi=3.14;
float rd_pi=0;
写:SPI_Flash_Write((uint8_t*)&wr_pi,100,4);
读:SPI_Flash_Read((uint8_t*)&rd_pi,100,4);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 03:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表