FLASH存储任意类型的数据

1.数据的存储

存储数据,我们当然需要了解数据在计算机中的存储方式。然而不同平台又有差异,其中就有大小端存储的差异以及数据长度的差异。想了解这两种差异的可以自行查找相关资料,本博客针对STM32F4平台,使用的是Cortex-M4内核,小端存储方式、32位处理器;使用的FLASH是W25Q128。

1.1 char类型数据存储

                                                                   图1-1 char类型数据存储

char数据占一个字节,一个字节同时也是大部分计算机存储数据的最小单位。可以看到,字符'A',在地址0x00000000(32位地址长度)以二进制0100 0001存储。char类型的存储十分简单易懂的。

1.2 int数据存储

                                                                 图1-2 int数据存储

STM32平台中,int占四个字节,所以占用四个存储单位;同时属于小端存储方式,遵从“低位数据存储低位数据”原则,出现如上的存储格式。(为了方便理解,使用十六进制方式表示

1.3 float数据存储

                                                                        图1-3 float数据存储

STM32平台中,float占四个字节,所以占用四个存储单位;同时属于小端存储方式,遵从“低位数据存储低位数据”原则,出现如上的存储格式。(为了方便理解,使用十六进制方式表示

为什么是(...),其实是博主已经不会了(不学无术)。同样的博主想表达的是,为了方便计算机计算提高工作效率,计算其实以更深一层的方式存储数据----补码方式存储,我们需要通过一定的计算,才能得到小数以及负数的真正存储数据。

这个时候我们回到问题所在,FLASH存储任意类型的数据。通常来说,写入FLASH以及读取FLASH的通常属于同一平台的处理器,不存在异构问题。当不存在异构问题的时候问题就好处理很多,我们自需要写入方式和读取方式一致,解析数据的交还给CPU即可。如下结合例子解释。

2.FLASH(W25Q128)如何实现任意数据类型存储

我们都知道W25Q128最小一个字节写入(为什么说这个,因为STM32内部FLASH就是最小四字节写入,不同的FLASH写入都是有差异的),W25Q128相关驱动代码就不再赘述,大家可以下载代码。

首先我们以int举例:

                                                                   图2-1 int数据写入flash读出flash过程示意图

可以看出,只要严格按照数据长度写入读出,保证数据不丢失,就可以将数据正确存储,完全不用考虑转换的问题,对于float以及负数以及任意类型的数据都是一样的。上代码。

		//写入数据
		{
			char num_char = 'a';
			int num_int = 100;
			float num_float = -1.456;
			
			W25QXX_Write((u8*)&num_char, 0, sizeof(char));	
			printf("FLASH写入字符型数据完成:%c\n", num_char);
			
			W25QXX_Write((u8*)&num_int, 10, sizeof(int));	
			printf("FLASH写入整型数据完成:%d\n", num_int);
			
			W25QXX_Write((u8*)&num_float, 20, sizeof(float));	
			printf("\nFLASH写入浮点型数据完成:%f\n\n", num_float);
		
		
		}
		delay_ms(5000);
		//读出数据
		{
			char num_char_out = 0;
			int num_int_out = 0;
			float num_float_out = 0.0;
			
			W25QXX_Read((u8*)&num_char_out, 0, sizeof(char));
			printf("FLASH读入字符型数据完成:%c\n", num_char_out);
			delay_ms(20);			//串口不加延时,会换行失败(仅仅美观)
			
			W25QXX_Read((u8*)&num_int_out, 10, sizeof(int));
			printf("FLASH读入整型数据完成:%d\n", num_int_out);
			delay_ms(20);			//串口不加延时,会换行失败(仅仅美观)
			
			W25QXX_Read((u8*)&num_float_out, 20, sizeof(float));
			printf("FLASH读入浮点型数据完成:%f\n", num_float_out);
		} 

                                                                       图2-2 结果图

3. 代码下载

https://github.com/oraSC/STM32-course/tree/master/SPI/SPI%E6%93%8D%E4%BD%9CW25Q128/code/%E4%BB%BB%E6%84%8F%E7%B1%BB%E5%9E%8B

 

 

 

  • 6
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值