STC32G 单片机EEPROM 操作实例

news2025/7/11 17:01:21

一  STC32G 单片机EEPROM简介

STC32G系列单片机内部集成了大量的EEPROM,特别是STC32G12K128集成多达128K EEPROM。

STC32G内部EEPROM可擦写10万次,分若干扇区,每个扇区512字节。EEPROM的写操作只能将1写为0。要将0写为1,必须擦除扇区。EEPROM的读写是以字节为单位,擦除是以扇区为单位进行,要修改扇区内容,需要先将整个扇区内容读入内存,然后擦除整个扇区,然后再将内容写入扇区。STC32G的EEPROM操作时间与系统频率相关,设置好IAP_TPS寄存器值后,操作所需时间由硬件自动控制,IAP_TPS寄存器值 = 系统频率 / 1000000,如系统频率是30MHz,IAP_TPS寄存器值设为30.

与EEPROM相关的寄存器如下:

 STC32G12K128的数据寄存器,仅IAP_DATA有效。

操作EEPROM的命令如下:

 STC32G系列单片机仅支持命令CMD0~CMD3.

要操作STC32G EEPROM必须将IAP_CONTR寄存器的IAPEN设为1.在设置完操作地址与操心命令后必须分别向IAP_TRIG分别写入0x5A、0xA5,才能使命令生效。

二 与STC32G 单片机EEPROM 操作相关库函数的编写

EEPROM 的操作离不开操作与EEPROM相关的寄存器,如果不写相关的库函数,每次都直接去写操作寄存器的代码,非常麻烦,且工作量大,我们先写好库函数,后面要用时,调用即可,就会省去很多麻烦,提高效率。下面是我写的库函数。先看下头文件。

/*STC32G_EEPROM.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 07/18/2022
//macro function/
IAP_STANDBY(); 																					//idle,no operation command
IAP_READ();																							//read command
IAP_WRITE();																						//write command
IAP_ERASE();																						//erase section command
IAP_ENABLE();																						//IAP operation enable
IAP_DISABLE();																					//IAP operation disable

//Function
EEPROM_Disable();																			 									//Set eeprom operating disable, return void
EEPROM_Trig();																				 									//set INT state,then send eeprom operating trigger signal, resore INT state,return void
EEPROM_SectorErase(u32 EE_address);                    									//erase EEPROM section, return void
EEPROM_Read_nChar(ui32 EE_address,ui8* destData, u16 number);						//read n char from eeprom begine from EE_address,return void
EEPROM_Write_nChar(u32 EE_address,ui8* sourceData,u16 number);				  //write n char to eeprom begine from EE_address, return void
EEPROM_Write_Integer(u32 EE_address,i16 sourceData);										//write integer to eeprom begine from EE_address, return void	
EEPROM_Write_Long(u32 EE_address,i32 sourceData);												//write long to eeprom begine from EE_address, return void	
EEPROM_Write_Float(u32 EE_address,f32 sourceData);											//write float to eeprom begine from EE_address,return void	
EEPROM_Write_Double(u32 EE_address,f64 sourceData);											//write double to eeprom begine from EE_address,return void	
EEPROM_Write_String(u32 EE_address,char* sourceStr);										//read string from eeprom begine from EE_address, return void
EEPROM_Read_Integer(u32 EE_address,i16* destData);											//read integer from eeprom begine from EE_address,return i16
EEPROM_Read_Long(u32 EE_address,i32* destData);													//read long from eeprom begine from EE_address, return i32
EEPROM_Read_Float(u32 EE_address,f32* destData);												//ead float from eeprom begine from EE_address,return f32
EEPROM_Read_Double(u32 EE_address,f64* destData);												//read double from eeprom begine from EE_address, return f64
EEPROM_Read_String(u32 EE_address,char* str);														//read string from eeprom begine from EE_address,return void
EEPROM_Read_StringnChar(u32 EE_address,char* str, ui16 number);					//read string n char from eeprom begine from EE_address, return void

*/

#ifndef	__STC32G_EEPROM_H
#define	__STC32G_EEPROM_H

#include	"config.h"
#include "mtype.h"
#include <STC32G.h>

#define		IAP_STANDBY()	{IAP_CMD = 0x00;}		//idle,no operation command
#define		IAP_READ()		{IAP_CMD = 0x01;}		//read command
#define		IAP_WRITE()		{IAP_CMD = 0x02;}		//write command
#define		IAP_ERASE()		{IAP_CMD = 0x03;}		//erase section command
#define	IAP_ENABLE()		{IAPEN = 1; IAP_TPS = FOSC / 1000000;}     //FOSC defined in  config.h
#define	IAP_DISABLE()		{IAP_CONTR = 0; IAP_CMD = 0; IAP_TRIG = 0; IAP_ADDRH = 0xFF; IAP_ADDRL = 0xFF;}

/*********************************************************
Function: EEPROM_Disable();
Return value: void
Discription: Set eeprom operating disable
Example:
  EEPROM_Disable();  
*********************************************************/
void	EEPROM_Disable();

/****************************************************************
Function: EEPROM_Trig();
Return value: void
Discription: set INT state,then send eeprom operating trigger signal, resore INT state
Example:
  EEPROM_Trig(); 
****************************************************************/
void EEPROM_Trig();

/*********************************************************
Function: 	EEPROM_SectorErase(u32 EE_address);
Return value: void
EE_address: eeprom address
Discription: erase EE_address eeprom section  
Example:
  EEPROM_SectorErase(0x90F);
*********************************************************/
void	EEPROM_SectorErase(u32 EE_address);

/*********************************************************
Function: 	EEPROM_Write_nChar(u32 EE_address,ui8* sourceData,u16 number);
Return value: void
EE_address: eeprom address
sourceData: char arry name to write to eeprom
Discription: write n char to eeprom begine from EE_address
Example:
  EEPROM_Write_nChar(0x90F,mCharArray, 30);
*********************************************************/
void 	EEPROM_Write_nChar(u32 EE_address,ui8* sourceData,u16 number);

/*********************************************************
Function: 	EEPROM_Read_nChar(ui32 EE_address,ui8* destData, u16 number);
Return value: void
EE_address: eeprom address
destData: char arry name to store read data
Discription: read n char from eeprom begine from EE_address
Example:
  EEPROM_Read_nChar(0x90F,mCharArray, 30);
*********************************************************/
void 	EEPROM_Read_nChar(ui32 EE_address,ui8* destData, u16 number);

/*********************************************************
Function: 	EEPROM_Write_Integer(u32 EE_address,i16 sourceData);
Return value: void
EE_address: eeprom address
sourceData: data to write to eeprom
Discription: write integer to eeprom begine from EE_address
Example:
  EEPROM_Write_Integer(0x90F,1600);
*********************************************************/
void 	EEPROM_Write_Integer(u32 EE_address,i16 sourceData);

/*********************************************************
Function: 	EEPROM_Write_Long(u32 EE_address,i32 sourceData);
Return value: void
EE_address: eeprom address
sourceData: data to write to eeprom
Discription: write long to eeprom begine from EE_address
Example:
  EEPROM_Write_Long(0x90F,1600);
*********************************************************/
void 	EEPROM_Write_Long(u32 EE_address,i32 sourceData);

/*********************************************************
Function: 	EEPROM_Write_Float(u32 EE_address,f32 sourceData);
Return value: void
EE_address: eeprom address
sourceData: data to write to eeprom
Discription: write float to eeprom begine from EE_address
Example:
  EEPROM_Write_Long(0x90F,1600.53);
*********************************************************/
void 	EEPROM_Write_Float(u32 EE_address,f32 sourceData);

/*********************************************************
Function: 	EEPROM_Write_Double(u32 EE_address,f64 sourceData);
Return value: void
EE_address: eeprom address
sourceData: data to write to eeprom
Discription: write double to eeprom begine from EE_address
Example:
  EEPROM_Write_Double(0x90F,1600.53);
*********************************************************/
void 	EEPROM_Write_Double(u32 EE_address,f64 sourceData);

/*********************************************************
Function: 	EEPROM_Write_String(u32 EE_address,char* sourceStr);
Return value: void
EE_address: eeprom address
sourceStr: string  to write to eeprom
Discription: write string to eeprom begine from EE_address
Example:
  EEPROM_Write_String(0x90F,"Hello world");
*********************************************************/
void 	EEPROM_Write_String(u32 EE_address,char* sourceStr);

/*********************************************************
Function: 	EEPROM_Read_Integer(u32 EE_address,i16* destData);
Return value: i16
EE_address: eeprom address
destData: addess to store data to read 
Discription: read integer from eeprom begine from EE_address
Example:
  i16 tem;
  EEPROM_Read_Integer(0x90F,&tem);
*********************************************************/
i16 EEPROM_Read_Integer(u32 EE_address,i16* destData);

/*********************************************************
Function: 	EEPROM_Read_Long(u32 EE_address,i32* destData);
Return value: i32
EE_address: eeprom address
destData: addess to store data to read 
Discription: read long from eeprom begine from EE_address
Example:
  i32 tem;
  EEPROM_Read_Long(0x90F,&tem);
*********************************************************/
i32 EEPROM_Read_Long(u32 EE_address,i32* destData);

/*********************************************************
Function: 	EEPROM_Read_Float(u32 EE_address,f32* destData);
Return value: f32
EE_address: eeprom address
destData: addess to store data to read 
Discription: read float from eeprom begine from EE_address
Example:
  f32 tem;
  EEPROM_Read_Float(0x90F,&tem);
*********************************************************/
f32 EEPROM_Read_Float(u32 EE_address,f32* destData);

/*********************************************************
Function: 	EEPROM_Read_Double(u32 EE_address,f64* destData);
Return value: f64
EE_address: eeprom address
destData: addess to store data to read 
Discription: read double from eeprom begine from EE_address
Example:
  f64 tem;
  EEPROM_Read_Double(0x90F,&tem);
*********************************************************/
f64 EEPROM_Read_Double(u32 EE_address,f64* destData);

/*********************************************************
Function: 	EEPROM_Read_String(u32 EE_address,char* str);
Return value: void
EE_address: eeprom address
str: addess to store data to read
Discription: read string from eeprom begine from EE_address
Example:
  char str[20];
  EEPROM_Read_String(0x90F,str);
*********************************************************/
void EEPROM_Read_String(u32 EE_address,char* str);

/*********************************************************
Function: 	EEPROM_Read_StringnChar(u32 EE_address,char* str);
Return value: void
EE_address: eeprom address
str: addess to store read data
number: number of char to read
Discription: read string n char from eeprom begine from EE_address
Example:
  char str[20];
  EEPROM_Read_StringnChar(0x90F,str, 10);
*********************************************************/
void EEPROM_Read_StringnChar(u32 EE_address,char* str, ui16 number);

#endif

头文件的开头注释部分列出了定义的宏函数与函数,编程使用是直接复制粘贴,替换参数即可:

再看下库函数的源码:

/*STC32G_EEPROM.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 07/18/2022
*/

#include "STC32G_EEPROM.h"

//****************************************************************
void EEPROM_Disable()
{
	IAP_CONTR = 0;			
	IAP_CMD   = 0;			
	IAP_TRIG  = 0;			
	IAP_ADDRE = 0xff;   //set a disable operate addr
	IAP_ADDRH = 0xff;   //set a disable operate addr
	IAP_ADDRL = 0xff;   //set a disable operate addr
}
//End of  EEPROM_Disable(void)

//****************************************************************
void EEPROM_Trig()
{
	F0 = EA;    //save EA state
	EA = 0;     //INT disable
	IAP_TRIG = 0x5A;
	IAP_TRIG = 0xA5;                    																																			
	_nop_();   
	_nop_();
	_nop_();
	_nop_();
	EA = F0;    //restore EA
}
//End of  EEPROM_Disable()

//****************************************************************
void EEPROM_SectorErase(u32 EE_address)
{
	IAP_ENABLE();                       
	IAP_ERASE();                      
	
	IAP_ADDRL = (u8)EE_address;   
	IAP_ADDRH = (u8)(EE_address >> 8);  
	IAP_ADDRE = (u8)(EE_address >> 16); 
	
	     
	EEPROM_Trig();                      
	EEPROM_Disable();                   
}
//End of EEPROM_SectorErase(u32 EE_address)

//****************************************************************
void EEPROM_Write_nChar(u32 EE_address,ui8* sourceData,u16 number)
{
	IAP_ENABLE();                       
	IAP_WRITE();                        
	do
	{
		IAP_ADDRL = (u8)EE_address;  
		IAP_ADDRH = (u8)(EE_address >> 8); 
		IAP_ADDRE = (u8)(EE_address >> 16);        
		IAP_DATA  = *sourceData; 
		
		EEPROM_Trig();  
		
		EE_address++;                   
		sourceData++;                    
	}while(--number);                  
	EEPROM_Disable();
}
//End of EEPROM_Write_nChar(u32 EE_address,ui8* sourceData,u16 number)

//****************************************************************
void EEPROM_Read_nChar(ui32 EE_address,ui8* destData, u16 number)
{
	IAP_ENABLE();                          
	IAP_READ();                            
	do
	{
		IAP_ADDRL = (u8)EE_address; 
		IAP_ADDRH = (u8)(EE_address >> 8); 
		IAP_ADDRE = (u8)(EE_address >> 16);  
		
		EEPROM_Trig(); 
		
		*destData = IAP_DATA;  
		
		EE_address++;
		destData++;
	}while(--number);

	EEPROM_Disable();
}
//End of EEPROM_Read_nChar(ui32 EE_address,ui8* destData, u16 number)

//****************************************************************
void 	EEPROM_Write_Integer(u32 EE_address,i16 sourceData)
{
	typedef union 
	{
		i16 mData;
		char arry[2];
	}mySoure;
	mySoure source;
	source.mData = sourceData;
	EEPROM_Write_nChar(EE_address,source.arry,2);
}
//End of EEPROM_Write_Integer(u32 EE_address,i16 sourceData)

//****************************************************************
void 	EEPROM_Write_Long(u32 EE_address,i32 sourceData)
{
	typedef union 
	{
		i32 mData;
		char arry[4];
	}mySoure;
	mySoure source;
	source.mData = sourceData;
	EEPROM_Write_nChar(EE_address,source.arry,4);
}
//End of EEPROM_Write_Long(u32 EE_address,i32 sourceData)

//*************************************************************
void 	EEPROM_Write_Float(u32 EE_address,f32 sourceData)
{
	typedef union 
	{
		f32 mData;
		char arry[4];
	}mySoure;
	mySoure source;
	source.mData = sourceData;
	EEPROM_Write_nChar(EE_address,source.arry,4);
}
//End of EEPROM_Write_Float(u32 EE_address,f32 sourceData)

//************************************************************
void 	EEPROM_Write_Double(u32 EE_address,f64 sourceData)
{
	typedef union 
	{
		f32 mData;
		char arry[8];
	}mySoure;
	mySoure source;
	source.mData = sourceData;
	EEPROM_Write_nChar(EE_address,source.arry,8);
}
//End of EEPROM_Write_Double(u32 EE_address,f64 sourceData)

//***********************************************************
void 	EEPROM_Write_String(u32 EE_address,char* sourceStr)
{
	EEPROM_Write_nChar(EE_address,sourceStr,strlen(sourceStr));
	EEPROM_Write_nChar(EE_address+strlen(sourceStr),0,1);
}
//End of EEPROM_Write_String(u32 EE_address,char* sourceStr)

//***********************************************************************
i16	EEPROM_Read_Integer(u32 EE_address,i16* destData)
{
	typedef union 
	{
		i16 mData;
		char arry[2];
	}myDest;
	myDest dest;
	EEPROM_Read_nChar(EE_address,dest.arry, 2);
	*destData = dest.mData;
	return *destData;
}
//End of EEPROM_Read_Integer(u32 EE_address,i16* destData)

//***********************************************************************
i32 EEPROM_Read_Long(u32 EE_address,i32* destData)
{
	typedef union 
	{
		i32 mData;
		char arry[4];
	}myDest;
	myDest dest;
	EEPROM_Read_nChar(EE_address,dest.arry, 4);
	*destData = dest.mData;
	return *destData;
}
//End of EEPROM_Read_Long(u32 EE_address,i32* destData)

//***********************************************************************
f32 EEPROM_Read_Float(u32 EE_address,f32* destData)
{
	typedef union 
	{
		f32 mData;
		char arry[4];
	}myDest;
	myDest dest;
	EEPROM_Read_nChar(EE_address,dest.arry, 4);
	*destData = dest.mData;
	return *destData;
}
//End of EEPROM_Read_Float(u32 EE_address,f32* destData)

//***********************************************************************
f64 EEPROM_Read_Double(u32 EE_address,f64* destData)
{
	typedef union 
	{
		f64 mData;
		char arry[8];
	}myDest;
	myDest dest;
	EEPROM_Read_nChar(EE_address,dest.arry, 8);
	*destData = dest.mData;
	return *destData;
}
//End of EEPROM_Read_Double(u32 EE_address,f64* destData)

//***********************************************************************
void EEPROM_Read_String(u32 EE_address,char* str)
{
	ui8 tem = 0xFF;
	memset(str,0, strlen(str));
	while(tem != 0)
	{
		EEPROM_Read_nChar(EE_address,&tem, 1);
		*str = tem;
		str++;
		EE_address++;
	}
}
//End of EEPROM_Read_String(u32 EE_address,char* str)

//***********************************************************************
void EEPROM_Read_StringnChar(u32 EE_address,char* str, ui16 number)
{
	memset(str,0, strlen(str));
	EEPROM_Read_nChar(EE_address, str, number);
}
//End of EEPROM_Read_nString(u32 EE_address,char* str, ui16 number)

三  调试验证

下面写一个程序,调用库函数,先将数据写入EEPROM,然后再读出,将读出的数据通过串口发送到串口助手,显示出来从而确定其正确性。

maim.h代码:

/*main.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 06/22/2022
*/

#ifndef     __MAIN_H__
#define     __MAIN_H__
//#include "myport.h"
#include "STC32G_GPIO.h"
//#include "STC32G_PWM.h"
#include "STC32G_UART.h"
//#include "STC32G_UART.h"
//#include "STC32G_ADC.h"
#include "STC32G_EEPROM.H"


#endif

config.h代码:

ifndef __CONFIG_H__
#define __CONFIG_H__

#define PRINTF_SEGLED           //printfÊä³öÖØ¶¨Ïòµ½ISPÏÂÔØÈí¼þÖеÄ7¶ÎÊýÂë¹Ü
//#define PRINTF_HID            //printfÊä³öÖ±½ÓÖØ¶¨Ïòµ½USB HID½Ó¿Ú

#define  FOSC   30000000UL 
//#define	 F11_0592MHz
//#define  F12MHz
//#define  F18_432MHz    //18.432MHz
//#define  F20MHz
//#defimne  F22_1184MHz    //22.1184MHz
//#define  F24MHz         
//#define  F27MHz
  #define  F30MHz
//#define  F33MHz
//#define  F33_1776MHz   //33.1776MHz
//#define  F35MHz
//********************************************************
void SysInit(); //init System speed  fastest


#endif

config.c代码:

/*config.c
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 06/22/2022
*/

#include <STC32G.h>
#include "config.h"


//********************************************************
void SysInit() //init System speed  fastest
{
	EAXFR = 1;		//visit XFR enable
	CKCON = 0x00; //set outer data bus speed fastest
	WTST = 0x00;  //CPU wait 0 to run program
}
//End of SysInit()

main.c代码:

/*main.c
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu on 11/26/2022
*/

#include "main.h"
//#include "config.h"
//#include "STC32G_Timer.h"
#include "STC32G_Delay.h"
//#include "STC32G_comparator.h"


ui8 t1 = 250;
ui16 t2 = 65533;
i32 t3 = -165533;
f32 t4 = 51.25;
f64 t5 = -3.14;
ui8 t6 = 0;
ui16 t7 = 0;
i32 t8 = 0;
f32 t9 = 0;
f64 t10 = 0;
ui8 str[20] = {0};
ui8 str1[20] = "Hello World";


void main()
{
	SysInit();
	Uart1_Init(VBAUD_8BITS,G1, 0, 9600);
	EEPROM_SectorErase(0x00); 
	EEPROM_Write_nChar(0x00,&t1,1);
	EEPROM_Write_Integer(0x01,t2);
	EEPROM_Write_Long(0x03,t3);	
	EEPROM_Write_Float(0x07,t4);
	EEPROM_Write_Double(0x0B,t5);
	EEPROM_Write_String(0x13,str1);
	while(1)
	{
		EEPROM_Read_nChar(0x00,&t6,1);				
		LongToString(t6,str);	
		Uart1_SendString(str);
		Uart1_SendString("\r\n");
		
		EEPROM_Read_Integer(0x01,&t7);	
		LongToString(t7,str);	
		Uart1_SendString(str);
		Uart1_SendString("\r\n");
		
		EEPROM_Read_Long(0x03,&t8);
		LongToString(t8,str);	
		Uart1_SendString(str);
		Uart1_SendString("\r\n");
		
		EEPROM_Read_Float(0x07,&t9);
		FloatString(t9,str,2);	
		Uart1_SendString(str);
		Uart1_SendString("\r\n");
		
		EEPROM_Read_Double(0x0B,&t10);
		FloatString(t10,str,2);	
		Uart1_SendString(str);
		Uart1_SendString("\r\n");
		
		EEPROM_Read_String(0x13,str);	
		Uart1_SendString(str);
		Uart1_SendString("\r\n");
		Uart1_SendString("\r\n");
		
		Delayxms(1000);
	}
}
//End of main()

编译结果:

 下载到单片机的设置如下:

打开串口,串口助手中的结果如下:

 

 可以看出数据写入与读出正确,其中3.14变成了3.15并非写入与读出错误,而是单片机处理浮点数的不足。

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

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

相关文章

Hive之函数

Hive之函数 第九章 函数 9.1 系统内置函数 9.1.1 理论 查看内置函数&#xff1a; show functions; 显示函数的详细信息&#xff1a; desc function abs; 显示函数的扩展信息&#xff1a; desc function extended concat; 一、关系运算&#xff1a; 1. 等值比较: 2. 等值…

VSCode:使用CMakeLists.txt构建C++项目

vscode配置 插件&#xff1a; CMake插件主要功能是CMake语法高亮、自动补全CMake Tools的功能主要是结合VSCode IDE使用CMake这个工具&#xff0c;比如生成CMake项目、构建CMake项目等CMake Tools Helper CMake工具本身还是要下载到本地&#xff0c;并且配置环境变量。 项目…

足球二三事 - 世界杯征文

征文活动链接&#xff1a; https://bbs.csdn.net/topics/609601920 从报纸上时候看 1982 年的世界杯&#xff0c;当时我们家里没有电视&#xff0c;晚上的时候听到马路对面的房子里传来惊呼声&#xff0c;也不知道为啥。 1983 年的春节前&#xff0c;家里要打扫房间&#xff…

UE4,UE5虚幻引擎源码版下载

1、进入Epic的GitHub仓库 https://github.com/EpicGames/Signup GitHub - EpicGames/Signup: Information about signing up for a free Epic Games account, and getting access to UnrealEngine source code. 2、加入EpicTeamAdmin 3、进入UnrealEngine仓库 4、找到需要下…

Linux系统中curl命令用法详解

在Linux系统中curl是一个利用URL规则在命令行下工作的文件传输工具&#xff0c;是一款强大的http命令行工具。它支持文件的上传和下载&#xff0c;是综合传输工具。 curl 是常用的命令行工具&#xff0c;用来请求 Web 服务器。它的名字就是客户端&#xff08;client&#xff09…

(C语言)printf打印的字符串太长了,我想分两行!

本文来自于公众号&#xff1a;C语言编程技术分享 一、提问 有下述C程序&#xff1a; #include <stdio.h> #include <stdlib.h>int main() { printf("123456789012345678901234567890\n");system("pause");return 0; } printf函数要打印的字…

tomcat启动配置java_home,启动网址等,点击startup.bat直接启动

自己开发了一个网址&#xff08;基于angular&#xff09;&#xff0c;想共享给别人&#xff0c;直接点击运行&#xff0c;通过tomcat部署网站方式执行。 1、下载tomcat 从官网上下载tomcat&#xff0c;我下载的是tomcat9.0.36,下载完成后&#xff0c;解压&#xff1a; 双击b…

新知实验室

TUIRoom 是一个包含 UI 的开源音视频组件&#xff0c;通过集成 TUIRoom&#xff0c;可以在业务中快速上线音视频房间&#xff0c;屏幕分享&#xff0c;聊天等功能。 项目是开源的项目&#xff0c;根据自己 的需求设计项目。 创建步骤如下 &#xff1a; 一、 开通腾讯云实时…

被裁后一个offer都没有,测试人的问题出在哪里?

裁员潮涌&#xff0c;经济严冬。最近很多测试人过得并不好&#xff0c;行业缩水对测试岗位影响很直接干脆&#xff0c;究其原因还是测试门槛在IT行业较低&#xff0c;同质化测试人员比较多。但实际上成为一位好测试却有着较高的门槛&#xff0c;一名优秀的测试应当对产品的深层…

代码随想录65——额外题目【二叉树】:129求根节点到叶节点数字之和、1382将二叉搜索树变平衡、100相同的树、116填充每个节点的下一个右侧节点指针

文章目录1.129求根节点到叶节点数字之和1.1.题目1.2.解答2.1382将二叉搜索树变平衡2.1.题目2.2.解答3.100相同的树3.1.题目3.2.解答4.116填充每个节点的下一个右侧节点指针4.1.题目4.2.解答4.2.1.递归解法4.2.2.迭代方法1.129求根节点到叶节点数字之和 参考&#xff1a;代码随…

品优购项目详细分析

能够独立完成品优购首页制作哦 能够独立完成品优购列表页制作 能够独立完成品优购注册页制作 能够把品优购网站部署上线 网站制作流程&#xff1a; 初稿审核&#xff1a;网页美工会制作原型图和psd效果图 品优购项目规划&#xff1a; 1 品优购项目整体介绍 描述&#xff1…

【TS】函数重载--可选参数--默认参数

可选参数–默认参数 在ts中定义的数据类型&#xff0c;某些情况下只需要传入定义数据类型的一部分参数&#xff0c;比如&#xff1a;id 、name、age、address&#xff0c;此时需要修改用户的名称&#xff0c;那么只需要传入id、name就够了&#xff1b;某些情况下需要修改用户的…

.net-----集合和数据结构

集合和数据结构前言集合和数据结构的基本概念命名空间列表类集合列表类集合&#xff1a;数组列表列表类集合&#xff1a;列表List<T>双向链表LinkedList<T>字典类集合字典类集合类型哈希表Hashtable字典类集合&#xff1a;Dictionary<TKey, TValue >排序列表…

Vue3 Pinia 全局状态管理工具的使用

Pinia 是 Vue3 官方更推荐使用的全局状态管理工具。 Pinia 最初正是为了探索 Vuex 的下一个版本而开发的&#xff0c;因此整合了核心团队关于 Vuex 5 的许多想法。最终&#xff0c;我们意识到 Pinia 已经实现了我们想要在 Vuex 5 中提供的大部分内容&#xff0c;因此决定将其作…

E-梅莉的市场经济学

E-梅莉的市场经济学 题目背景 梅莉这个学期选修了经济学。但是主修心理学的她实在不擅长经济领域的分析&#xff0c;为此她时常抱怨自己学不会&#xff0c;想退课。 但是如果现在退掉的话这学期的学分就不够啦&#xff0c;因此她根据“梦中”的经历&#xff0c;“胡诌”了一…

Unity 如何实现框选游戏战斗单位

文章目录&#x1f354; Preface✨ 如何在屏幕坐标系内绘制框选框&#x1f389; 根据框选范围定位其在世界坐标系中对应的区域&#x1f947; 在该区域内进行物理检测&#x1f354; Preface 本文简单介绍如何实现即时战略游戏中框选战斗单位的功能&#xff0c;如图所示&#xff…

NeRF-SLAM 学习笔记

NeRF-SLAM: Real-Time Dense Monocular SLAM with Neural Radiance Fields 主页&#xff1a;https://deepai.org/publication/nerf-slam-real-time-dense-monocular-slam-with-neural-radiance-fields 论文&#xff1a;https://arxiv.org/pdf/2210.13641.pdf Code&#xff1a;…

RabbitMQ复习笔记

文章目录RabbitMQ一、MQ引言1.1、什么是MQ1.2、MQ有哪些1.3、不同MQ特点二、RabbitMQ 的引言2.1、RabbitMQ2.2、RabbitMQ的安装2.2.1、下载2.2.2、下载的安装包2.2.3、安装步骤三、RabiitMQ 配置3.1、RabbitMQ 管理命令行3.2、web管理界面介绍3.2.1、overview概览3.2.2 Admin用…

手摸手利在idea中利用maven创建web项目

1. 下载maven&#xff0c;目前最新版本是3.8.6。在环境变量中创建MAVEN_HOME变量&#xff0c;并在PATH中添加。maven的运行依赖于java环境&#xff0c;这意味着在配置MAVEN前&#xff0c;应该已经在环境变量中配置有JAVA_HOME和PATH中配置好了JAVA相关环境。 2. 配置完毕后&…

力扣(LeetCode)84. 柱状图中最大的矩形 (C++)

朴素思想 朴素思想&#xff0c;找左右边界&#xff0c;依次乘以区间内最小上边界&#xff0c;取最大值。这个做法需要遍历左边界&#xff0c;对于每个左边界遍历右边界。因此需要 O(n2)O(n^2)O(n2) 的时间复杂度。 转换思路&#xff0c;确定上边界&#xff0c;找左右边界。这…