历史上的今天
今天是:2024年10月25日(星期五)
2021年10月25日 | stm32专题十七:EEPROM存储小数
2021-10-25 来源:eefocus
在计算机中,数据类型是取决于解码的方式,而在内存中保存的数据,并不会因为解码方式发生改变。
eg:1111 1111 8位数据。当用 uint8_t 来解析时,值为255,而当用 int8_t 来解析时,值为-128。
浮点数:在目前绝大多数机器中,float 类型占据4字节。
我们在利用EEPROM保存浮点数时,实际上就是直接把数据存进去,然后再以 float 类型解析出来。这几种的一个关键的地方,就是在利用I2C发送数据时,利用void *进行强制类型转换,把原来long double和int类型的数据转换成不确定类型的指针。然后一个一个字节的发送就可以。最后,浮点数以%f读出,整数以%d读出。
本博客参考野火stm32的相关代码
/* 精髓在于void *强制类型转换,转成无类型指针 */
/*写入小数数据到地址10*/
I2C_EE_BufferWrite((void*)double_buffer,DOUBLE_ADDR, sizeof(double_buffer));
/*写入整数数据到地址60*/
I2C_EE_BufferWrite((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer));
/* 读出数据的操作也一样,void *类型转换 */
/*读取小数数据*/
I2C_EE_BufferRead((void*)double_buffer, DOUBLE_ADDR, sizeof(double_buffer));
/*读取整数数据*/
I2C_EE_BufferRead((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer));
void * 为 “不确定类型指针”,void *可以用来声明指针。用void* 定义一个void类型的指针,它不指向任何类型的数据,意思是,void*指针“指向空类型”或“不指向确定的类型”,而不要理解为void*指针能指向“任何的类型”数据。简而言之:void*只提供一个地址,没有指向。
#include "stm32f10x.h"
#include "./usart/bsp_usart.h"
#include "./i2c/bsp_i2c_ee.h"
#include "./led/bsp_led.h"
#include uint8_t cal_flag = 0; uint8_t k; /*存储小数和整数的数组,各7个*/ long double double_buffer[7] = {0}; int int_bufffer[7] = {0}; #define DOUBLE_ADDR 10 #define LONGINT_ADDR 70 /** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { LED_GPIO_Config(); /* 串口初始化 */ USART_Config(); printf("rn 这是一个EEPROM 读写小数和长整数实验 rn"); /* I2C 外设初(AT24C02)始化 */ I2C_EE_Init(); /*读取数据标志位*/ I2C_EE_BufferRead(&cal_flag, 0, 1); if( cal_flag != 0xCD ) /*若标志等于0xcd,表示之前已有写入数据*/ { printf("rn没有检测到数据标志,FLASH没有存储数据,即将进行小数写入实验rn"); cal_flag =0xCD; /*写入标志到0地址*/ I2C_EE_BufferWrite(&cal_flag, 0, 1); /*生成要写入的数据*/ for( k=0; k<7; k++ ) { double_buffer[k] = k +0.1; int_bufffer[k]=k*500+1 ; } /*写入小数数据到地址10*/ I2C_EE_BufferWrite((void*)double_buffer,DOUBLE_ADDR, sizeof(double_buffer)); /*写入整数数据到地址60*/ I2C_EE_BufferWrite((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer)); printf("向芯片写入数据:"); /*打印到串口*/ for( k=0; k<7; k++ ) { printf("小数tx = %LFrn",double_buffer[k]); printf("整数tx = %drn",int_bufffer[k]); } printf("rn请复位开发板,以读取数据进行检验rn"); } else { printf("rn检测到数据标志rn"); /*读取小数数据*/ I2C_EE_BufferRead((void*)double_buffer, DOUBLE_ADDR, sizeof(double_buffer)); /*读取整数数据*/ I2C_EE_BufferRead((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer)); printf("rn从芯片读到数据:rn"); for( k=0; k<7; k++ ) { printf("小数 rx = %LF rn",double_buffer[k]); printf("整数 rx = %d rn",int_bufffer[k]); } } while (1); }
上一篇: stm32专题十四:存储器介绍
下一篇:stm32专题十八:SPI协议
史海拾趣
|
2007年秋桂林市核子软件有限公司招聘信息 2007年桂林市核子软件开发有限公司招聘信息公司简介: 桂林市核子软件开发有限公司主要从事于嵌入式软件及网络新技术的研究和开发,主要由深圳市双赢伟业科技有限公司投资兴办。公司主要客户是双赢伟 ...… 查看全部问答> |
|
红外距离指的是红外光所达到的距离,从几米到几百米,甚至是数公里。而夜间可视距离是通过监视器所能够看到的清晰有效最大距离,是由红外灯的发光距离、摄像机的感红外程度、现场反射红外情况、供电电源的质量及镜头的匹配情况来决定的。它们之间相 ...… 查看全部问答> |
|
向你请教 WINCE + 2410 + I2C + AT24C02 的问题! 我想用 2410 开发板,WinCE 4.2 操作系统,I2C 总线读写 AT24C02 EEPROM。 我已经看懂了 2410 的 I2C 寄存器和 AT24C02 的读写方法;也看懂了 ADS 下的纯 C 语言程序。 因为我以前一直做桌面的程序,底子比较差;就是对 WINCE 下的 I2C 流驱动没 ...… 查看全部问答> |
|
如题,我用cypress的芯片控制nand flash,型号是k9f1g08u0a,gpif波形图如下,现在我换了一个flash,时序上不一样,没弄过这些,不知道这些图形都代表什么,盼高手指点。 d:\\flash\\gpif\\1.jpg d:\\flash\\gpif\\2.jpg d:\\flash\\gpif\\3.jpg ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 03:51 编辑 做一个低频信号分析仪要求 基本要求 在输入交流信号电压峰峰值Vpp为500m V~5V,频率范围为50Hz~50kHz条件下,完成以下参数测试; 正弦波,三角波和方波频率测试,测量误差小于1%; 正弦波 ...… 查看全部问答> |




