历史上的今天

今天是:2024年10月25日(星期五)

正在发生

2021年10月25日 | stm32专题十七:EEPROM存储小数

发布者:美人如玉剑如虹 来源: eefocus关键字:stm32  EEPROM 手机看文章 扫描二维码
随时随地手机看文章

在计算机中,数据类型是取决于解码的方式,而在内存中保存的数据,并不会因为解码方式发生改变。


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  EEPROM 引用地址:stm32专题十七:EEPROM存储小数

上一篇: stm32专题十四:存储器介绍
下一篇:stm32专题十八:SPI协议

推荐阅读

集微网消息,近日英特尔去年六月宣布已设计完成的Ice Lake芯片出现在了跑分平台Geekbench上。由于并不是最后的成品,所以从成绩来看得分并不高,单核跑分为4151,多核得分为7945。        这款双核四线程芯片搭载了DDR4 SODIMM内存,基频为2.6Ghz,一级指令缓存容量依然是每核心32KB,一级数据缓存则从每核心32KB增加到每核心48KB,二级缓存每核...
近日,在世界智能网联汽车大会现场,交通运输部党组成员兼总规划师王志清对我国智能网联汽车的发展提出了三大方向。一,加强协同合作,交通运输部将进一步优化政策供给,会同有关部门出台促进自动驾驶发展的顶层设计文件,坚持互利互赢,以更加开放的姿态,推进与各个国家在智能网联汽车领域的广泛合作。二,大力发展自动驾驶与车路协同关键技术,积极开展...
PS5 即将全面上市,但目前 PS5 只有白色外壳的版本供消费者购买。好在索尼之前确认 PS5 外壳可以轻松地拆开,这也意味着外壳可以替换。日前有第三方正式推出了 PS5 的自定义外壳,已经可以预订。商家 PlateStation5 当前提供五种不同颜色的自定义面板,每套售价 39.99 美元,约 266 元。配有完整的后壳和前壳,这些面板适用于 PlayStation ...
为了使用32.768 kHz 钟表晶体作为器件的时钟源,必须将熔丝位CKSEL 设置为“1001” 以选择低频晶体振荡器。晶体的连接方式如Figure 11 所示。通过对熔丝位CKOPT 的编 程,用户可以使能XTAL1 和XTAL2 的内部电容,从而去除外部电容。内部电容的标称数 值为36 pF。选择了这个振荡器之后,启动时间由熔丝位SUT 确定,如Table 6 所示。Note: 1...

史海拾趣

问答坊 | AI 解惑

Wince6.0 创建多语言CreateMui失败问题

定制OS, 选择了 MUI 和 英文和中文字体, 默认语言是中文 可调用 createmui 0409 命令后 输出如下, 输出完成后,提示找不到文件,麻烦大侠们给个提示,谢谢 Multiui.bib文件内容为空, ; ; Copyright (c) Microsoft Corporation.   ...…

查看全部问答∨

调查一下支持winCE6.0的CPU及有成熟开发板的公司

我搜了一些做ARM开发板的公司,甚少有支持wince6.0的开发板在卖。立宇泰、友善之臂、扬创、周立功、英蓓特等都没找到一块。优龙也是在最近才出了一款LPC3250的板子有wince6.0,但是驱动还没有做全。搜到有两家卖S3C6410X和S3C6400开发板的公司,海 ...…

查看全部问答∨

Can't create hard link ??

BUILDREL: Copying PLATFORMCOMMON binaries from C:\\WINCE600\\platform\\common Can\'t create hard link.  (FAT file system?) Copying files instead of creating hard links. 编译到最后的时候,出现这样几个错误?? 这是什么 ...…

查看全部问答∨

EVC 隐式调用动态链接库得问题

我有个动态链接库,头文件里定义了结构体和函数名 struct FvFixed {         CString m_str; public:         friend FvFixed const        operator+(const FvFixed x, const ...…

查看全部问答∨

DC-DC原理的培训讲义1,2

[local]1[/local][local]2[/local]…

查看全部问答∨

北京智博联公司招聘高级电子工程师

本公司招聘硬件工程师,从事检测仪器开发。关注于弱信号的采集、整理和放大。 1.    本科及以上学历; 2.    电子、自动化、硬件电路设计、检测技术等相关专业; 3.    有CPLD或FPGA开发经验者优先; 4.&nbs ...…

查看全部问答∨

S7-200的模拟量编写方法总结

1、模拟量值和A/D转换值的转换假设模拟量的标准电信号是A0—Am(如:4—20mA),A/D转换后数值为D0—Dm(如:6400—32000),设模拟量的标准电信号是A,A/D转换后的相应数值为D,由于是线性关系,函数关系A=f(D)可以表示为数学方程:   &nb ...…

查看全部问答∨

请问:STM32中双ADC快速交替模式如何使用?

最近在学习使用STM32的ADC,单ADC已经调试成功了,LCD可以显示实际波形。 看到有双ADC快速交替模式,可以提高一倍的速度,就改为该模式,用二个ADC采样同一个输入。 但是无论如何都调试不出来,只有ADC1的值,没有ADC2的值。 看了论坛几乎 ...…

查看全部问答∨

求助:关于TLV320AIC23的操作

各位大虾:我在DM642里面对TLV320AIC23进行Transmit操作时,遇到一个问题。代码如下,各同步时钟信号AFSX、ACLKX、AHCLKX由AIC23提供。 MCASP_ConfigSrctl MysrctlRegs = {      0x00000009,    //AXR00=Xmt &nbs ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved