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. 代码下载