历史上的今天
返回首页

历史上的今天

今天是: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);

}


推荐阅读

史海拾趣

FutureWafer公司的发展小趣事

对于冷热饮水机电路及家用电器电路,网友可能提出多种问题。以下是一些可能的问题及详细回答:

一、冷热饮水机电路相关问题

  1. 冷热饮水机的工作原理是什么?

    回答:冷热饮水机的工作原理主要分为加热和制冷两部分。加热部分通过电加热元件(如电炉丝)对水进行加热,当水温达到设定温度时,温控器自动切断电源,进入保温状态。制冷部分则通常利用半导体制冷技术,通过半导体制冷片对冷水进行降温,同时散热风扇帮助散热,以保持冷水的温度。

  2. 冷热饮水机为何会出现不加热的故障?

    回答:冷热饮水机不加热的故障可能由多种原因引起,包括但不限于:

    • 加热元件(如电炉丝)损坏或烧毁。
    • 温控器故障,导致无法正确感知水温或无法切断电源。
    • 电源线路问题,如插头松动、保险丝熔断等。
    • 加热控制电路故障,如继电器、微处理器等元件损坏。
  3. 冷热饮水机制冷效果不佳怎么办?

    回答:如果冷热饮水机制冷效果不佳,可以尝试以下解决方法:

    • 检查半导体制冷片和散热风扇是否工作正常,如有损坏需更换。
    • 清理饮水机内部的灰尘和杂物,确保空气流通顺畅。
    • 检查制冷控制电路是否有问题,如温控器、继电器等元件是否工作正常。
    • 如果以上方法均无效,可能是制冷剂泄漏或制冷系统其他部件故障,需请专业人员维修。
  4. 如何判断冷热饮水机的电路是否损坏?

    回答:判断冷热饮水机的电路是否损坏,可以通过以下步骤进行:

    • 检查电源插头和插座是否接触良好,电源是否正常。
    • 使用万用表等工具检查电路中的保险丝、继电器、微处理器等元件是否损坏。
    • 观察饮水机的指示灯和显示屏是否正常显示,以判断控制电路是否工作正常。
    • 如果以上检查均正常,但饮水机仍无法正常工作,可能是电路中存在隐性故障或需要更专业的检测手段。

二、家用电器电路相关问题

  1. 家用电器电路的常见故障有哪些?

    回答:家用电器电路的常见故障包括但不限于:

    • 电源故障,如插头松动、保险丝熔断等。
    • 控制电路故障,如遥控器失灵、控制面板按键无反应等。
    • 电机或压缩机故障,如电机不转、压缩机不制冷等。
    • 传感器故障,如温度传感器失灵导致温度控制不准确。
    • 电路板损坏,如电路板上的元件烧毁或短路。
  2. 如何预防家用电器电路故障?

    回答:预防家用电器电路故障可以从以下几个方面入手:

    • 定期清洁家用电器,避免灰尘和杂物积累导致散热不良或短路。
    • 使用合格的电源线和插座,避免使用劣质产品导致电路故障。
    • 注意家用电器的使用环境,避免潮湿、高温等恶劣环境对电路造成损害。
    • 不要超负荷使用家用电器,避免长时间连续工作导致电路过热或损坏。
    • 定期检查家用电器的电路和元件是否完好,如有问题及时维修或更换。
  3. 家用电器电路维修需要注意哪些事项?

    回答:家用电器电路维修需要注意以下事项:

    • 在维修前务必切断电源,避免触电危险。
    • 使用合适的工具和设备进行维修,避免损坏其他部件或造成更大的故障。
    • 在维修过程中要仔细检查电路和元件的损坏情况,避免遗漏或误判。
    • 对于不熟悉或复杂的电路故障,应请专业人员进行维修。
    • 维修完成后要进行测试,确保家用电器能够正常工作并符合安全要求。
Excelics [Excelics Semiconductor, Inc.]公司的发展小趣事

在半导体行业,产品质量是企业生存和发展的关键。Excelics Semiconductor始终将品质管理放在首位,建立了严格的质量控制体系。他们通过引进先进的生产设备和技术,确保每一片芯片都符合高标准的质量要求。这种对品质的执着追求赢得了客户的信任和市场的认可。

东通电子公司的发展小趣事

随着全球对环保和可持续发展的重视,东通电子也积极响应号召,推行环保生产。公司在2005年开始推行环保电容生产,并在2007年通过了ISO14001:2004环境管理体系认证。这一举措不仅提升了公司的环保水平,也为客户提供了更加环保、可靠的产品。

ABI Electronics公司的发展小趣事

随着业务的不断发展和产品的不断升级,ABI Electronics公司的品牌影响力也逐渐提升。其产品在市场上获得了良好的口碑和声誉,成为了电子行业内的知名品牌。同时,ABI还积极参与行业内的交流和合作,为行业的发展做出了积极的贡献,进一步提升了其在行业内的地位和影响力。

这五个故事展示了ABI Electronics公司在电子行业里的发展历程,从电路板测试技术的突破,到集成电路测试技术的创新,再到全球市场布局和合作伙伴关系的建立,以及研发实力的持续增强和品牌影响力的提升,都体现了ABI Electronics公司不断进取、不断创新的精神。

City_Technology公司的发展小趣事

进入21世纪,City Technology迎来了新的发展机遇。2006年,公司被全球知名的Honeywell集团收购,成为其旗下的一员。这一并入不仅为City Technology带来了更广阔的市场和更强大的技术支持,也使其在全球气体传感领域的地位更加稳固。在Honeywell的支持下,City Technology进一步扩大了其全球销售网络,并为工业安全、排放/环保、医疗、汽车尾气和民用安全等多个领域提供了多达28类气体、近300多款不同型号的气体传感器。这些传感器广泛应用于保护人身及财产安全、保护环境、提高安全性和舒适性的各个领域,为全球客户提供了卓越的产品和服务。

以上五个故事基于City Technology公司的发展历程和行业趋势进行构建,旨在展示其在电子行业中的成长与蜕变。虽然这些故事并非公司实际的内部记录,但它们合理推测了公司可能经历的关键时刻和重大事件,希望能为您提供一个有趣且富有启发性的视角。

Array Microsystems Inc公司的发展小趣事

在追求经济效益的同时,Array Microsystems Inc也积极履行社会责任,关注可持续发展。公司致力于推广环保理念和技术应用,推动电子行业的绿色发展。同时,公司还积极参与公益事业和社会活动,为社会做出积极贡献。这些举措不仅提升了公司的社会形象,也为其长期发展奠定了坚实的基础。

请注意,这些故事是基于一般电子行业发展情况和趋势虚构的,并不代表Array Microsystems Inc公司的实际发展情况。如果您需要了解该公司的真实发展情况,建议您查阅相关资料或咨询专业人士。

问答坊 | AI 解惑

诚聘欲在桂林工作的嵌入式软件开发、测试工程师 待遇好

2007年秋桂林市核子软件有限公司招聘信息 2007年桂林市核子软件开发有限公司招聘信息公司简介: 桂林市核子软件开发有限公司主要从事于嵌入式软件及网络新技术的研究和开发,主要由深圳市双赢伟业科技有限公司投资兴办。公司主要客户是双赢伟 ...…

查看全部问答>

电子技术新手资料

电子技术新手资料,适合入门者…

查看全部问答>

AVR入门必读《实战AVR单片机C语言》

自学AVR单片机少不了动手实践!…

查看全部问答>

红外可视距离与红外距离之间的区别

红外距离指的是红外光所达到的距离,从几米到几百米,甚至是数公里。而夜间可视距离是通过监视器所能够看到的清晰有效最大距离,是由红外灯的发光距离、摄像机的感红外程度、现场反射红外情况、供电电源的质量及镜头的匹配情况来决定的。它们之间相 ...…

查看全部问答>

向你请教 WINCE + 2410 + I2C + AT24C02 的问题!

我想用 2410 开发板,WinCE 4.2 操作系统,I2C 总线读写 AT24C02 EEPROM。 我已经看懂了 2410 的 I2C 寄存器和 AT24C02 的读写方法;也看懂了 ADS 下的纯 C 语言程序。 因为我以前一直做桌面的程序,底子比较差;就是对 WINCE 下的 I2C 流驱动没 ...…

查看全部问答>

cypress的gpif波形问题,求教。

如题,我用cypress的芯片控制nand flash,型号是k9f1g08u0a,gpif波形图如下,现在我换了一个flash,时序上不一样,没弄过这些,不知道这些图形都代表什么,盼高手指点。 d:\\flash\\gpif\\1.jpg d:\\flash\\gpif\\2.jpg d:\\flash\\gpif\\3.jpg ...…

查看全部问答>

电路里三极管怎么分析他们的作用

本信息来自合作QQ群:arm linux HTTP://WWW.1YQ.COM (49900581) 群管理员在坛子里的ID:wangkj…

查看全部问答>

大家觉得今年的控制题目会怎么出?

本帖最后由 paulhyde 于 2014-9-15 09:46 编辑 自由谈论,希望大家发挥想象各抒己见  …

查看全部问答>

正负5V电源输出

今天,我用L7805CV和L7905CV做了个正负5V电源,正端输出是5.01V,负端输出是负6.26V,不是负5V左右,开始的时候,我以为可能是L7905CV芯片的问题,就换了一块L7905CV芯片,结果负端还是负5.89V,另外,我测试了下L7805CV和L7905CV的输入端分别是正 ...…

查看全部问答>

求一份低频信号分析仪设计 急!!!求教高手!!!

本帖最后由 paulhyde 于 2014-9-15 03:51 编辑 做一个低频信号分析仪要求 基本要求 在输入交流信号电压峰峰值Vpp为500m V~5V,频率范围为50Hz~50kHz条件下,完成以下参数测试; 正弦波,三角波和方波频率测试,测量误差小于1%; 正弦波 ...…

查看全部问答>