stm32专题十七:EEPROM存储小数

发布者:美人如玉剑如虹最新更新时间:2021-10-25 来源: 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协议

推荐阅读最新更新时间:2024-11-13 11:00

STM32串口USART2程序
简介:对控制LED指示灯的IO口进行了初始化,将端口配置为推挽上拉输出,口线速度为50Mhz。PA2,PA2端口复用为串口2的TX,RX。在配置某个口线时,首先应对它所在的端口的时钟进行使能。否则无法配置成功,由于用到了端口B, 因此要对这个端口的时钟。进行使能,同时由于用到复用IO口功能用于配置串口。因此还要使能AFIO(复用功能IO)时钟。 原理图: 程序分析: int main(void) { uint8_t a=0; /* System Clocks Configuration */ RCC_Configuration();//系统时钟设置 /*嵌套向量中断控制器 说明了U
[单片机]
<font color='red'>STM32</font>串口USART2程序
STM32片上Flash内存映射、页面大小、寄存器映射
摘要: 本文以STM32F103RBT6为例介绍了片上Flash(Embedded Flash)若干问题,包括Flash大小(内存映射)、块大小、页面大小、寄存器。这些知识,有利于写Flash驱动。 一、怎么看Flash大小 1.1 通过型号 型号会印在MCU表面,可以通过观察获得,我的是STM32F103RBT6(以下分析基于这个型号),对照下图的STM32产品命名,可知STM32F103RBT6的Flash是128KB。 () 图1 Ordering information scheme 1.2 通过数据手册(内存映射) 也可以通过数据手册得到Flash大小,首先根据型号从官网下得对应的数据手册D
[单片机]
<font color='red'>STM32</font>片上Flash内存映射、页面大小、寄存器映射
成本低、易于编程控制的DLP投影STM32单片机驱动电路研究设计
DLP投影技术是应用美国德州仪器公司开发的数字微镜元件--DMD(Digital Micromirror Device)作为主要关键处理元件以实现数字光学处理过程的技术。DLP显示的色彩清晰度高、艳丽、细腻、逼真,且为全数字显示即可靠性极高,能在各类产品(如大屏幕数字电视、公司/家庭/专业会议投影机和数码相机(DLP Cinema))中提供最佳图像效果。目前,大部分的家用或商用DLP投影机都采用了单片结构,使得其便于移动携带,因而得到越来越广泛的应用。在目前应用发展的基础上,又对其结构的精简性、携带的方便性提出了更高的要求。传统的DLP投影仪是通过DVI接口接收外部信号,并且经过信号转换传送给DLP控制器来控制DLP的显示,占用的
[单片机]
成本低、易于编程控制的DLP投影<font color='red'>STM32</font>单片机驱动电路研究设计
STM32之GPIO结构
1、STM32的GPIO结构图 GPIO共有8中设置模式:输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、推挽式复用功能,开漏复用功能,共4种输入,2种输入,2种复用功能。 2、模式说明 ①浮空输入 图中施密特触发器是开启的,IO口的状态可以直接送到输入寄存器中,CPU可以直接读取输入寄存器; 在上图中,阴影的部分处于不工作状态,尤其是下半部分的输出电路,实际上是与端口处于隔离状态。 黄色的高亮部分显示了数据传输通道,外部的电平信号通过左边编号1的IO端口进入STM32,经过编号2的施密特触发器的整形送入编号3的输入数据寄存器,在输入数据寄存器的另一端编号4,CPU可以随时读出IO端口的电平状态。 ②上拉输入
[单片机]
stm32专题十二:DEBUG调试宏 C语言 调试宏
调试宏在c编程中比较重要,通常用于前期测试打印调试信息,然后正式发布时,只需要修改宏,就能取消打印全部调试信息,非常方便。 fmt为希望输出的调试信息,比较关键的就是(fmt,...)和##__VA_ARGS__,__VA_ARGS__用于把...替换成宏并连接。 典型用法: void DefaultFlashSet(void) { // 若Flash标记地址的值没有被正确的写入,则重新写入,只会在全片擦除后执行 if ((InternalFlashRead(FLASH_SIGN_ADDR) != FLASH_WRITE_SIGN)) { DEBUG_INFO( Flash擦除 ); InternalFlas
[单片机]
<font color='red'>stm32</font>专题十二:DEBUG调试宏 C语言 调试宏
STM32软件复位的实现方法
前些天写程序的时候,需要做一个自动复位的功能,也就是当收到外部通讯设备复位指令时,主设备立刻执行复位操作。当时是想到的用看门狗实现。但是觉得似乎不太妥当,因为看门狗的复位是需要一定的时间。而在这段时间内系统还是处于正常运行当中,而且所有中断都会正常响应。这恰好与要实现的功能南辕北辙。需求是当收到复位指令时,系统停止执行后面的所有操作,包含中断响应。所以看门狗无法实现。 我用的是STM32F103芯片,了解这颗芯片能用来复位的只有5种,外部复位、独立/窗口看门狗、软件复位功耗管理。看来我能用的也就只有软件复位了。但是我查了所有STM32F103芯片相关的资料,还是没有找到具体的实现方法,最多是提到过这种复位寄存器SYSRESET
[单片机]
STM32】GPIO工作原理(八种工作方式超详细分析)
STM32F1xx官方资料: 《STM32中文参考手册V10》-第8章通用和复用功能IO(GPIO和AFIO ) 芯片数据手册(datasheet) STM32的GPIO介绍 STM32引脚说明 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F103ZET6芯片为144脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx、PDx、PEx、
[单片机]
【<font color='red'>STM32</font>】GPIO工作原理(八种工作方式超详细分析)
STM32开发笔记42: 移植FreeRTOS到现有工程的方法
单片机型号:STM32F070F6P6 本文详细介绍移植FreeRTOS到现有工程的方法。 1、现有工程的目录结构如下图所示,bsp是STM32固有的驱动库,PSP是自定义的设备驱动,APP是逻辑层。 2、复制FreeRTOS文件夹到自己的工程目录,如下图所示。 3、复制FreeRTOSConfig.h文件到Inc文件夹 4、复制freertos.c和stm32f0xx_hal_timebase_TIM.c文件到src_3_app文件夹。 5、按照下列目录结构加入FreeRTOS的源文件。 6、更改3个工程项目的包含文件路径,如下图所示。 7、去除1_bsp工程的
[单片机]
<font color='red'>STM32</font>开发笔记42: 移植FreeRTOS到现有工程的方法
小广播
设计资源 培训 开发板 精华推荐

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

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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