STC32G单片机内置ADC及应用编程

news2024/11/16 2:13:46

一  STC32G单片机内置ADC模块简介

      STC32G单片机内部集成了一个12位高速ADC转换器,ADC的最高时钟频率为系统频率的1/2。其输入通道多达15个(第15通道为专门测量内部1.19V参考信号源的通道),可分时切换使用。

      STC15系列单片机内置ADC模块以电源电源作为ADC参考电压,STC32G的ADC模块则与之不同,它有单独的参考电压源引脚,可以接入精准的参考电压(0~5V皆可),以获得稳定的ADC值;参考电源引脚也可直接与MCU供电电源连接,不过AD转换结果可能会收到电源电源波动的影响。注意:STC32GADC模块的参考电压输入引脚不可悬空。

       STC32G单片机的内置ADC模块转换结果存储在两个8位寄存器中,可配置为左对齐(高8位存储在高位寄存器ADC_RES中,低四位存储在低位寄存器ADC_REL的高四位中),可配置为右对齐(高4位存储在高位寄存器ADC_RES的低4位中,低8位存储在低位寄存器ADC_REL中)。

二  STC32G单片机内置ADC模块的相关寄存器

STC32G单片机内置ADC模块的相关寄存器包含控制寄存器ADC_CONTR、转换结果高位寄存器ADC_RES、转换结果低位寄存器ADC_RESL、配置寄存器ADCCFG、时序控制寄存器ADCTIM。下面是STC用户手册对这几个寄存器的功能介绍。

寄存器ADC_CONTR

配置寄存器ADCCFG

 时序控制寄存器ADCTIM

 

三  ADC模块函数库编程

       ADC模块应用离不开相关寄存器编程,先将常用的寄存器配置操作编写成库函数供以后调用。

      头文件

/*STC32G_ADC.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu,7/21/2022
/enum//
STC32G_ADC_CHN         //STC32G ADC channel
STC32G_ADC_SPEED       //STC32G ADC clock frequency
	
/Macro function
STC32G_ADCPOWERON(); 				//adc power on
STC32G_ADCPOWEROFF();			  //adc power off
STC32G_ADCSTART();          //adc start
STC32G_ADCSTOP();					  //adc stop
STC32G_ADCCLEARFLAG():      //clear flag
STC32G_ADCPWMTRIENBLE();    //PWM trigger adc enable
STC32G_ADCPWMTRIDISBLE();		//PWM trigger adc disable

STC32G_ADCSELCH0();  				//selected ADC_CH0
STC32G_ADCSELCH1();  			  //selected ADC_CH1
STC32G_ADCSELCH2();			    //selected ADC_CH2
STC32G_ADCSELCH3();   	    //selected ADC_CH3
STC32G_ADCSELCH4();			    //selected ADC_CH4
STC32G_ADCSELCH5();         //selected ADC_CH5
STC32G_ADCSELCH6();			    //selected ADC_CH6
STC32G_ADCSELCH7();         //selected ADC_CH7
STC32G_ADCSELCH8();         //selected ADC_CH8
STC32G_ADCSELCH9();         //selected ADC_CH9
STC32G_ADCSELCH10();        //selected ADC_CH10
STC32G_ADCSELCH11();        //selected ADC_CH11
STC32G_ADCSELCH12();        //selected ADC_CH12
STC32G_ADCSELCH13();        //selected ADC_CH13
STC32G_ADCSELCH14();        //selected ADC_CH14
STC32G_ADCSELCH15();				//selected ADC_CH15 at inner band gap voltage

STC32G_ADCRESLALIG();				//adc result left alignment
STC32G_ADCRESRALIG():  			//adc result right alignment

//fuanction/
STC32G_AdcSelChn(STC32G_ADC_CHN chn); 					       //return void
STC32G_AdcSelSpeed(STC32G_ADC_SPEED selSpeed);         //return void
STC32G_AdcStructInitDef(STC32G_ADC_TypeDef* pStruct);  //return void
STC32G_AdcInit(STC32G_ADC_TypeDef mStruct);						 //return void
STC32G_AdcGetRes(ui16* pResult);											 //return ui16
*/

#ifndef	__STC32G_ADC_H
#define	__STC32G_ADC_H

#include	"config.h"
#include  "STC32G_GPIO.h"

#define STC32G_ADCPOWERON()          {ADC_POWER = 1;} 				//adc power on
#define STC32G_ADCPOWEROFF() 				 {ADC_POWER = 0;}				  //adc power off
#define STC32G_ADCSTART()            {ADC_START = 1;}         //adc start
#define STC32G_ADCSTOP()             {ADC_START = 0;}					//adc stop
#define STC32G_ADCCLEARFLAG()        {ADC_FLAG = 0;}	        //clear flag
#define STC32G_ADCPWMTRIENBLe()      {ADC_EPWMT = 1;}         //PWM trigger adc enable
#define STC32G_ADCPWMTRIDISBLE()     {ADC_EPWMT = 0;}					//PWM trigger adc disable

#define  STC32G_ADCSELCH0()   {STC32G_P1MODE_HIIN(PIN0); ADC_CONTR &= 0xF0;}  										 //selected ADC_CH0
#define  STC32G_ADCSELCH1()   {STC32G_P1MODE_HIIN(PIN1); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x01;}   //selected ADC_CH1
#define  STC32G_ADCSELCH2()   {STC32G_P1MODE_HIIN(PIN2); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x02;}   //selected ADC_CH2
#define  STC32G_ADCSELCH3()   {STC32G_P1MODE_HIIN(PIN3); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x03;}   //selected ADC_CH3
#define  STC32G_ADCSELCH4()   {STC32G_P1MODE_HIIN(PIN4); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x04;}   //selected ADC_CH4
#define  STC32G_ADCSELCH5()   {STC32G_P1MODE_HIIN(PIN5); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x05;}   //selected ADC_CH5
#define  STC32G_ADCSELCH6()   {STC32G_P1MODE_HIIN(PIN6); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x06;}   //selected ADC_CH6
#define  STC32G_ADCSELCH7()   {STC32G_P1MODE_HIIN(PIN7); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x07;}   //selected ADC_CH7
#define  STC32G_ADCSELCH8()   {STC32G_P0MODE_HIIN(PIN0); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x08;}   //selected ADC_CH8
#define  STC32G_ADCSELCH9()   {STC32G_P0MODE_HIIN(PIN1); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x09;}   //selected ADC_CH9
#define  STC32G_ADCSELCH10()  {STC32G_P0MODE_HIIN(PIN2); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x10;}   //selected ADC_CH10
#define  STC32G_ADCSELCH11()  {STC32G_P0MODE_HIIN(PIN3); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x11;}   //selected ADC_CH11
#define  STC32G_ADCSELCH12()  {STC32G_P0MODE_HIIN(PIN4); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x12;}   //selected ADC_CH12
#define  STC32G_ADCSELCH13()  {STC32G_P0MODE_HIIN(PIN5); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x13;}   //selected ADC_CH13
#define  STC32G_ADCSELCH14()  {STC32G_P0MODE_HIIN(PIN6); ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x14;}   //selected ADC_CH14
#define  STC32G_ADCSELCH15()  { ADC_CONTR &= 0xF0;  ADC_CONTR |= 0x15;}  															 //selected  band gap voltage

#define STC32G_ADCRESLALIG()  {RESFMT = 0;} //adc result left alignment
#define STC32G_ADCRESRALIG()  {RESFMT = 1;} //adc result right alignment


//******************************************************
typedef enum
{
	ADC_CH0 =	0,  //ADC channel 0 at P10
	ADC_CH1,  		//ADC channel 1 at P11
	ADC_CH2,  		//ADC channel 2 at P54
	ADC_CH3,  		//ADC channel 3 at P13
	ADC_CH4,  		//ADC channel 4 at P14
	ADC_CH5,  		//ADC channel 5 at P15
	ADC_CH6,  		//ADC channel 6 at P16
	ADC_CH7,  		//ADC channel 7 at P17
	ADC_CH8,  		//ADC channel 8 at P00
	ADC_CH9,  		//ADC channel 9 at P01
	ADC_CH10,  		//ADC channel 10 at P02
	ADC_CH11,  		//ADC channel 11 at P03
	ADC_CH12,  		//ADC channel 12 at P04
	ADC_CH13,  		//ADC channel 13 at P05
	ADC_CH14,  		//ADC channel 14 at P06
	ADC_CH15,  		//ADC channel 15 at inner band gap voltage
}STC32G_ADC_CHN; //STC32G ADC channel

//******************************************************
typedef enum
{
	FOSC_DIV_2X1 = 0,  // FOSC / (2 * 1)
	FOSC_DIV_2X2,      // FOSC / (2 * 2)
	FOSC_DIV_2X3,      // FOSC / (2 * 3)
	FOSC_DIV_2X4,      // FOSC / (2 * 4)
	FOSC_DIV_2X5,      // FOSC / (2 * 5)
	FOSC_DIV_2X6,      // FOSC / (2 * 6)
	FOSC_DIV_2X7,      // FOSC / (2 * 7)
	FOSC_DIV_2X8,      // FOSC / (2 * 8)
	FOSC_DIV_2X9,      // FOSC / (2 * 9)
	FOSC_DIV_2X10,     // FOSC / (2 * 10)
	FOSC_DIV_2X11,     // FOSC / (2 * 11)
	FOSC_DIV_2X12,     // FOSC / (2 * 12)
	FOSC_DIV_2X13,     // FOSC / (2 * 13)
	FOSC_DIV_2X14,     // FOSC / (2 * 14)
	FOSC_DIV_2X15,     // FOSC / (2 * 15)
	FOSC_DIV_2X16,     // FOSC / (2 * 16)
}STC32G_ADC_SPEED; //STC32G ADC clock frequency

//******************************************************
typedef struct
{
	BOOL adcPowerOn;								//ADC power on enable/disable, 0-disable, 1-enable  
	STC32G_ADC_CHN adcChn;             //slected adc channel
	BOOL pwmTrigAble;
	STC32G_ADC_SPEED adcSpeed;			//STC32G_ADC_SPEED
	BOOL	adcResultRA;							//adc result_data style,0:left alignment(default), 1:right alignment
	BOOL	adcSetupTime;									//ADC channel select setup time control congigure, 0: 1 system clock cycles(default), 1: 2 system clock cycles
	u8	adcHoldTime;									//ADC channel select hold time control congigure.  0: 1 ADC clock cycle time, 1:2 ADC clock cycle times
	u8	adcSampleTime;								//analog signal sampling control time. 10 min. recommended 0x1F
	
}STC32G_ADC_TypeDef;

/******************************************************
Function: STC32G_AdcSelChn(STC32G_ADC_CHN chn);
return value: void
chn:adc channel
description: select adc channel
Example:
	STC32G_AdcSelChn(ADC_CH0);
******************************************************/
void STC32G_AdcSelChn(STC32G_ADC_CHN chn);

/******************************************************
Function: STC32G_AdcSelSpeed(STC32G_ADC_SPEED selSpeed);
return value: void
selSpeed:selected speed
description: configure adc speed
Example:
	STC32G_AdcSelSpeed(FOSC_DIV_2X16);
******************************************************/
void STC32G_AdcSelSpeed(STC32G_ADC_SPEED selSpeed);

/******************************************************
Function: STC32G_AdcInitDef(STC32G_ADC_TypeDef* pStruct);
return value: void
pStruct: STC32G_ADC_TypeDef struct address to be inited to default
description: Init STC32G_ADC_TypeDef struct to default value
Example:
	STC32G_ADC_TypeDef mStruct;
	STC32G_AdcInitDef(&mStruct);
******************************************************/
void STC32G_AdcInitDef(STC32G_ADC_TypeDef* pStruct);

/******************************************************
Function: STC32G_AdcInit(STC32G_ADC_TypeDef mStruct);
return value: void
mStruct: configure STC32G by mStruct
description: init adc
Example:
	STC32G_ADC_TypeDef mStruct;
	STC32G_AdcInit(mStruct);
******************************************************/
void STC32G_AdcInit(STC32G_ADC_TypeDef mStruct);

/******************************************************
Function: STC32G_AdcGetRes(ui16* pResult);	
return value: ui16
pResult: address to store got result
description: get adc result
Example:
	ui16 mReult;
	STC32G_AdcGetRes(&mReult);
******************************************************/
u16	 STC32G_AdcGetRes(ui16* pResult);	

#endif

源文件

/*STC32G_ADC.c
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu, 07/21/2022
*/

#include	"STC32G_ADC.h"


//******************************************************
void STC32G_AdcSelChn(STC32G_ADC_CHN chn)
{
	switch(chn)
	{
		case ADC_CH0:
			STC32G_ADCSELCH0()
			break;
		case ADC_CH1:
			STC32G_ADCSELCH1()
			break;
		case ADC_CH2:
			STC32G_ADCSELCH2()
			break;
		case ADC_CH3:
			STC32G_ADCSELCH3()
			break;
		case ADC_CH4:
			STC32G_ADCSELCH4()
			break;
		case ADC_CH5:
			STC32G_ADCSELCH5()
			break;
		case ADC_CH6:
			STC32G_ADCSELCH6()
			break;
		case ADC_CH7:
			STC32G_ADCSELCH7()
			break;
		case ADC_CH8:
			STC32G_ADCSELCH8()
			break;
		case ADC_CH9:
			STC32G_ADCSELCH9()
			break;
		case ADC_CH10:
			STC32G_ADCSELCH10()
			break;
		case ADC_CH11:
			STC32G_ADCSELCH11()
			break;
		case ADC_CH12:
			STC32G_ADCSELCH12()
			break;
		case ADC_CH13:
			STC32G_ADCSELCH13()
			break;
		case ADC_CH14:
			STC32G_ADCSELCH14()
			break;
		case ADC_CH15:
			STC32G_ADCSELCH15()
			break;
	}
}
//End of STC32G_AdcSelChn(STC32G_ADC_CHN chn)


//******************************************************
void STC32G_AdcSelSpeed(STC32G_ADC_SPEED selSpeed)
{
	ADCCFG &= 0xF0;
	ADCCFG |= selSpeed;
}
//End of STC32G_AdcSelSpeed(STC32G_ADC_SPEED selSpeed)


//******************************************************
void STC32G_AdcInitDef(STC32G_ADC_TypeDef* pStruct)
{
	pStruct -> adcPowerOn = 0;
	pStruct -> adcChn = ADC_CH0;
	pStruct -> pwmTrigAble = 0;         //PWM trigger disable
	pStruct -> adcSpeed = FOSC_DIV_2X1; //adc clk is sclok/2
	pStruct -> adcResultRA = 0;         //adc result left align
	pStruct -> adcSetupTime = 0;        //Tadcsetup a adc clk
	pStruct -> adcHoldTime = 0x01;      //adc hold time 2 adc clk
	pStruct -> adcSampleTime = 0x0A;    //adc sampling time: 11 adc clk, 0x0A <= adcSampleTime <= 0x1F 
}
//End of STC32G_AdcInitDef(STC32G_ADC_TypeDef* pStruct)

//******************************************************
void STC32G_AdcInit(STC32G_ADC_TypeDef mStruct)
{
	STC32G_AdcSelChn(mStruct.adcChn);

	ADC_EPWMT = mStruct.pwmTrigAble;
	
	ADCCFG &= 0xF0;
	ADCCFG |= mStruct.adcSpeed;
	
	RESFMT = mStruct.adcResultRA;
	
	ADCTIM &= 0x7F;
	ADCTIM |= mStruct.adcSetupTime;
	
	ADCTIM &= 0x9F;
	ADCTIM |= mStruct. adcHoldTime;
	
	ADCTIM &= 0xE0;
	ADCTIM |= mStruct. adcSampleTime;
	
	ADC_POWER = mStruct.adcPowerOn;
}
//End of STC32G_AdcInit(STC32G_ADC_TypeDef mStruct)

//******************************************************
u16	 STC32G_AdcGetRes(ui16* pResult)
{
	*pResult = 0;
	STC32G_ADCSTART();
	_nop_();
	_nop_();
	while(!ADC_FLAG);
	STC32G_ADCCLEARFLAG()
	*pResult = ADC_RES;
	if(RESFMT)
	{
		*pResult <<= 8;
		*pResult += ADC_RESL;
	}
	else
	{
		*pResult <<= 4;
		*pResult += ADC_RESL >> 4;
	}
	return 	*pResult;
}
//End of STC32G_AdcGetRes(ui16* pResult)

四 应用编程示例

   下面写段示例程序,演示ADC库文件的使用。

    头文件:

/*main.h
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu ,04/18/2023
*/

#ifndef     __MAIN_H__
#define     __MAIN_H__

//#include "myport.h"
#include "mtype.h"
#include "config.h"
#include "STC32G_GPIO.h"
#include "STC32G_Delay.h"
#include "STC32G_UART.h"
//#include "STC32G_EEPROM.h"
//#include "STC32G_PWM.h"
#include "STC32G_ADC.h"
//#include "STC32G_EEPROM.H"
//#include "STC32G_SPI.h"
//#include "STC32G_PWM.h"
//#include "STC32G_Timer.h"
//#include "STC32G_comparator.h"

STC32G_ADC_TypeDef mstruct;

 
#endif

  源文件:

/*main.c
  Designed by Bill Liu
  Version 0.0 
  Modified last by Bill Liu, 03/25/2023
*/

#include "main.h"

ui8 str[30] = {0};
ui16 ADCRes = 0;
f32 TestVoltage = 0;



void main()
{
	SysInit();
	Uart1_Init(VBAUD_8BITS,G1, 0, 9600);
	
	
	STC32G_AdcInitDef(&mstruct);
	mstruct.adcPowerOn = 1;
	mstruct.adcChn = ADC_CH0;
	mstruct.pwmTrigAble = 0;
	mstruct.adcSpeed = FOSC_DIV_2X16;
	mstruct.adcHoldTime = 0x01;
	mstruct.adcSampleTime = 0x1F;
	
	STC32G_AdcInit(mstruct);
	
	while(1)
	{	
		STC32G_AdcGetRes(&ADCRes);
		Uart1_SendString("ADCRes = ");
		LongToString(ADCRes,str);	
		Uart1_SendString(str);
		Uart1_SendString("\r\n"); 
		
		
		TestVoltage = 5000.0/4096*ADCRes;
		FloatString(TestVoltage,str,2);
		Uart1_SendString("TestVoltage = ");
		Uart1_SendString(str);
		Uart1_SendString("mV");
		Uart1_SendString("\r\n");
		
		/*
		STC32G_ADCSELCH15()
		
		STC32G_AdcGetRes(&ADCRes);
		Uart1_SendString("ADCRes = ");
		LongToString(ADCRes,str);	
		Uart1_SendString(str);
		Uart1_SendString("\r\n"); 
		
		
		TestVoltage = 5000.0/4096*ADCRes;
		FloatString(TestVoltage,str,2);
		Uart1_SendString("Inner Bandgap Voltage = ");
		Uart1_SendString(str);
		Uart1_SendString("mV");
		Uart1_SendString("\r\n");
		
		STC32G_ADCSELCH0()
		*/
		
		Uart1_SendString("This a ADC Test Program!");
		Uart1_SendString("\r\n");
		Uart1_SendString("\r\n");
		Uart1_SendString("\r\n");
	  
		Delayxms(1000);
	}
}
//End of main()

    测试板的参考电压为基准电压芯片AD586提供的5V电压。下面用一个10K的电位器将5V电源电压分压,将分压接到P1.0做AD输入,用ADC来测试分得电压的大小。

测得基准电压值:

测得分压值:

 

将程序编译,下载到单片机,在串口助手上看到的结果如下:

将源文件中的注释去掉,再获取内部Bandgap的ADC值,并将其转换为电压,结果如下:

从结果可以看出,获得的Bandgap电压并不是手册上所说的1.19V,至于为什么,不是此处讨论的范围。本例已完整演示了,如何调用ADC库函数,实现ADC值获取及如何用ADC测量电压。

相关库函数及示例源代码下载链接:

https://download.csdn.net/download/billliu66/87701680

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

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

相关文章

AES加密

来源&#xff1a;链接: b站up主可厉害的土豆 &#xff08;据评论区说图片中有计算错误&#xff0c;但是过程是对的。只是了解过程问题不大&#xff0c;专门研究这一块的话自己可以看视频算一下&#xff09; 准备 首先&#xff0c;明文是固定长度 16字节 128位。 密钥长度可以…

C++语法(18)---- set和map

C语法&#xff08;17&#xff09;---- 二叉搜索树_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130174864 目录 1.set的介绍 1.set使用 1.基本结构 2.insert 3.erase 4.find 5.count 2.multiset 1.count 2.find 2.map的介绍 1.map …

zookeeper + kafka集群搭建详解

目录 1.消息队列介绍 1.为什么需要消息队列 &#xff08;MO&#xff09; 2.使用消息队列的好处 3.消息队列的两种模式 2.Kafka相关介绍 1.Kafka定义 2.Kafka简介 3. Kafka的特性 3.Kafka系统架构 1. Broker&#xff08;服务器&#xff09; 2. Topic&#xff08;一个队…

GaussDB数据库存储过程介绍

文章目录一、前言二、GaussDB中的定义三、存储过程的使用场景四、存储过程的使用优缺点五、存储过程的示例及示例解析1、GaussDB存储过程语法格式2、GaussDB存储过程语法示例3、存储过程的调用方法七、总结一、前言 华为云数据库GaussDB是一款高性能、高安全性的云原生数据库&…

链表基础知识

1.链表必知必会 什么是链表? 链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null&#xff08;空指针的意思&#…

23北京邮电大学备考经验

目录【写在前面】本科成绩择校历程英语复习数学复习政治复习专业课复习其它建议笔记复盘压力处理恋爱关系【写在最后】【写在前面】 初试成绩&#xff1a; 本科成绩 总体&#xff1a;浙江某双非学校的软件工程专业、综合测评成绩班级前两名、浙江省省级优秀毕业生、发表过论…

【Node】Node.js 资源汇总推荐

【导读】&#xff1a;Node.js 是一个开源、跨平台的&#xff0c;用于编写服务器和命令行的 JavaScript 运行时工具。awesome-nodejs 是sindresorhus发起维护的 Node.js 资源列表&#xff0c;内容包括&#xff1a;命令行工具、日志、调试、HTTP、构建工具、文件系统、模板、Web …

Elasticjob(2.1.4) failover 、misfire及执行线程池分析

Failover 当设置failover为true时候&#xff0c;elasticjob 集群通过zookeeper 的event watcher 监听是否有instance 丢失&#xff0c;然后对丢失instance 对应的分片进行立即执行。重复一下&#xff0c;failover是立即执行&#xff0c;不是按crontab时间来触发&#xff0c;这…

基于RDF本体模型和图数据库实现知识查询与推理

基于RDF本体模型和图数据库实现知识查询与推理 基于RDF本体模型和图数据库实现知识查询与推理一、案例本体模型解释二、数据构建与查询 Here’s the table of contents: 基于RDF本体模型和图数据库实现知识查询与推理 本文主要使用ONgDB图数据库和Neosemantics组件&#xff0c;…

自建个人音乐播放器Navidrome - 内网穿透实现在外随时访问

文章目录 1. 前言2. Navidrome网站搭建2.1 Navidrome下载和安装2.1.1 安装并添加ffmpeg2.1.2下载并配置Navidrome2.1.3 添加Navidrome到系统服务 2.2. Navidrome网页测试 3. 本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4. 公网访问测试5. 结语 转…

【Android实战开发】flutter实现网络请求的方法示例

Flutter网络请求使用的是Dio。Dio是一个强大易用的dart http请求库&#xff0c;支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载……. Flutter json数据解析是使用了json_serializable package包。它是一个自动化源代码生成器&#xff0c;可以为我们…

C++快速幂详解例题

基本概念 什么是快速幂呢&#xff1f;个人理解&#xff0c;就是更快速的计算幂运算。 比如计算a^b 刚学这个算法的时候我也很疑惑&#xff0c;幂运算不是有现成的公式么&#xff0c;直接pow&#xff08;a,b&#xff09;不就好了吗&#xff1f; 后来才明白&#xff0c;pow(a,b)的…

三分钟了解什么是时序数据库

在介绍时序数据库之前&#xff0c;我们先来看看什么是时序数据。时序数据就是基于时间排序的数据&#xff0c;再通过时间坐标将这些数据连接起来&#xff0c;形成一个折线图&#xff0c;直观地展示一个指标在过去一段时间内的走势和规律&#xff0c;帮助定位数据异常点。 时序…

Oracle中Archived redolog的生成

目录 一、问题预览 二、问题解答 一、问题预览 大家都知道 Oracle 中 online redolog切换后会生成 archived redolog&#xff0c;心里默认的就是 online redolog 切换后 archived redolog 已经生成。切换示意图&#xff0c;如下图所示。 但事实真的是这样吗&#xff1f; 二、…

C++ 23 实用工具(一)

C 23 实用工具&#xff08;一&#xff09; 工具函数是非常有价值的工具。它们不仅可以用于特定的领域&#xff0c;还可以应用于任意值和函数&#xff0c;甚至可以创建新的函数并将它们绑定到变量上。 常用函数 你可以使用各种变体的 min、max 和 minmax 函数来对值和初始化列…

【使用ChatGPT自动化】批量转换.xls文件为.xlsx文件

第1次提问&#xff1a; 我&#xff1a;我想使用Python批量转换.xls文件为.xlsx文件&#xff0c;请你提供代码 它&#xff1a; 当涉及到批量处理文件时&#xff0c;我们通常需要使用Python中的os模块和glob模块。os模块用于管理文件和目录&#xff0c;glob模块用于匹配文件路径名…

Visual Studio Code 1.77 发布!

欢迎使用 Visual Studio Code 2023 年3月版。此版本有许多更新&#xff0c;其中一些主要亮点包括&#xff1a; 无障碍改进&#xff1a;新的悬停、通知和 Sticky Scroll 快捷键 复制 GitHub 深度链接&#xff1a;在编辑器内创建永久链接和 HEAD 链接 笔记本保存格式&#xff1…

软件测试流程进阶----四年软件测试总结

工作四年了&#xff0c;我一直希望让自己每年对测试的理解更深入一层。工作一年的时候&#xff0c;我谈轮了自己对各种测试的理解&#xff0c;这一年来&#xff0c;虽然对那些理概念的有所加强&#xff0c;自我感觉没有什么质的变化。前些天听我们公司的一位测试经理讲《敏捷测…

精准抓住核心要点!!!十名面试官总结出这样一份面试通关答案,还不赶紧开始“作弊”通关!!!

金三银四求职季&#xff0c;但最近很多朋友私信说&#xff1a; 熬过了去年的寒冬&#xff0c;却没躲过如今的内卷&#xff1b; 打开Boss直拒&#xff0c;一排已读不回&#xff1b; 大部分回复的都是外包&#xff0c;薪资低于预期&#xff0c;对技术水平要求却远超从前&#x…

大数据和 CRM系统:它们如何帮助中小企业?

作为中小企业主&#xff0c;你可能在想&#xff0c;"大数据与我有什么关系&#xff1f;"但如果你使用某些类型的业务应用&#xff0c;即使预算很少&#xff0c;你也可以从大数据中获益。一个最好的例子是客户关系管理&#xff08;CRM&#xff09;系统&#xff0c;它提…