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

在上一节中我们了解到,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.rhkb.cn/news/103190.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VM——获取图像中的圆环区域

、需求&#xff1a;下图是圆柱形铝罐&#xff0c;需要获取图像中的罐沿区域。 2、方法如下&#xff1a; (1)通过找外圆&#xff0c;提取圆形区域 &#xff08;2&#xff09;利用“拷贝填充”模块&#xff0c;绘制外圆ROI&#xff0c;选择“输出掩膜” &#xff08;3&#xff09…

Eclipse(STS):pom.xml 报错:Multiple markers at this line

pom.xml 报错&#xff1a;Multiple markers at this line STS中&#xff0c;项目能够正常运行&#xff0c;但是 pom.xml 报错&#xff1a;Multiple markers at this line 项目本身没有任何修改&#xff0c;之前不报错的&#xff0c;突然报错了。 Multiple markers at this li…

《基础教育论坛》期刊简介及投稿要求

《基础教育论坛》杂志是经国家新闻出版总署批准、国内外公开发行的综合性教育学术期刊。作者可通过&#xff0c;中华人民共和国新闻出版总署的网站进行出版许可及刊号的查询。 2009年&#xff0c;《基础教育论坛&#xff08;综合版&#xff09;》杂志创刊。 2012年&#xff0…

SOLIDWORKS 2023中装配体配合的正确使用方法 硕迪科技

-SOLIDWORKS 装配体打开时是由不同的阶段和性能检查组成的。如果在创建装配体时未应用基本的配合方法&#xff0c;问题会随着时间的推移而累积&#xff0c;并且在使用时会出现明显的速度减慢。 如果您的装配体运行速度很慢&#xff0c;则很可能是在创建配合时出现了不良操作的症…

webrtc学习(五)-peerconnect_client

一.类关系图 conduct实现webrtc native api相关实现的调用&#xff0c;创建answer&#xff0c;创建offer&#xff0c;是最核心的&#xff0c;对于两个模块的调度&#xff1b;mainwindow主要用于界面的展示与调度。橙色模块主要是信令模块&#xff0c;所有的用户的登录登出交换信…

基于MATLAB开发AUTOSAR软件应用层Code mapping专题-part 7 Function callers标签页介绍

不知不觉这个code-mapping专题已经写了6篇文章了,今天是我们这个专题的最后一篇文章了介绍Function callers 这个其实很简单,以前的文章里也有提到CS接口实现两个SWC之间的CS调用,我们在从Code-mapping的角度在说下 首先还是看下模型 我们还记得在simulink里我们用function…

JVM——类加载与字节码技术—字节码指令

2.字节码指令 2.1 入门 jvm的解释器可以识别平台无关的字节码指令&#xff0c;解释为机器码执行。 2a b7 00 01 b1 this . init&#xff08;&#xff09; return 准备了System.out对象&#xff0c;准备了参数“hello world”,准备了对象的方法println(String)V&#xff…

sip网络号角喇叭 sip音柱 POE供电广播音箱 ip网络防水对讲终端 sip网络功放

SV-7042TP网络号角喇叭 一、描述 SV-7042TP是我司的一款SIP网络号角喇叭&#xff0c;具有10/100M以太网接口&#xff0c;内置有一个高品质扬声器&#xff0c;将网络音源通过自带的功放和喇叭输出播放&#xff0c;可达到功率30W。SV-7042TP作为SIP系统的播放终端&#xff0c;可…

OpenEuler 安装mysql

下载安装包 建议直接使用在openEuler官方编译移植过的mysql-5.7.21系列软件包 参考&#xff1a;操作系统迁移实战之在openEuler上部署MySQL数据库 | 数据库迁移方案 | openEuler社区官网 MySQL 5.7.21 移植指南&#xff08;openEuler 20.03 LTS SP1&#xff09; | 数据库移植…

panda3d加载模型复习和python面向对象编程属性学习

运行一个python示例&#xff1b;然后去除一些代码&#xff0c;只剩下加载模型相关&#xff0c;如下&#xff1b; from panda3d.core import loadPrcFileData # Configure the parallax mapping settings (these are just the defaults) loadPrcFileData("", "p…

【Docker】存储卷Volume

Docker Volume概念 什么是存储卷 存储卷就是将宿主机的本地文件系统中存在的某个目录直接与容器内部的文件系统上的某一目录建立绑定关系。这就意味着&#xff0c;当我们在容器中的这个目录下写入数据时&#xff0c;容器会将其内容直接写入到宿主机上与此容器建立了绑定关系的…

Vue 中hash 模式与 history 模式的区别

hash 模式&#xff1a; - 地址中永远带着 # 号&#xff0c;不美观。 - 兼容性比较好。 - 通过手机 app 分享地址时&#xff0c;如果 app 效验严格&#xff0c;该地址会被标记为不合法。 history 模式&#xff1a; - 地址干净&#xff0c;美观。 - 兼容性和 hash 模式相比…

es和数据库同步方案

5.5 课程信息索引同步 5.5.1 技术方案 通过向索引中添加课程信息最终实现了课程的搜索&#xff0c;我们发现课程信息是先保存在关系数据库中&#xff0c;而后再写入索引&#xff0c;这个过程是将关系数据中的数据同步到elasticsearch索引中的过程&#xff0c;可以简单成为索引…

nginx基于端口如何配置虚拟主机

在 Nginx 中配置基于端口的虚拟主机&#xff08;也称为服务器块&#xff09;与配置基于域名的虚拟主机类似&#xff0c;但是你需要指定监听的端口。以下是基于端口的虚拟主机配置示例&#xff1a; 假设我们要配置两个不同的虚拟主机&#xff0c;一个监听 8080 端口&#xff0c…

机器学习---常见的距离公式(欧氏距离、曼哈顿距离、标准化欧式距离、余弦距离、杰卡德距离、马氏距离、切比雪夫距离、闵可夫斯基距离、K-L散度)

1. 欧氏距离 欧几里得度量&#xff08;euclidean metric&#xff09;&#xff08;也称欧氏距离&#xff09;是一个通常采用的距离定义&#xff0c;指在m维空 间中两个点之间的真实距离&#xff0c;或者向量的自然长度&#xff08;即该点到原点的距离&#xff09;。在二维和三维…

分布式锁系列之zookeeper分布式锁和mysql分布式锁

目录 介绍 下载安装 基本指令​编辑 java集成zookeeper 官方提供版 永久节点 临时节点​编辑 永久序列化节点 判断当前节点是否存在 获取当前节点中的数据内容 获取当前节点的子节点 更新节点内容 删除节点 zookeeper实现分布式锁 Mysql实现分布式锁 总结 介绍 ZooK…

在家构建您的迷你 ChatGPT

ChatGPT 玩起来很有趣。您很可能还希望拥有自己的私下运行的副本。实际上,这是不可能的,因为 ChatGPT 不是一个可供下载的软件,并且它需要强大的计算机能力才能运行。但是您可以构建一个可以在商用硬件上运行的精简版本。在这篇文章中,您将了解 什么语言模型可以表现得像 C…

HDLBits-Verilog学习记录 | Verilog Language-Basics(2)

文章目录 9.Declaring wires | wire decl10. 7458 chip 9.Declaring wires | wire decl problem:Implement the following circuit. Create two intermediate wires (named anything you want) to connect the AND and OR gates together. Note that the wire that feeds the …

类加载器与双亲委派

类加载器与双亲委派 Java 类加载器&#xff08;Class Loader&#xff09;是 Java 虚拟机&#xff08;JVM&#xff09;的一部分&#xff0c;负责将类的字节码加载到内存中&#xff0c;并将其转换为可执行的 Java 对象。类加载器在 Java 应用程序中起着重要的作用&#xff0c;它…

【校招VIP】TCP/IP模型之常用协议和端口

考点介绍&#xff1a; 大厂测试校招面试里经常会出现TCP/IP模型的考察&#xff0c;TCP/IP协议是网络基础知识&#xff0c;是互联网的基石&#xff0c;不管你是做开发、运维还是信息安全的&#xff0c;TCP/IP 协议都是你绕不过去的一环&#xff0c;程序员需要像学会看书写字一样…