航芯ACM32G103开发板评测 08 ADC Timer外设测试

航芯ACM32G103开发板评测 08 ADC Timer外设测试

1. 软硬件平台

  1. ACM32G103 Board开发板
  2. MDK-ARM Keil

2. 定时器Timer

在一般的MCU芯片中,定时器这个外设资源是非常重要的,一般可以分为SysTick定时器(系统滴答定时器)、常规定时器(基本定时器,通用定时器,高级定时器)、专用定时器(看门狗定时器,RTC)
在这里插入图片描述

在ACM32G103中有着丰富的定时器资源,还包括低功耗定时器lptimer,具体资源如下
在这里插入图片描述

基础定时器最简单,就只是普通的计数、定时功能。通用定时器在基础定时器的功能上,增加了输入捕获和输出比较等功能。高级定时器在通用定时器的功能上,造假了包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM)的功能。
接下来进行基本的定时器定时功能测试。在官方给的SPL库里面只有两个例程,感觉有点少,与stm32相比较,许多的库函数没有完善。原本打算使用HC-SR04超声波模块进行定时器测试,但是发现有不少问题,而且定时精度比较高就放弃了,以后有时间再看看吧,或者看看其他人的东西。
在这里插入图片描述

基本定时器包含一个16 位自动装载计数器,由各自的可编程预分频器驱动。
在这里插入图片描述

//嵌套向量中断控制器配置 
void NVIC_Configuration(void)
{
    NVIC_ClearPendingIRQ(TIM6_IRQn);   
    NVIC_EnableIRQ(TIM6_IRQn);   
} 
//时钟配置使能
void Clock_Configuration(void)
{
   __RCC_TIM6_CLK_ENABLE();   
}  

定时器配置函数
定时器的定时时间主要取决于预分频系数和定时周期。重要的参数Prescaler,Period
如果需要修改定时器定时时间,只需要修改

TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)*500 - 1;  // 500ms 

修改为

TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)*1000 - 1;  // 1000ms=1s 
void TIM6_Init(void)  
{
    uint32_t timer_clock; 
    
    timer_clock = RCC_GetPCLK1Freq(); 
    
    if (RCC_GetHCLKFreq() != timer_clock)  // if hclk/pclk != 1, then timer clk = pclk * 2  
    {
       timer_clock =  timer_clock << 1;     
    }
    
	TIM_TimeBaseStructure.ClockDivision = TIM_CLOCKDIVISION_DIV1; 
	TIM_TimeBaseStructure.CounterMode = TIM_COUNTERMODE_UP; 
	TIM_TimeBaseStructure.RepetitionCounter = 0;  
	TIM_TimeBaseStructure.Prescaler = (timer_clock/TIM_CLOCK_FREQ) - 1;  
	TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)*500 - 1;  // 500ms 
	    
	TIM_TimeBase_Init(TIM6, &TIM_TimeBaseStructure);           

    /* TIM IT enable */
    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);  

    /* TIM6 enable counter */
    TIM_Cmd(TIM6, ENABLE);          
}

3.模数转换器ADC

1. ADC简介

将模拟信号(连续信号)转换为数字信号(离散信号)的器件就叫模数转换器(ADC)。
按原理可分为:并行比较型A/D转换器(FLASH ADC)、逐次比较型A/D转换器(SAR ADC)和双积分式A/D转换器(Double Integral ADC)。
A/D转换过程通常为4步:采样、保持、量化和编码。如图所示。
在这里插入图片描述

ADC的主要有三个性能指标:分辨率、转换时间和转换精度。

1.1 分辨率

分辨率:又称为转换精度,指ADC能分辨的最小电压,通常使用二进制有效位表示,反应了ADC对输入模拟量微小变化的分辨能力。当最大输入电压一定时,位数越多,量化单位越小,误差越小,分辨率越高。比如一个12位的ADC,参考电压为3.3V,则其能分辨的最小电压为:
在这里插入图片描述

1.2 转换时间

转换时间:其倒数为转换速率,指ADC从控制信号到来开始,到输出端得到稳定的数字信号所经历的时间。转换时间通常与ADC类型有关,双积分型ADC的转换时间一般为几十毫秒,属于低速ADC;逐次逼近型ADC的转换时间一般为几十微妙,属于中速ADC;并联比较型ADC的转换时间一般为几十纳秒,属于高速ADC。

1.3 转换精度

转换精度:指ADC输出的数字量所表示的模拟值与实际输入的模拟量之间的偏差,通常为1个或半个最小数字量的模拟变化量,表示为1LSB或1/2LSB。

2.ACM32G103 ADC资源

ACM32G103芯片有2个12位逐次逼近型ADC。ADC1与ADC2紧密耦合,可在双重模式下运行(ADC1 为主器件,ADC2为从器件)。

  1. 12 位分辨率,可配置10 位、8 位或6 位分辨率
  2. 转换速率最高可达3Msps
  3. 20 个可用通道,包括外部信号源和内部信号源
3. ADC初始化配置

首先需要定义需要使用的ADC 通道数量,以及具体的ADC 通道号。确定需要使用到的工作模式(独立模式、双ADC 模式、单端、差分或者是否支持DMA 等),设置ADC CLK,根据需求进行初始化配置。
ADC采集方式有下面四种:轮询方式,中断方式,外部触发方式,DMA 方式。
以DMA为案例进行处理。
ADC_DMA驱动函数

void ADC_DMA_Drive_Iint(void)
{
    ADC_GPIO_Config();//ADC_GPIO端口引脚初始化配置
    
    ADC_Common_Register_Config();//ADC通用寄存器配置
    
    ADC_Config();//ADC工作模式配置
    
    ADC_DMA_Config();//ADC_DMA请求配置
    
    ADC_RegularStart();//使能ADC,开始常规通道的转换
}

ADC_GPIO端口引脚初始化配置

void ADC_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    __RCC_GPIOC_CLK_ENABLE();
    
    /* Configure ADC Channel_13 pin as analog input */
    GPIO_InitStruct.Pin       = GPIO_PIN_3;
    GPIO_InitStruct.Mode      = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull      = GPIO_NOPULL;
    GPIO_Init(GPIOC, &GPIO_InitStruct); 
}

ADC通用寄存器配置

void ADC_Common_Register_Config(void)
{
    ADC_CommonInitTypeDef ADC_CommonInitStructure;

    ADC_CommonInitStructure.ADC_Mode = ADC_MODE_INDEPENDENT;//双ADC模式选择
    ADC_CommonInitStructure.ADC_Prescaler = ADC_CLOCK_DIV4;//ADC_CLK分频选择
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAACCESSMODE_DISABLED;//双ADC下DMA功能选择
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;//2个采样阶段之间的延迟
    ADC_CommonInit(&ADC_CommonInitStructure);
}

ADC工作模式配置

void ADC_Config(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    
    ADC_InitStructure.ADC_Resolution = ADC_RESOLUTION_12B;//分辨率
    ADC_InitStructure.ADC_ContinuousConvMode = ADC_CONT_DISABLE;//连续转换模式
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//外部触发边沿选择
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_EXTERNAL_TIG0;//触发模式
    ADC_InitStructure.ADC_DataAlign = ADC_DATAALIGN_RIGHT;//数据对齐
    ADC_InitStructure.ADC_NbrOfConversion = ADC_NUM;//规则通道序列长度 传输的数据长度为:每个通道采集30次 * 1个通道
    ADC_Init(ADCX, &ADC_InitStructure);
    
    //规则通道设置
    ADC_RegularChannelConfig(ADCX, ADC_CHANNEL_13, ADC_SEQUENCE_SQ1, ADC_SMP_CLOCK_320);
}

ADC_DMA请求配置

void ADC_DMA_Config(void)
{
    __RCC_DMA1_CLK_ENABLE();
    
    DMA_BigEndianConfig(DMA1, DISABLE);
    
    DMA_DeInit(DMA1_Channel3);
    
    DMA_InitStruct.Mode = DMA_MODE_CIRCULAR;    
    DMA_InitStruct.DataFlow = DMA_DATAFLOW_P2M;
    DMA_InitStruct.ReqID = DMA1_REQ0_ADC1;
    DMA_InitStruct.RawInt = DMA_RAWINT_ENABLE;
    DMA_InitStruct.SrcInc = DMA_SRCINC_DISABLE;
    DMA_InitStruct.DestInc = DMA_DESTINC_ENABLE;
    DMA_InitStruct.SrcWidth = DMA_SRCWIDTH_WORD;   
    DMA_InitStruct.DestWidth = DMA_DESTWIDTH_WORD;
    DMA_InitStruct.SrcBurst = DMA_SRCBURST_1;
    DMA_InitStruct.DestBurst = DMA_DESTBURST_1;

    DMA_InitStruct.SrcAddr     = (uint32_t)&ADC1->DR;
    DMA_InitStruct.DestAddr    = (uint32_t)gadcBuffer;
    DMA_InitStruct.Size        = 1;    

    DMA_Init(DMA1_Channel3, &DMA_InitStruct);
    
    // Enable interrupt
    DMA_ClearFlag(DMA1_Channel3, DMA_FLAG_RTC);
    DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);
    
    // Enable NVIC IRQ
    NVIC_ClearPendingIRQ(DMA1_IRQn);
    NVIC_SetPriority(DMA1_IRQn, 0x00);
    NVIC_EnableIRQ(DMA1_IRQn); 
    
    DMA_Cmd(DMA1_Channel3, ENABLE); 
}

使能ADC,开始常规通道的转换

void ADC_RegularStart(void)
{
    /* Enable ADC DMA mode */
    ADC_DMACmd(ADCX, ENABLE);
    
    /* Enable the ADC peripheral */
    ADC_Cmd(ADCX, ENABLE);

    /* Clear the SR register */
    ADC_ClearFlag(ADCX, ADC_IT_FLAG_ALL);      

    /* Start conversion */
    ADC_SoftwareStartConv(ADCX);

}

中断服务函数

void DMA1_IRQHandler(void)
{
    ADC_DMA_ITC_Callback();
}
void ADC_DMA_ITC_Callback(void)
{ 
    /* Transfer complete interrupt */
    if (SET == DMA_GetFlagStatus(DMA1_Channel3, DMA_FLAG_TC))
    {
        gadc1ItcConunt = 1;
        DMA_ClearFlag(DMA1_Channel3, DMA_FLAG_TC);
    }     
}

4.测试

  1. Timer测试函数
#define TIM_CLOCK_FREQ            (10000)  

TIM_Base_InitTypeDef TIM_TimeBaseStructure;    

volatile uint32_t Timer_Update_Flag;    

void Clock_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);   

void NVIC_Configuration(void)
{
    NVIC_ClearPendingIRQ(TIM6_IRQn);   
    NVIC_EnableIRQ(TIM6_IRQn);   
} 

void Clock_Configuration(void)
{
   __RCC_TIM6_CLK_ENABLE();   
}  

void GPIO_Configuration(void)  
{
    // do nothing here 
}

/************************************************************************
 * function   : TIM6_Update_IRQ
 * Description: TIM6 user Interrupt Handler 
 ************************************************************************/ 
void TIM6_Update_IRQ(void)
{
	if (TIM6->SR & TIMER_SR_UIF)  
	{
		Timer_Update_Flag = 1;  
	}
	
}


void TIM6_Init(void)  
{
    uint32_t timer_clock; 
    
    timer_clock = RCC_GetPCLK1Freq(); 
    
    if (RCC_GetHCLKFreq() != timer_clock)  // if hclk/pclk != 1, then timer clk = pclk * 2  
    {
       timer_clock =  timer_clock << 1;     
    }
    
	TIM_TimeBaseStructure.ClockDivision = TIM_CLOCKDIVISION_DIV1; 
	TIM_TimeBaseStructure.CounterMode = TIM_COUNTERMODE_UP; 
	TIM_TimeBaseStructure.RepetitionCounter = 0;  
	TIM_TimeBaseStructure.Prescaler = (timer_clock/TIM_CLOCK_FREQ) - 1;  
	TIM_TimeBaseStructure.Period = (TIM_CLOCK_FREQ/1000)*500 - 1;  // 500ms 
	    
	TIM_TimeBase_Init(TIM6, &TIM_TimeBaseStructure);           

    /* TIM IT enable */
    TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE);  

    /* TIM6 enable counter */
    TIM_Cmd(TIM6, ENABLE);          
}

void Timer_Update_Test(void)
{
    /* Module Clocks Configuration */
    Clock_Configuration();

    /* NVIC Configuration */   
    NVIC_Configuration();
    
	Timer_Update_Flag = 0;   
	TIM6_Init(); 
    
	while(1)
	{
		if(Timer_Update_Flag) 
		{
			printfS("Timer Update Occurs\n"); 
			Timer_Update_Flag = 0;   
		}
	}
}
  1. ADC_DMA测试函数
//采样通道数 
#define ADC_NUM    (1)

uint32_t gadcBuffer[ADC_NUM]; 
static volatile uint32_t gadc1ItcConunt = 0;                 

#define ADCX    (ADC1)

DMA_InitTypeDef DMA_InitStruct;//需配置为全局变量,不然DMA只会触发一次


/******************************************************************************
* @brief : DMA adc to memory transfer complete interrupt Callback.
* @param : None
* @return: None
******************************************************************************/ 
void ADC_DMA_ITC_Callback(void)
{ 
    /* Transfer complete interrupt */
    if (SET == DMA_GetFlagStatus(DMA1_Channel3, DMA_FLAG_TC))
    {
        gadc1ItcConunt = 1;
        DMA_ClearFlag(DMA1_Channel3, DMA_FLAG_TC);
    }     
}


/******************************************************************************
* @brief : ADC GPIO config.
* @param : None
* @return: None
******************************************************************************/
void ADC_GPIO_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStruct;
    
    __RCC_GPIOC_CLK_ENABLE();
    
    /* Configure ADC Channel_13 pin as analog input */
    GPIO_InitStruct.Pin       = GPIO_PIN_3;
    GPIO_InitStruct.Mode      = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Pull      = GPIO_NOPULL;
    GPIO_Init(GPIOC, &GPIO_InitStruct); 
}

/******************************************************************************
* @brief : ADC Common register config.
* @param : None
* @return: None
******************************************************************************/
void ADC_Common_Register_Config(void)
{
    ADC_CommonInitTypeDef ADC_CommonInitStructure;

    ADC_CommonInitStructure.ADC_Mode = ADC_MODE_INDEPENDENT;//双ADC模式选择
    ADC_CommonInitStructure.ADC_Prescaler = ADC_CLOCK_DIV4;//ADC_CLK分频选择
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAACCESSMODE_DISABLED;//双ADC下DMA功能选择
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TWOSAMPLINGDELAY_5CYCLES;//2个采样阶段之间的延迟
    ADC_CommonInit(&ADC_CommonInitStructure);
}

/******************************************************************************
* @brief : ADC config.
* @param : None
* @return: None
******************************************************************************/
void ADC_Config(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    
    ADC_InitStructure.ADC_Resolution = ADC_RESOLUTION_12B;//分辨率
    ADC_InitStructure.ADC_ContinuousConvMode = ADC_CONT_DISABLE;//连续转换模式
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;//外部触发边沿选择
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_EXTERNAL_TIG0;//触发模式
    ADC_InitStructure.ADC_DataAlign = ADC_DATAALIGN_RIGHT;//数据对齐
    ADC_InitStructure.ADC_NbrOfConversion = ADC_NUM;//规则通道序列长度 传输的数据长度为:每个通道采集30次 * 1个通道
    ADC_Init(ADCX, &ADC_InitStructure);
    
    //规则通道设置
    ADC_RegularChannelConfig(ADCX, ADC_CHANNEL_13, ADC_SEQUENCE_SQ1, ADC_SMP_CLOCK_320);
}

/******************************************************************************
* @brief : ADC DMA config.
* @param : None
* @return: None
******************************************************************************/
void ADC_DMA_Config(void)
{
    __RCC_DMA1_CLK_ENABLE();
    
    DMA_BigEndianConfig(DMA1, DISABLE);
    
    DMA_DeInit(DMA1_Channel3);
    
    DMA_InitStruct.Mode = DMA_MODE_CIRCULAR;    
    DMA_InitStruct.DataFlow = DMA_DATAFLOW_P2M;
    DMA_InitStruct.ReqID = DMA1_REQ0_ADC1;
    DMA_InitStruct.RawInt = DMA_RAWINT_ENABLE;
    DMA_InitStruct.SrcInc = DMA_SRCINC_DISABLE;
    DMA_InitStruct.DestInc = DMA_DESTINC_ENABLE;
    DMA_InitStruct.SrcWidth = DMA_SRCWIDTH_WORD;   
    DMA_InitStruct.DestWidth = DMA_DESTWIDTH_WORD;
    DMA_InitStruct.SrcBurst = DMA_SRCBURST_1;
    DMA_InitStruct.DestBurst = DMA_DESTBURST_1;

    DMA_InitStruct.SrcAddr     = (uint32_t)&ADC1->DR;
    DMA_InitStruct.DestAddr    = (uint32_t)gadcBuffer;
    DMA_InitStruct.Size        = 1;    

    DMA_Init(DMA1_Channel3, &DMA_InitStruct);
    
    // Enable interrupt
    DMA_ClearFlag(DMA1_Channel3, DMA_FLAG_RTC);
    DMA_ITConfig(DMA1_Channel3, DMA_IT_TC, ENABLE);
    
    // Enable NVIC IRQ
    NVIC_ClearPendingIRQ(DMA1_IRQn);
    NVIC_SetPriority(DMA1_IRQn, 0x00);
    NVIC_EnableIRQ(DMA1_IRQn); 
    
    DMA_Cmd(DMA1_Channel3, ENABLE); 
}


/******************************************************************************
* @brief:  Enable ADC, start conversion of regular channle 
* @param:  None 
* @return: None
******************************************************************************/
void ADC_RegularStart(void)
{
    /* Enable ADC DMA mode */
    ADC_DMACmd(ADCX, ENABLE);
    
    /* Enable the ADC peripheral */
    ADC_Cmd(ADCX, ENABLE);

    /* Clear the SR register */
    ADC_ClearFlag(ADCX, ADC_IT_FLAG_ALL);      

    /* Start conversion */
    ADC_SoftwareStartConv(ADCX);

}


void ADC_DMA_Drive_Iint(void)
{
    ADC_GPIO_Config();
    
    ADC_Common_Register_Config();
    
    ADC_Config();
    
    ADC_DMA_Config();
    
    ADC_RegularStart();
}

/******************************************************************************
* @brief : ADC function test.
* @param : None
* @return: None
******************************************************************************/
void APP_ADC_Test(void)
{
    uint32_t i;
    float vol=0.0;
    printfS("ADC DMA test \r\n");

    ADC_DMA_Drive_Iint();
    
    while(1)
    {
        ADC_SoftwareStartConv(ADCX);
        
        while(!gadc1ItcConunt);
        gadc1ItcConunt =0;
        for (i = 0; i < ADC_NUM; i++)
         {
        //  printfS("Channel_%d = %d\r\n", ((gadcBuffer[i] >> 16) & 0xFF), (gadcBuffer[i] & 0xFFF));
             
             vol = (gadcBuffer[i]&0xFFF)*3.3/4095;
					printf("PA1 Voltage is: %0.1f V \r\n", vol);
        }
         DelayMs(1000);
    }
}
  1. 测试结果

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

【力扣】盛最多水的容器,双指针法

盛最多水的容器原题地址 方法一&#xff1a;双指针 如果使用暴力枚举&#xff0c;时间复杂度为&#xff0c;效率太低&#xff0c;会超时。 考虑使用双指针&#xff0c;利用单调性求解。用left和right作为数组height的下标&#xff0c;分别初始化为0和size-1。考虑在区间[lef…

io和File的综合练习:

先来说说字节流和字符流的应用场景 练习一&#xff1a; /*拷贝一个文件夹考虑子文件夹*///源文件夹路径File src new File("E:\\aaa-FIle学习测试\\bbb");//目的文件夹路径File dest new File("E:\\aaa-FIle学习测试\\ccc");copy(src,dest);}public stati…

Mybatis- plus 基本使用

目录 一. 引入依赖 二.定义Mapper 三.常见注解 3.1TableName 3.2.TableId 3.3TableField 3.4常见配置 一. 引入依赖 由于这个starter包含对mybatis的自动装配&#xff0c;因此完全可以替换掉Mybatis的starter。 <dependency><groupId>com.baomidou</gr…

IP地址被攻击?如何有效防范

在当今数字化的世界中&#xff0c;网络攻击是一个不容忽视的威胁&#xff0c;而IP地址是黑客攻击的主要目标之一。一旦IP地址受到攻击&#xff0c;可能导致服务中断、数据泄露以及其他严重后果。本文将探讨IP地址被攻击的常见原因以及如何有效防范这些攻击。 一、IP地址被攻击…

基于ISO13400 (DoIP) 实现车辆刷写

近年来&#xff0c;在整车研发中基于以太网实现车辆高带宽通讯无疑是人们热议的话题。无论是车内基于车载以太网来减少线束成本&#xff0c;实现ADAS、信息娱乐系统等技术&#xff0c;还是基于新的电子电气架构以及远程诊断需求来实现以太网诊断&#xff08;DoIP&#xff09;&a…

2024.2.7日总结(小程序开发4)

页面导航 页面导航是页面之间的相互跳转&#xff1a; <a>链接location.href 小程序中实现页面导航的两种方式&#xff1a; 声明式导航 在页面上声明一个<navigator>导航组件通过点击<navigator>组件实现页面跳转 编程式导航 调用小程序的导航API&…

vue3(笔记)

组合式Api setup-----相当于beforeCreate, create生命周期 reactive–定义状态 对象形式 响应式原理 toRefs— Pinia &#xff08;只有state、getters和actions&#xff09; 更加简洁的语法&#xff0c;完美支持Vue3的Composition api 和 对TypesCcript的完美支持

街头篮球

欢迎来到程序小院 街头篮球 玩法&#xff1a;根据箭头所指方向&#xff0c;点击鼠标左键进行投篮&#xff0c; 投中获得1分&#xff0c;简单、普通、困难关卡&#xff0c;快去投篮吧^^。开始游戏https://www.ormcc.com/play/gameStart/272 html <div id"wrapper"…

unity——ScriptableObject相关知识点【学习笔记/不足之处欢迎斧正/个人复习向/侵删】

一、相关简介 1.ScriptableObject是什么&#xff1a;Unity提供的一个数据存储基类 2.ScriptableObject的好处有哪些&#xff1a;文件配置、数据复用、更好的处理数据带来的多态性为 二、ScriptableObject的创建 1.自定义ScriptableOject数据容器 继承ScriptableObject类 在…

2024/2/7总结

Node.js 什么是node.js node.js是一个基于chrome v8 引擎的 JavaScript 运行环境。 浏览器是JavaScript的前端运行环境node.js是JavaScript的后端运行环境 node.js中无法调用DOM和BOM等浏览器内置API fs模块 是node.js官方提供的、用来操作文件的模块&#xff0c;它提供了一系…

3.1-媒资管理之需求分析+搭建Nacos

文章目录 媒资管理模块1 模块需求分析1.1 模块介绍1.2 业务流程1.2.1 上传图片1.2.2 上传视频1.2.3 处理视频1.2.4 审核媒资 2.2 搭建Nacos2.2.1 服务发现中心2.2.2 配置中心2.2.2.1 配置三要素2.2.2.3配置content-api 2.2.3 公用配置2.2.4 配置优先级2.2.5 导入配置文件2.2.6 …

Java学习笔记------API

API API&#xff08; Application Programming Interface&#xff09;&#xff1a;应用程序编程接口 简单的说&#xff0c;API就是Java里面别人已经写好的东西&#xff0c;不用自己编写&#xff0c;直接使用即可 例如&#xff1a; public static void main&#xff08;Str…

[设计模式Java实现附plantuml源码~行为型]请求的链式处理——职责链模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

C#,栅栏油漆算法(Painting Fence Algorithm)的源代码

1 刷油漆问题 给定一个有n根柱子和k种颜色的围栏&#xff0c;找出油漆围栏的方法&#xff0c;使最多两个相邻的柱子具有相同的颜色。因为答案可以是大的&#xff0c;所以返回10^97的模。 计算结果&#xff1a; 2 栅栏油漆算法的源程序 using System; namespace Legalsoft.Tr…

跨境电商新风潮:充分发挥海外云手机的威力

在互联网行业迅速发展的大环境下&#xff0c;跨境电商、海外社交媒体营销以及游戏产业等重要领域都越来越需要借助海外云手机的协助。 特别是在蓬勃发展的跨境电商领域&#xff0c;像亚马逊、速卖通、eBay等平台&#xff0c;结合社交电商营销和短视频内容成为最有效的流量来源。…

百亿规模京东实时浏览记录系统的设计与实现

百亿规模京东实时浏览记录系统的设计与实现 系统介绍 浏览记录系统主要用来记录京东用户的实时浏览记录&#xff0c;并提供实时查询浏览数据的功能。在线用户访问一次商品详情页&#xff0c;浏览记录系统就会记录用户的一条浏览数据&#xff0c;并针对该浏览数据进行商品维度…

【PyTorch][chapter 15][李宏毅深度学习][Neighbor Embedding-LLE]

前言&#xff1a; 前面讲的都是线性降维&#xff0c;本篇主要讨论一下非线性降维. 流形学习&#xff08;mainfold learning&#xff09;是一类借鉴了拓扑流行概念的降维方法. 如上图,欧式距离上面 A 点跟C点更近&#xff0c;距离B 点较远 但是从图形拓扑结构来看&#xff0c; …

通过Harbor构建docker私服仓库

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;它扩展了开源的Docker Distribution&#xff0c;通过添加一些企业必需的功能特性&#xff0c;如安全、标识和管理等。Harbor由VMware公司开发并开源&#xff0c;旨在帮助用户迅速搭建一个企业级的Docke…

16:定时器和计数器

定时器和计数器 1、定时器和计数器的介绍2、定时器是如何工作3、寄存器4、51单片机定时器简介&#xff08;数据手册&#xff09;5、定时器中的寄存器&#xff08;数据手册&#xff09;5.1、TCON&#xff08;定时器控制寄存器&#xff09;5.2、TMOD&#xff08;工作模式寄存器&a…

WordPress突然后台无法管理问题

登录WordPress后台管理评论&#xff0c;发现点击编辑、回复均无反应。 尝试清除缓存、关闭CF连接均无效。 查看插件时发现关闭wp-china-yes插件可以解决问题。 后来又测试了下发现加速管理后台这项&#xff0c;在启用时会发生点击无效问题&#xff0c;禁用就好了&#xff0c;不…