STM32之IIC总线控制ATC24C04

一、存储器介绍

1、电子密码存储概述

单片机的电子密码存储是一种将密码信息以电子形式存储在单片机内部的技术。它通常用于需要保护敏感信息或限制访问权限的应用程序,如安全系统、门禁系统、电子锁等。

电子密码存储可以通过多种方式实现,以下是其中一种常见的概述:

(1)存储器选择:选择适合存储密码的内部或外部存储器。内部存储器通常是非易失性存储器(如闪存),可以在断电情况下保持数据。外部存储器可以是EEPROM(可擦写可编程只读存储器)或其他非易失性存储器(FLASH)。

(2)加密算法:为了增加密码的安全性,可以使用加密算法对密码进行加密。常见的加密算法包括DES(数据加密标准)、AES(高级加密标准)等。密码存储之前,将密码使用加密算法进行加密,然后再存储在存储器中。

(3)存储密码:将经过加密的密码存储在选择的存储器中。可以根据具体需求选择存储密码所需的存储空间大小。

(4)访问控制:为了安全地访问存储的密码,通常需要实现访问控制机制。这可以包括密码验证、访问权限设置等。例如,在门禁系统中,用户可能需要输入正确的密码才能获得访问权限。

(5)密码修改:为了方便用户,通常需要提供一种方式允许用户修改已存储的密码。这可以通过输入当前密码和新密码来实现。

总之,单片机的电子密码存储是通过选择适当的存储器、加密算法和访问控制机制,将密码以电子形式存储在单片机内部的技术。这种技术提供了一种安全可靠的方法来存储和管理密码信息。

2、EEPROM存储器和Flash存储器区别

EEPROM存储器和Flash存储器都属于电可擦除存储器,但由于内部的构成它们有着以下几点区别:
擦写次数:EEPROM存储器能擦写10万次以上,而FLASH存储器一般为1万次以下。
存储容量:在体积(芯片封装大小)相等情况下FLASH存储器的容量大。
适用范围:EEPROM存储器常用于存储经常修改的一些参数(如用户的一些设定值),而FLASH存储器则一般用于存储程序或者一些只读性数据。
通信协议:EEPROM存储器使用IIC通信协议,FLASH存储器使用SPI通信协议。

二、AT24Cxx存储芯片

1、AT24Cxx芯片概述

AT24Cxx是Atmel公司生产的低功耗CMOS型EEPROM存储芯片,采用I2C总线方式进行数据读写,可工作于标准模式、快速模式和高速模式。主要特点是可读可写,掉电数据不丢失。目前常用的有24C02、24C04、24C08、24C16、24C32。

2、AT24C04芯片功能

AT24C04内含4K bit,即512字节存储空间,分成32每页16个字节。并且AT24C04内部把512字节的存储空间分为2部分,每部分256Byte。AT24C04芯片采用I2C总线方式进行数据读写,可工作于标准模式、快速模式和高速模式。AT24Cxx的写周期约为5ms,也就是在写操作后5ms才能正常读出数据

3、AT24C04芯片管脚描述

图AT24Cxx芯片功能管脚

管脚编号管脚名称功能管脚说明
1A0空管脚
2A1

地址输入脚。地址输入脚根据硬件原理图的连接确定,如果管脚接电源,则为1,

接地则为0。

3A2
5SCLI2C通讯接口的串行数据线
6SDAI2C通讯接口的串行时钟线
7WP

为读写保护管脚,低电平时,可以对整个AT24C04器件的512个字节进行读写操作;

高电平后,器件前256个地址的数据被保护,只能读,不可写入,后256个字节数据

可进行读写操作。

4、8GND、VCC芯片电源负极和电源正极

三、AT24C04存储芯片应用

1、AT24C04地址寻址

(1)芯片器件寻址
AT24C04的芯片地址为1010,其地址控制格式为1010A2A1P0R/W。其中A2、A1为可编程地址选择位(A0为空引脚),数据空间由P0位决定,当P0位为“0”时,将对AT24C04的0~255空间数据进行操作;当P0位为“1”时,将对AT24C04的256~511空间数据进行操作。A2、A1引脚接高、低电平得到确定的两位编码加上P0位的数据与芯片地址(1010)形成7位器件的地址码,在7位地址编码最后1位加上数据方向为则构成了AT24C04芯片器件寻址的控制字节(如图12.11所示)。
操作0-255数据空间器件地址 + 写方向 = 10100000 == 0xA0
操作0-255数据空间器件地址 + 读方向 = 10100000 == 0xA1

AT24CXX控制字节格式

(2)片内子地址寻址
芯片片内寻址可对内部512Byte中的任意1个字节进行读/写操作,其寻址范围为00~1FF,共512个寻址单位。但在操作数据寻址的时候需要注意,由于AT24C04芯片分为2个数据区,使用P0为加以区别,当P0 = 0时,操作的是0~255的地址单元,当P0 = 1时,操作的是256~511的地址单元。

2、AT24C04芯片时序操作

(1)单字节写操作时序

  单字节写操作要求在发送起始命令和从器件地址信息(R/W位清零)给从器件后,等待从器件产生应答信号,主器件发送1个字节子地址,即存储器内部地址,因AT24C04容量为512字节,所以子地址为0~512(需要注意P0位的参数,如果P0位参数为0,则无法操作256~511的地址)。主器件在收到从器件的另一个应答信号后,在接下来的时钟周期里主机发送8位数据,EEPROM再次应答,并在主器件产生停止信号后开始内部数据的擦写。在内部擦写过程中EEPROM不再应答主器件的任何请求。

AT24CXX单字节操作时序

起始条件 --> 器件地址 + 写方向 -->接收AT24C04的应答 --> 就是8位的数据(代表要写到这个AT24C04的哪个位置)-->接收AT24C04的应答 --> 发送8位的数据--> 接收AT24C04的应答-->停止条件

(2)页写操作时序

AT24C04提供32个16字节的页空间,用页写AT24C04可以一次写入16个字节数据,页写操作初始化与字节写相同,但在EEPROM接受到1字节数据后单片机并不发送停止条件,而是继续发送15字节数据,在每接受一字节数据,EEPROM发送一位应答。在发送完8字节数据后,单片机需发送停止信号以终止操作
在进行页写操作时,存储器的子地址低三位会自动增一,但由于高位并不自增,所以在子地址加到页空间边界,即写入16字节后,下一字节会自动写入该页空间的第一字节,覆盖之前的数据,并且如果连续写入数据的地址超过256,地址将从0地址重新开始,从0地址开始的数据将覆盖之前的数据。AT42C04在接收到n+1字节数据和主器件发送的停止信号后启动内部写周期将数据写到数据区,所有接收的数据在一个写周期内写入EEPROM芯片内部。

AT24CXX页写操作时序

起始条件 --> 器件地址 + 写方向 -->接收AT24C04的应答 --> 就是8位的数据(代表要写到这个AT24C04的哪个位置)-->接收AT24C04的应答 --> 不断发送8位的数据(不能超过当前这一页的地址,否则会回到开头覆盖写入)--> 接收AT24C04的应答-->停止条件

(3)单字节读操作时序

主器件首先通过发送起始信号,接着发送从器件地址,在接收到应答后,再发送想读取的字节数据的地址执行一个伪写操作。在AT24C04应答之后,主器件重新发送发送起始信号和从器件地址(此时的器件地址最低位为1,表示读操作),此时子地址指向的为之前定义的值,AT24C04响应并发送应答信号,然后输出所要求的一个 8 位字节数据,主器件在接收到数据后发送非应答信号,并产生停止条件。

AT24CXX单字节读操作时序

起始条件 --> 器件地址 + 写方向 -->接收AT24C04的应答 --> 就是8位的数据(代表要读到这个AT24C04的哪个位置)--> 接收AT24C04的应答 -->起始条件 --> 器件地址 + 读方向 -->接收AT24C04的应答 -->接收AT24c04发送过来的数据 -->读完了回非应答信号 --> 停止条件

(4)连续读操作时序

  连续读操作初始部分与单字节操作相同,在AT24C04发送完一个8 位字节数据后,主器件产生一个应答信号来响应,告知AT24C04主器件要求更多的数据。对应每个主机产生的应答信号,AT24C04将发送一个 8 位数据字节,当主器件发送非应答信号并发送停止位时结束此读操作。读操作可以连续进行,EEPROM内部地址会自动增加,这样整个寄存器区域在可在一个读操作内全部读出。当读取的字节超过最大地址时,地址计数器将翻转到0并继续输出数据字节。

AT24CXX连续读操作时序

起始条件 --> 器件地址 + 写方向 -->接收AT24C04的应答 --> 就是8位的数据(代表要读到这个AT24C04的哪个位置)-->接收AT24C04的应答 -->起始条件 --> 器件地址 + 读方向 -->接收AT24C04的应答 -->不断接收AT24c04发送过来的数据 -->直到回非应答信号才结束这次的接收 --> 停止条件

四、实例

#include "iic.h"

/****************************
函数功能:初始化IIC总线的IO口
函数形参:void
函数返回值:void
函数说明:
PA8 -- SCL -- 推挽输出
PC9 -- SDA 
1.输入输出模式切换
SDA线既可以接收数据也可以发送数据
输入模式的时候不能输出数据
输出模式的时候可以读取数据
2.开漏输出
开漏输出:只能输出低电平
如果输出高电平就是断开输出电路
****************************/
void Iic_PortInit(void)
{
	GPIO_InitTypeDef  GPIO_InitStruct;//定义了一个结构体变量
	
	//1. 打开GPIOB的时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
	//2. 配置GPIO口功能
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//配置输出模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//配置为推挽
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8;//选择8号管脚
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉
	GPIO_InitStruct.GPIO_Speed = GPIO_Low_Speed;//低速
	GPIO_Init(GPIOA, &GPIO_InitStruct); 
	
	GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;//配置为开漏
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;//选择9号管脚
	GPIO_Init(GPIOC, &GPIO_InitStruct); 
}

/****************************
函数功能:起始条件
函数形参:void
函数返回值:void
函数说明:在时钟线高电平期间,数据线产生下降沿
****************************/
void IIC_Start(void)
{
	SDA_H;
	SCL_H;
	Delay_Us(2);//起始条件的建立时间
	SDA_L; 
	Delay_Us(2);//起始条件的保持时间
	SCL_L;//保证周期完整
}


/****************************
函数功能:停止条件
函数形参:void
函数返回值:void
函数说明:在时钟线高电平期间,数据线产生上升沿
****************************/
void IIC_Stop(void)
{
	SDA_L;
	SCL_H;
	Delay_Us(2);//停止条件的建立时间
	SDA_H;
	Delay_Us(2);//停止和启动条件之间的总线空闲时间
}

/****************************
函数功能:发送应答位
函数形参:u8 ack
函数返回值:void
函数说明:0:代表应答
1:代表非应答
****************************/
void Send_Ack(u8 ack)
{
	SCL_L;//发送方准备发送数据
	if(ack)
	{
		SDA_H;
	}
	else
	{
		SDA_L;
	}
	Delay_Us(2);//发送数据所需要的时间
	SCL_H;
	Delay_Us(2);//接收数据所需要的时间
	SCL_L;
	Delay_Us(2);//保证一个完整的周期
}

/****************************
函数功能:接收应答位
函数形参:void
函数返回值:u8
函数说明:
		0:代表应答
		1:代表非应答
****************************/
u8 Receive_Ack(void)
{
	u8 ack = 0;
	SDA_H;//断开输出电路
	SCL_L;//发送方准备发送数据
	Delay_Us(2);//发送数据所需要的时间
	SCL_H;
	if(SDA)
	{
		ack = 1;
	}
	Delay_Us(2);//接收数据所需要的时间
	SCL_L;
	Delay_Us(2);//保证一个完整的周期
	return ack;
}

/****************************
函数功能:发送一个字节并接收一个应答位
函数形参:u8 data
函数返回值:u8
函数说明:
		0:代表应答
		1:代表非应答
****************************/
u8 Send_Byte_Receive_Ack(u8 data)
{
	u8 i,ack = 0;
	for(i = 0; i < 8; i++)
	{
		SCL_L;//发送方准备发送数据
		//1100 0011
		//0100 0000
		if(data & 0x80 >> i)
		{
			SDA_H;
		}
		else
			SDA_L;
		Delay_Us(2);//发送数据所需要的时间
		SCL_H;
		Delay_Us(2);//接收数据所需要的时间
	}
	ack = Receive_Ack();
	return ack;
}

/****************************
函数功能:接收一个字节并发送一个应答位
函数形参:u8 data
函数返回值:u8
函数说明:
		0:代表应答
		1:代表非应答
****************************/
u8 Receive_Byte_Send_Ack(u8 ack)
{
	u8 i = 0;
	u8 data = 0;
	for(i = 0; i < 8; i++)
	{
		SCL_L;//发送方准备发送数据
		Delay_Us(2);//发送数据所需要的时间
		SDA_H;//断开输出电路
		SCL_H;
		data <<= 1;//空出最低位
		if(SDA)
		{
			data |= 1;
		}
		Delay_Us(2);//接收数据所需要的时间
	}
	Send_Ack(ack);
	return data;
}
#include "at24c04.h"

/****************************
函数功能:页写
函数形参:u8 addr---写入的地址
u8 *str---写入的数据
u8 num--写入的个数
函数返回值:u8
函数说明:
****************************/
u8 AT24C04_PAGE_WRITE(u8 addr,u8 *str, u8 num)
{
	IIC_Start();
	if(Send_Byte_Receive_Ack(AT24C04_WRITEADDRESS))//先发器件地址写方向
	{
		IIC_Stop();
		return 1;
	}
	if(Send_Byte_Receive_Ack(addr))//发送写入的地址
	{
		IIC_Stop();
		return 2;
	}
	while(num--)//不断发送数据
	{
		if(Send_Byte_Receive_Ack(*str))
		{
		IIC_Stop();
		return 3;
		}
		str++;
	}
	IIC_Stop();
	Delay_ms(5);
	return 0;
}
/****************************
函数功能:读数据
函数形参:u8 addr---写入的地址
u8 *str---写入的数据
u8 num--写入的个数
函数返回值:u8
函数说明:

****************************/
u8 AT24C04_READ(u8 addr,u8 *str, u8 num)
{
	IIC_Start();
	if(Send_Byte_Receive_Ack(AT24C04_WRITEADDRESS))//先发器件地址写方向
	{
		IIC_Stop();
		return 4;
	}
	if(Send_Byte_Receive_Ack(addr))//发送写入的地址
	{
		IIC_Stop();
		return 5;
	}
	IIC_Start();//起始条件
	if(Send_Byte_Receive_Ack(AT24C04_READADDRESS))//发送读的地址
	{
		IIC_Stop();
		return 6;
	}	
	num = num - 1;
	while(num--)
	{
		*str = Receive_Byte_Send_Ack(0);//前面的数据都发应答
		str++;
	}
	*str = Receive_Byte_Send_Ack(1);//后面的数据发非应答
	IIC_Stop();
	return 0;
}
#ifndef __IIC_H_
#define __IIC_H_

#include "stm32f4xx.h"
#include "delay.h"

#define SCL_H  GPIO_SetBits(GPIOA,GPIO_Pin_8)
#define SCL_L  GPIO_ResetBits(GPIOA,GPIO_Pin_8)
#define SDA_H  GPIO_SetBits(GPIOC,GPIO_Pin_9)
#define SDA_L  GPIO_ResetBits(GPIOC,GPIO_Pin_9)
#define SDA    GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_9)


void Iic_PortInit(void);
void IIC_Start(void);
void IIC_Stop(void);
u8 Send_Byte_Receive_Ack(u8 data);
u8 Receive_Byte_Send_Ack(u8 ack);


#endif
#ifndef __AT24C04_H_
#define __AT24C04_H_

#include "stm32f4xx.h"
#include "iic.h"

#define AT24C04_WRITEADDRESS 0XA0
#define AT24C04_READADDRESS 0XA1


u8 AT24C04_READ(u8 addr,u8 *str, u8 num);
u8 AT24C04_PAGE_WRITE(u8 addr,u8 *str, u8 num);


#endif

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第二十四天| 77. 组合。

77. 组合 题目链接&#xff1a;组合 题目描述&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 解题思路&#xff1a; 本题是经典的回溯法解决的组合问题&#xff0c;回溯问题搞清楚纵向递归横向遍历即…

网络安全之SSL证书加密

简介 SSL证书是一种数字证书&#xff0c;遵守SSL协议&#xff0c;由受信任的数字证书颁发机构&#xff08;CA&#xff09;验证服务器身份后颁发。它具有服务器身份验证和数据传输加密的功能&#xff0c;能够确保数据在传输过程中的安全性和完整性。 具体来说&#xff0c;SSL证…

贝叶斯的缺点

贝叶斯方法是一种统计学习方法&#xff0c;通过利用贝叶斯定理来计算给定先验概率的情况下&#xff0c;后验概率的条件概率。虽然贝叶斯方法在许多领域中应用广泛且有效&#xff0c;但也存在一些缺点。以下是一些贝叶斯方法的缺点的例子&#xff1a; 1、先验概率的选择 贝叶斯方…

混合攻击流量对系统安全性的综合评估

很多针对安全设备的测试仅仅针对安全设备本身的防护&#xff0c;比如防御的漏洞攻击行为、恶意代码是否足够多&#xff0c;能否抵御大流量的L23层DDoS或者应用层的DDoS攻击&#xff0c;却没有考虑是否防御攻击时&#xff0c;一并阻止了正常的业务流量。以下图为例&#xff0c;当…

分享一个WPF项目

最近在学习WPF开发方式&#xff0c;找到一些项目进行拆解学习&#xff1b;本位主要分享一个WPF项目&#xff0c;叫做WPFDevelopers&#xff0c;在git上大约有1.3K星&#xff0c;话不多说&#xff0c;先看看效果&#xff1a; 这个项目开发可以编译启动后直接查看样例、Xaml、Cha…

VSCode开发常用扩展记录

1、Chinese 2、document this 可以自动为ts和js文件生成jsDoc注释 3、ESLint 能够查找并修复js代码中的问题 4、koroFileHeader 5、Prettier 代码格式化

分别用JavaScript,Java,PHP,C++实现桶排序的算法(附带源码)

桶排序是计数排序的升级版。它利用了函数的映射关系&#xff0c;高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效&#xff0c;我们需要做到这两点&#xff1a; 在额外空间充足的情况下&#xff0c;尽量增大桶的数量使用的映射函数能够将输入的 N 个数据均匀的分…

获取真实 IP 地址(二):绕过 CDN(附链接)

一、DNS历史解析记录 DNS 历史解析记录指的是一个域名在过去的某个时间点上的DNS解析信息记录。这些记录包含了该域名过去使用的IP地址、MX记录&#xff08;邮件服务器&#xff09;、CNAME记录&#xff08;别名记录&#xff09;等 DNS 信息。DNS 历史记录对于网络管理员、安全研…

虹科技术丨一文详解IO-Link Wireless技术如何影响工业无线自动化

来源&#xff1a;虹科工业智能互联 虹科技术丨一文详解IO-Link Wireless技术如何影响工业无线自动化 原文链接&#xff1a;https://mp.weixin.qq.com/s/qVIkdeI5zzzagPd0UEkfDg 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #工业自动化 #IO-Link Wireless #工业无…

【HarmonyOS应用开发】Web组件的使用(十三)

文章末尾含&#xff1a;Web组件抽奖案例&#xff08;ArkTS&#xff09;-示例源码下载 Web组件的使用 一、概述 相信大家都遇到过这样的场景&#xff0c;有时候我们点击应用的页面&#xff0c;会跳转到一个类似浏览器加载的页面&#xff0c;加载完成后&#xff0c;才显示这个页…

MySQL 备份恢复

1.1 MySQL日志管理 在数据库保存数据时&#xff0c;有时候不可避免会出现数据丢失或者被破坏&#xff0c;这样情况下&#xff0c;我们必须保证数据的安全性和完整性&#xff0c;就需要使用日志来查看或者恢复数据了。 数据库中数据丢失或被破坏可能原因&#xff1a; 误删除数…

Git 实战场景过程(工作总结篇)

目录 前言1. Git远程仓库建立分支&#xff0c;本地未显示1.1 问题所示1.2 知识补充 2. Git暂存内容切换分支2.1 问题所示2.2 知识补充 3. Git放弃修改数据3.1 问题所示3.2 知识补充 4. git merge合并查看差异 前言 主要总结工作中的疑惑点&#xff0c;如果你也有相应的场景&am…

Request Response 基础篇

Request & Response 在之前的博客中&#xff0c;初最初见到Request和Response对象&#xff0c;是在Servlet的Service方法的参数中&#xff0c;之前隐性地介绍过Request的作用是获取请求数据。通过获取的数据来进行进一步的逻辑处理&#xff0c;然后通过对Response来进行数…

代码随想录算法训练营第38天 | 动态规划理论基础 + 509.斐波那契数 + 70.爬楼梯 + 746.使用最小花费爬楼梯

今日任务 理论基础 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯 动态规划理论基础 理论基础&#xff1a;代码随想录 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划…

Java 正则匹配sql

文章目录 正则匹配sql表名称insert intoupdate 正则表达式什么时候要加^$ 在线正则校验 正则匹配sql表名称 insert into insert into PING_TABLE (CODE, NAME) VALUES(0, 待提交),(1, 审核中),(2, 审核通过),(3, 已驳回); regex -> insert\sinto\s(\w)\s*\(?update upda…

Enemy Rat(老鼠模型)

信息: - 模型有 1.491 个顶点。 - 纹理&#xff1a;颜色、法线、粗糙度、发射、金属、等级&#xff08;2048x2048 尺寸&#xff09; 下载&#xff1a; ​​Unity资源商店链接 资源下载链接 效果图&#xff1a;

双创竞赛项目申报:Java + Spring Boot的实战指南

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【解决方案】在Vue、HTML项目中使用@spacechart/translate 插件实现在线实时翻译、自定义翻译

SpaceChart/Translate SpaceChart/Translate 是一个可配置的翻译插件&#xff0c;适用于任何环境&#xff0c;让开发者不再需要注重插件本身&#xff1b;插件支持自定义翻译引擎&#xff0c;快速生成对应的AI翻译模型客户端插件 Repository GitHubNPM Browser Support La…

网络安全全栈培训笔记(60-服务攻防-中间件安全CVE复现WeblogicJenkinsGlassFish)

第60天 服务攻防-中间件安全&CVE复现&Weblogic&Jenkins&GlassFish 知识点: 中间件及框架列表: lIS,Apache,Nginx,Tomcat,Docker,Weblogic,JBoos,WebSphere,Jenkins, GlassFish,Jira,Struts2,Laravel,Solr,Shiro,Thinkphp,Sprng,Flask,jQuery 1、中间件-Web…

什么是ACL?

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle OC…