【速成】蓝桥杯嵌入式省一教程:(十)利用共用体进行E2PROM读写

news2024/12/23 17:34:01

在上一节中我们了解到,AT24C02芯片(E2PROM存储器)内部含有256个8位字节,每一次只能对一个字节进行读写操作。因此,其只能处理unsigned char或uint8_t类型的数据,对于int、float型等大于占用一个字节的数据,需要进行额外处理。

若是对于uint16_t类型的数据,我们可以利用移位操作,将其拆成高八位与低八位存进E2PROM的两个地址中;在从E2PROM读取数据时,再分别取出高八位和低八位后存进同一个变量中。

然而,对于占用字节数更多的数据类型,或占用字节数未知,用这样的办法处理起来就显得较麻烦。下面就来介绍一种对所有数据类型都通用的处理办法——共用体(若不知道共用体是什么,可自行搜索):

union val_float
{
    float value;
    unsigned char data[sizeof(float)];
} val_write, val_read;

float val = 0.5;
val_write.value = val;

这样,val变量就以4个字节的形式,存储在了val_write这一共用体中,其中value的值为0.5,data[0]~data[3]分别为其4个字节。将这个值存储进E2PROM时,只需要将data数组的4个元素分别存储进4个地址中即可:

for (int i=0; i<sizeof(float); i++)
{
    e2prom_write(i, val_write.data[i]);
    HAL_Delay(5);    //加延时保证写操作完成
}

要从E2PROM中读取数据也非常简单,只需要用data数组的4个元素分别读取4个地址,然后取出共用体的value即可:

for (int i=0; i<sizeof(float); i++)
{
    val_read.data[i] = e2prom_read(i);
}

float val = val_read.value;

下面我们以第十三届蓝桥杯国赛题为例,总结第九、十两节的内容:

按键功能可以参考第四节的内容,这里不再赘述:

uint8_t X = 1;
uint8_t Y = 1;

if (key[1].single_flag==1 && view==1)
{
    X++;
    if (X > 4)    X = 1;
    key[1].single_flag = 0;
}

if (key[2].single_flag==1 && view==1)
{
    Y++;
    if (Y > 4)    Y = 1;
    key[2].single_flag = 0;
}

由于X和Y的数据类型均为uint8_t,因此直接进行E2PROM读写操作即可:

e2prom_write(0, X);
e2prom_write(1, Y);

设备重新上电时,要求从E2PROM中读取X和Y,则在初始化中读取即可:

uint8_t X = e2prom_read(0);
uint8_t Y = e2prom_read(1);

整个程序如下:

/* Cube自动生成的头文件引用 */
#include "key.h"
#include "e2prom.h"

int main(void)
{
    /* Cube自动生成的初始化 */
    uint8_t X = e2prom_read(0);
    uint8_t Y = e2prom_read(1);
    if (X!=1&&X!=2&&x!=3&&x!=4)    X = 1;    //第一次上电初始化
    if (Y!=1&&Y!=2&&Y!=3&&Y!=4)    Y = 1;    //第一次上电初始化

    while (1)
    {
        if (key[1].single_flag==1 && view==1)
        {
            X++;
            if (X > 4)    X = 1;
            key[1].single_flag = 0;
        }

        if (key[2].single_flag==1 && view==1)
        {
            Y++;
            if (Y > 4)    Y = 1;
            key[1].single_flag = 0;
        }

        e2prom(0, X);
        e2prom(1, Y);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/921256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VMware虚拟机---Ubuntu无法连接网络该怎么解决?

在学习使用Linux系统时&#xff0c;由于多数同学们的PC上多是Windows系统&#xff0c;故会选择使用VMware创建一个虚拟机来安装Linux系统进行学习。 安装完成之后&#xff0c;在使用时总是会遇到各种各样的问题。本片随笔就主要针对可能出现的网络问题进行一个总结&#xff0c;…

2022中国主要城市的绿地数据

绿地是城市生态的重要组成部分,在很多分析中都会用到绿地数据! 本次给大家带来的是中国主要城市的绿地数据!31个城市 该数据是中山大学的石茜等研究者通过深度学习方法,基于GoogleEarth影像和城市边界数据绘制的!数据格式为栅格格式(.tif)。 01 数据预览 我们以北京…

联邦学习:对“数据隐私保护”和“数据孤岛”困境的破局

作者&#xff1a;vivo 互联网安全团队- Tu Daxi 随着计算力、算法和数据量的巨大发展&#xff0c;人工智能迎来第3次发展高潮&#xff0c;开始了各行业的落地探索。然而&#xff0c;在“大数据”兴起的同时&#xff0c;更多行业应用领域中是“小数据”或者质量很差的数据。“数…

php开发websocket笔记(1)

1.运行server1.php文件 Windows命令行运行 php server1.php<?phperror_reporting(E_ALL); set_time_limit(0); //ob_implicit_flush(); $address 0.0.0.0;//可以监听网络上的请求 $address 127.0.0.1;//只能监听本机的请求$port 10005; //创建端口 $socket1 socket_cr…

智能型温湿度传感器在各个行业的广泛应用

在物联网时代&#xff0c;传感器的重要性是不言而喻&#xff0c;各类传感器在不同领域都有着极为重要的应用。如在智能家居领域&#xff0c;现代人们追求高品质舒适生活&#xff0c;对于所处环境要求进一步提升&#xff0c;以环境监测为主的智能家居设备广受追捧。这时候温湿度…

数据库——Redis 常见数据结构以及使用场景分析

文章目录 1. string2. list3. hash4. set5. sorted set 你可以自己本机安装 redis 或者通过 redis 官网提供的在线 redis 环境。 1. string 介绍 &#xff1a;string 数据结构是简单的 key-value 类型。虽然 Redis 是用 C 语言写的&#xff0c;但是 Redis 并没有使用 C 的字符串…

数据分析利器:pandas库的奥秘与代码示例

pandas是Python中一款强大的数据分析库&#xff0c;它提供了数据清洗、数据操作、数据可视化等功能&#xff0c;使得数据分析与处理变得更加高效和便捷。本文将从基本概念、基础知识、高级特性、实战案例和总结五个方面&#xff0c;深入介绍pandas库的用法和技巧。 一、基本概念…

安装Docker并配置镜像加速器、容器

1.安装docker服务&#xff0c;配置镜像加速器 安装软件包 [rootlocalhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 设置yum源 [rootlocalhost ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo…

ZDRE6VP4-1X/50MG24K4V比例压力阀放大器

DRE 6-11/100MG24K4M比、DRE 10-6X/200YMG24K4M、DRE 20-52/200YMG24K4M、DRE 20-6X/200YMG24K4M、ZDRE6VP1-1X/315MG24N9K4M、ZDRE6VP4-1X/50MG24K4V、Z3DRE6VP2-2X/50G24K4M、Z3DRE6VP1-2X/100G24K4M、Z3DRE10VP2-1X/100XYG24K4M、Z3DRE10VP1-1X/315XLG24K4V 功能: 设定值通…

【实践篇】DDD脚手架及编码规范 | 京东云技术团队

一、背景介绍 我们团队一直在持续推进业务系统的体系化治理工作&#xff0c;在这个过程中我们沉淀了自己的DDD脚手架项目。脚手架项目是体系化治理过程中比较重要的一环&#xff0c;它的作用有两点&#xff1a; &#xff08;1&#xff09;可以对新建的项目进行统一的规范&…

【校招VIP】java语言考点之类的加载过程

考点介绍&#xff1a; 类的加载过程在校招面试中是个高频考点。类只有在要运行的时候才会被加载进JVM,即编译后只有需要到这个类的时候才会把他加载进JVM运行&#xff0c;这种动态加载是依靠反射来实现的&#xff0c;一般来说一个class只会被加载一次...... 『java语言考点之…

oracle 启停操作

1. 监听端口启停 # 根据实际情况 切换至oracle用户 su - oracle# 状态查看 lsnrctl stat# 启动1521端口监听 lsnrctl start# 关闭1521监听 lsnrctl stop 2. 数据库服务启停 # 立即关闭服务 shutdown immediate# 启动服务 startup

前端需要理解的 JavaScript 知识

1 关于JavaScript JavaScript&#xff08;JS&#xff09;是单线程的、基于原型的、弱类型的、动态类型的、轻量的、支持面向对象/命令式/声明式编程的、头等函数的、多范式的、解释性&#xff08;直译式或即时编译&#xff09;的、也可在非浏览器环境下使用的动态脚本语言。Ja…

AI创作助手:介绍 TensorFlow 的基本概念和使用场景

目录 背景 环境测试 入门示例 背景 TensorFlow 是一个强大的开源框架&#xff0c;用于实现深度学习和人工智能模型。它最初由 Google 开发&#xff0c;现在已经成为广泛使用的机器学习框架之一。 TensorFlow 简单来说就是一个用于创建和运行机器学习模型的库。它的核心概念…

安装ssl证书有什么意义?

相信很多网站用户对ssl证书都有一定的了解&#xff0c;它就像是身份证&#xff0c;同时也能保障网站的安全&#xff0c;尤其是一些交易平台&#xff0c;不泄露客户的隐私。为了保证在线客户的隐私信息的安全&#xff0c;中小型企业一定要明白安装ssl证书的重要性。下面JoySSL的…

Nginx实践之使用MaxMind的GeoIP2实现处理不同国家的访问

场景&#xff1a; 因防火墙到期&#xff0c;原网站接入的需要回到公网的解析&#xff0c;经过分析&#xff0c;站点只需要国内访问。于是想到了用地址过滤&#xff0c;目前比较火的是nginx的allow和deny&#xff0c;另外一种是geoip,geoip2 区别&#xff1a; GeoIP用于通过IP获…

ssm班主任助理系统源码和论文

ssm班主任助理系统源码和论文054 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 1、课题背景 由于当今社会科学技术不断发展,科学技术不断发展&#xff0c;21世纪的今天是一个讲究质量和效率的时代&#xff0…

8、Vue 核心技术与实战 智慧商城项目 DAY8~10

1、 项目演示 2、 项目收获 3、 创建项目 4、调整初始化目录 1、删掉&#xff08;1&#xff09;assets中的文件&#xff08;2&#xff09;components中的文件&#xff08;3&#xff09;views中的文件2、(1)修改路由配置&#xff0c;默认的路由是个空数组即可&#xff0c;把路由…

医疗中心疫苗保存,隐藏这招你不知道的技法!

由于疫苗对温度敏感&#xff0c;如果没有在规定温湿度下储存&#xff0c;疫苗的药性很可能发生改变&#xff0c;从疫苗制造的部门到疫苗使用的现场之间的每一个环节&#xff0c;都可能因温度过高而失效。 为了保证从生产、贮存、运输、分发到使用的整个过程中&#xff0c;疫苗始…

销售客户拜访时要获取客户的哪些信息?

俗话说“马无夜草不肥”&#xff0c;信息是销售过程中的关键&#xff0c;谁拿下了信息战谁就占据了市场的制高点。 只有深入了解客户各方面信息&#xff0c;才能有针对性地提供解决方案并达成销售目标。根据我们团队的多年经验&#xff0c;我总结出了两个需要重点考虑的方面&a…