当前位置: 首页 > news >正文

【STM32-学习笔记-5-】ADC

文章目录

  • ADC
    • ADC函数
    • Ⅰ、ADC_InitTypeDef结构体参数
      • ①、ADC_Mode
      • ②、ADC_DataAlign
      • ③、ADC_ExternalTrigConv
      • ④、ADC_ContinuousConvMode
      • ⑤、ADC_ScanConvMode
      • ⑥、ADC_NbrOfChannel
    • Ⅱ、ADC配置示例
      • 1、单次转换,非扫描
        • 单次转换非扫描模式下,获取多通道的ADC值
      • 2、 连续转换,非扫描

ADC

ADC函数

// 将指定的ADC寄存器重置为默认值
void ADC_DeInit(ADC_TypeDef* ADCx);// 根据初始化结构体配置ADC参数
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);// 初始化ADC初始化结构体的默认值
void ADC_StructInit(ADC_InitTypeDef* ADC_InitStruct);// 开启或关闭指定的ADC
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 开启或关闭ADC的DMA功能
void ADC_DMACmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 开启或关闭ADC的中断
void ADC_ITConfig(ADC_TypeDef* ADCx, uint16_t ADC_IT, FunctionalState NewState);// 重置ADC校准,准备进行校准操作
void ADC_ResetCalibration(ADC_TypeDef* ADCx);
// 获取ADC重置校准状态,检查是否完成
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
// 开始ADC校准
void ADC_StartCalibration(ADC_TypeDef* ADCx);
// 获取ADC校准状态,检查是否完成
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);// 开启或关闭软件启动ADC转换,用于软件触发转换
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 获取软件启动ADC转换状态
FlagStatus ADC_GetSoftwareStartConvStatus(ADC_TypeDef* ADCx);// 配置ADC不连续模式的通道数量
void ADC_DiscModeChannelCountConfig(ADC_TypeDef* ADCx, uint8_t Number);// 开启或关闭ADC不连续模式
void ADC_DiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 配置ADC常规通道
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);// 开启或关闭外部触发ADC转换
void ADC_ExternalTrigConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 获取ADC转换值
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);// 获取双模式下ADC的转换值
uint32_t ADC_GetDualModeConversionValue(void);// 开启或关闭自动注入转换
void ADC_AutoInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 开启或关闭注入通道不连续模式
void ADC_InjectedDiscModeCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 配置外部触发注入转换
void ADC_ExternalTrigInjectedConvConfig(ADC_TypeDef* ADCx, uint32_t ADC_ExternalTrigInjecConv);// 开启或关闭外部触发注入转换
void ADC_ExternalTrigInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 开启或关闭软件启动注入转换
void ADC_SoftwareStartInjectedConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);// 获取软件启动注入转换命令状态
FlagStatus ADC_GetSoftwareStartInjectedConvCmdStatus(ADC_TypeDef* ADCx);// 配置注入通道
void ADC_InjectedChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);// 配置注入序列长度
void ADC_InjectedSequencerLengthConfig(ADC_TypeDef* ADCx, uint8_t Length);// 设置注入通道的偏移值
void ADC_SetInjectedOffset(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel, uint16_t Offset);
// 获取注入通道的转换值
uint16_t ADC_GetInjectedConversionValue(ADC_TypeDef* ADCx, uint8_t ADC_InjectedChannel);// 开启或关闭模拟看门狗
void ADC_AnalogWatchdogCmd(ADC_TypeDef* ADCx, uint32_t ADC_AnalogWatchdog);
// 配置模拟看门狗的阈值
void ADC_AnalogWatchdogThresholdsConfig(ADC_TypeDef* ADCx, uint16_t HighThreshold, uint16_t LowThreshold);
// 配置模拟看门狗的单通道模式
void ADC_AnalogWatchdogSingleChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel);// 开启或关闭温度传感器和Vrefint通道
void ADC_TempSensorVrefintCmd(FunctionalState NewState);// 获取ADC标志状态
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG)
// 清除ADC标志
void ADC_ClearFlag(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);// 获取ADC中断状态
ITStatus ADC_GetITStatus(ADC_TypeDef* ADCx, uint16_t ADC_IT);
// 清除ADC中断待处理位
void ADC_ClearITPendingBit(ADC_TypeDef* ADCx, uint16_t ADC_IT);

image-20241226134409713

image-20241226134447722

image-20241226134504368

Ⅰ、ADC_InitTypeDef结构体参数

①、ADC_Mode

ADC的工作模式将ADC配置为独立或操作双模式

  • 该参数可以是@ref ADC_mode

    • 枚举类型定义

      typedef enum
      {ADC_Mode_Independent = 0x00000000,             /*!< 独立模式 */ADC_Mode_RegInjecSimult = 0x00010000,          /*!< 规则和注入组同时转换模式 */ADC_Mode_RegSimult_AlterTrig = 0x00020000,     /*!< 规则组同时转换,交替触发模式 */ADC_Mode_InjecSimult_FastInterl = 0x00030000,  /*!< 注入组同时转换,快速交错模式 */ADC_Mode_InjecSimult_SlowInterl = 0x00040000,  /*!< 注入组同时转换,慢速交错模式 */ADC_Mode_InjecSimult = 0x00050000,             /*!< 注入组同时转换模式 */ADC_Mode_RegSimult = 0x00060000,               /*!< 规则组同时转换模式 */ADC_Mode_FastInterl = 0x00070000,              /*!< 快速交错模式 */ADC_Mode_SlowInterl = 0x00080000,              /*!< 慢速交错模式 */ADC_Mode_AlterTrig = 0x00090000                /*!< 交替触发模式 */
      } ADCMode_TypeDef;
      
      • ADC_Mode_Independent
        • 表示ADC工作在独立模式
        • 每个ADC独立操作,适用于单个ADC通道的简单应用
      • ADC_Mode_RegInjecSimult
        • 规则和注入组同时转换模式
      • ADC_Mode_RegSimult_AlterTrig
        • 规则组同时转换,交替触发模式
      • ADC_Mode_InjecSimult_FastInterl
        • 注入组同时转换,快速交错模式
      • ADC_Mode_InjecSimult_SlowInterl
        • 注入组同时转换,慢速交错模式
      • ADC_Mode_InjecSimult
        • 注入组同时转换模式
      • ADC_Mode_RegSimult
        • 规则组同时转换模式
      • ADC_Mode_FastInterl
        • 快速交错模式
      • ADC_Mode_SlowInterl
        • 慢速交错模式
      • ADC_Mode_AlterTrig
        • 交替触发模式

      宏函数

      #define IS_ADC_MODE(MODE) (((MODE) == ADC_Mode_Independent) || \((MODE) == ADC_Mode_RegInjecSimult) || \((MODE) == ADC_Mode_RegSimult_AlterTrig) || \((MODE) == ADC_Mode_InjecSimult_FastInterl) || \((MODE) == ADC_Mode_InjecSimult_SlowInterl) || \((MODE) == ADC_Mode_InjecSimult) || \((MODE) == ADC_Mode_RegSimult) || \((MODE) == ADC_Mode_FastInterl) || \((MODE) == ADC_Mode_SlowInterl) || \((MODE) == ADC_Mode_AlterTrig))
      
      • 描述:检查给定的ADC模式是否有效
      • 参数MODE,代表ADC模式
      • 功能:检查MODE是否等于预定义的ADC模式中的任一个
      • 返回值:如果MODE有效,返回1(真),否则返回0(假)

②、ADC_DataAlign

指定ADC数据是左对齐还是右对齐

  • 该参数可以是@ref ADC_data_align

    • 宏定义解释

      1. ADC_DataAlign_Right
        • 描述:表示ADC转换结果右对齐
          • 在这种模式下,转换结果存储在寄存器的最低位,高位补零
      2. ADC_DataAlign_Left
        • 描述:表示ADC转换结果左对齐
          • 在这种模式下,转换结果存储在寄存器的最高位,低位补零

      宏函数

      1. IS_ADC_DATA_ALIGN(ALIGN)
        • 描述:检查给定的数据对齐设置是否有效
        • 参数ALIGN,代表ADC的数据对齐方式
        • 功能:检查ALIGN是否等于ADC_DataAlign_RightADC_DataAlign_Left中的任一个
        • 返回值:如果ALIGN有效,返回1(真),否则返回0(假)

③、ADC_ExternalTrigConv

配置ADC的外部触发源

  • 对常规信道进行数字转换。这个参数可以是@ref ADC_external_trigger_sources_for_regular_channels_conversion

    • 宏定义解释

      这些宏定义用于选择特定的外部触发源,每个宏定义一个特定的触发源,值为该触发源对应的位掩码

      • ADC_ExternalTrigConv_T1_CC1:使用定时器1的捕获/比较1事件作为外部触发源。适用于ADC1和ADC2

      • ADC_ExternalTrigConv_T1_CC2:使用定时器1的捕获/比较2事件作为外部触发源。适用于ADC1和ADC2

      • ADC_ExternalTrigConv_T2_CC2:使用定时器2的捕获/比较2事件作为外部触发源。适用于ADC1和ADC2

      • ADC_ExternalTrigConv_T3_TRGO:使用定时器3的TRGO事件作为外部触发源。适用于ADC1和ADC2

      • ADC_ExternalTrigConv_T4_CC4:使用定时器4的捕获/比较4事件作为外部触发源。适用于ADC1和ADC2

      • ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO:使用外部中断11或定时器8的TRGO事件作为外部触发源。适用于ADC1和ADC2

      • ADC_ExternalTrigConv_T1_CC3:使用定时器1的捕获/比较3事件作为外部触发源。适用于ADC1、ADC2和ADC3

      • ADC_ExternalTrigConv_None:不使用外部触发源,即软件触发。适用于ADC1、ADC2和ADC3

      • ADC_ExternalTrigConv_T3_CC1:使用定时器3的捕获/比较1事件作为外部触发源。仅适用于ADC3

      • ADC_ExternalTrigConv_T2_CC3:使用定时器2的捕获/比较3事件作为外部触发源。仅适用于ADC3

      • ADC_ExternalTrigConv_T8_CC1:使用定时器8的捕获/比较1事件作为外部触发源。仅适用于ADC3

      • ADC_ExternalTrigConv_T8_TRGO:使用定时器8的TRGO事件作为外部触发源。仅适用于ADC3

      • ADC_ExternalTrigConv_T5_CC1:使用定时器5的捕获/比较1事件作为外部触发源。仅适用于ADC3

      • ADC_ExternalTrigConv_T5_CC3:使用定时器5的捕获/比较3事件作为外部触发源。仅适用于ADC3

      宏函数

      #define IS_ADC_EXT_TRIG(REGTRIG) (((REGTRIG) == ADC_ExternalTrigConv_T1_CC1) || \((REGTRIG) == ADC_ExternalTrigConv_T1_CC2) || \((REGTRIG) == ADC_ExternalTrigConv_T1_CC3) || \((REGTRIG) == ADC_ExternalTrigConv_T2_CC2) || \((REGTRIG) == ADC_ExternalTrigConv_T3_TRGO) || \((REGTRIG) == ADC_ExternalTrigConv_T4_CC4) || \((REGTRIG) == ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO) || \((REGTRIG) == ADC_ExternalTrigConv_None) || \((REGTRIG) == ADC_ExternalTrigConv_T3_CC1) || \((REGTRIG) == ADC_ExternalTrigConv_T2_CC3) || \((REGTRIG) == ADC_ExternalTrigConv_T8_CC1) || \((REGTRIG) == ADC_ExternalTrigConv_T8_TRGO) || \((REGTRIG) == ADC_ExternalTrigConv_T5_CC1) || \((REGTRIG) == ADC_ExternalTrigConv_T5_CC3))
      
      • 描述:检查给定的外部触发源设置是否有效
      • 参数REGTRIG,代表ADC的外部触发源
      • 功能:检查REGTRIG是否等于预定义的外部触发源中的任一个
      • 返回值:如果REGTRIG有效,返回1(真),否则返回0(假)

      表格:

      宏定义描述适用ADC
      ADC_ExternalTrigConv_T1_CC10x00000000使用定时器1的捕获/比较1事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_T1_CC20x00020000使用定时器1的捕获/比较2事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_T2_CC20x00060000使用定时器2的捕获/比较2事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_T3_TRGO0x00080000使用定时器3的TRGO事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_T4_CC40x000A0000使用定时器4的捕获/比较4事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_Ext_IT11_TIM8_TRGO0x000C0000使用外部中断11或定时器8的TRGO事件作为外部触发源ADC1, ADC2
      ADC_ExternalTrigConv_T1_CC30x00040000使用定时器1的捕获/比较3事件作为外部触发源ADC1, ADC2, ADC3
      ADC_ExternalTrigConv_None0x000E0000不使用外部触发源,即软件触发ADC1, ADC2, ADC3
      ADC_ExternalTrigConv_T3_CC10x00000000使用定时器3的捕获/比较1事件作为外部触发源ADC3
      ADC_ExternalTrigConv_T2_CC30x00020000使用定时器2的捕获/比较3事件作为外部触发源ADC3
      ADC_ExternalTrigConv_T8_CC10x00060000使用定时器8的捕获/比较1事件作为外部触发源ADC3
      ADC_ExternalTrigConv_T8_TRGO0x00080000使用定时器8的TRGO事件作为外部触发源ADC3
      ADC_ExternalTrigConv_T5_CC10x000A0000使用定时器5的捕获/比较1事件作为外部触发源ADC3
      ADC_ExternalTrigConv_T5_CC30x000C0000使用定时器5的捕获/比较3事件作为外部触发源ADC3

④、ADC_ContinuousConvMode

单次转换or连续转换

  • 值:

      • ENABLE:连续转换
      • DISABLE:单次转换

⑤、ADC_ScanConvMode

非扫描模式or扫描模式

  • 值:

      • ENABLE:扫描模式
      • DISABLE:非扫描模式

⑥、ADC_NbrOfChannel

指定要转换的ADC通道的数量

  • 功能:指定在常规通道组中,将使用序列器进行转换的ADC通道的数量
  • 取值范围:1到16
  • 作用:这个参数决定了ADC在一次转换序列中将转换多少个通道。例如,如果你设置ADC_NbrOfChannel为3,那么ADC将在一次转换序列中依次转换3个通道

Ⅱ、ADC配置示例

1、单次转换,非扫描

#include "stm32f10x.h"                  // Device header
//模拟量转换为数字量
void AD_Init(void)
{	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启GPIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);//开启ADC时钟RCC_ADCCLKConfig(RCC_PCLK2_Div6);//配置ADC时钟(72MHz/6=12MHz)//配置GPIOGPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AIN;//模拟输入GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStruct);ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_41Cycles5);//配置ADC常规通道//配置ADCADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//将ADC配置为独立或操作双模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发ADC_InitStruct.ADC_ContinuousConvMode = DISABLE;//单次转换or连续转换ADC_InitStruct.ADC_ScanConvMode = DISABLE;//非扫描模式or扫描模式ADC_InitStruct.ADC_NbrOfChannel = 1;//仅在扫描模式下该参数才有用ADC_Init(ADC1, &ADC_InitStruct);ADC_Cmd(ADC1, ENABLE);//开启ADC//ADC复位+校准ADC_ResetCalibration(ADC1);//重置ADC校准,准备进行校准操作while(ADC_GetResetCalibrationStatus(ADC1) == SET);//获取ADC重置校准状态,检查是否完成ADC_StartCalibration(ADC1);//开始ADC校准while(ADC_GetCalibrationStatus(ADC1) == SET);//获取ADC校准状态,检查是否完成
}uint16_t AD_GetValue(void)//获取模拟值
{ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启软件启动ADC转换,用于软件触发转换--启动while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//获取ADC标志状态--等待return ADC_GetConversionValue(ADC1);//获取ADC转换值--读取
}
单次转换非扫描模式下,获取多通道的ADC值
uint16_t AD_GetValue(uint8_t ADC_Channel)//获取模拟值
{//选择不同的通道或取ADC值ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_41Cycles5);//配置ADC常规通道ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启软件启动ADC转换,用于软件触发转换--启动while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//获取ADC标志状态--等待return ADC_GetConversionValue(ADC1);//获取ADC转换值--读取
}

2、 连续转换,非扫描

	//配置ADCADC_InitTypeDef ADC_InitStruct;ADC_InitStruct.ADC_Mode = ADC_Mode_Independent;//将ADC配置为独立或操作双模式ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐ADC_InitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//不使用外部触发ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;//单次转换or连续转换ADC_InitStruct.ADC_ScanConvMode = DISABLE;//非扫描模式or扫描模式ADC_InitStruct.ADC_NbrOfChannel = 1;//仅在扫描模式下该参数才有用ADC_Init(ADC1, &ADC_InitStruct);ADC_Cmd(ADC1, ENABLE);//开启ADC//ADC复位+校准ADC_ResetCalibration(ADC1);//重置ADC校准,准备进行校准操作while(ADC_GetResetCalibrationStatus(ADC1) == SET);//获取ADC重置校准状态,检查是否完成ADC_StartCalibration(ADC1);//开始ADC校准while(ADC_GetCalibrationStatus(ADC1) == SET);//获取ADC校准状态,检查是否完成ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启软件启动ADC转换,用于软件触发转换--启动
}uint16_t AD_GetValue(void)//获取模拟值
{while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);//获取ADC标志状态--等待return ADC_GetConversionValue(ADC1);//获取ADC转换值--读取
}

相关文章:

【STM32-学习笔记-5-】ADC

文章目录 ADCADC函数Ⅰ、ADC_InitTypeDef结构体参数①、ADC_Mode②、ADC_DataAlign③、ADC_ExternalTrigConv④、ADC_ContinuousConvMode⑤、ADC_ScanConvMode⑥、ADC_NbrOfChannel Ⅱ、ADC配置示例1、单次转换&#xff0c;非扫描单次转换非扫描模式下&#xff0c;获取多通道的…...

TY1801 反激变换器PWM GaN功率开关

TY1801 是一款针对离线式反激变换器的多模式 PWM GaN 功率开关。TY1801 内置 GaN 功率管,它具备超宽 的 VCC 工作范围&#xff0c;非常适用于 PD 快充等要求宽输出电压的应用场合,系统不需要使用额外的绕组或外围降压电路&#xff0c;节省系统 BOM 成本。TY1801 支持 Burst&…...

Jenkins安装、插件下载及构建环境配置详解

Jenkins简介 1.1 简介 Jenkins 是一个基于Java开发的开源持续集成工具&#xff0c;它提供了一个开放且易用的软件平台&#xff0c;主要用于自动化构建、测试和部署软件项目&#xff0c;以实现持续集成&#xff08;CI&#xff09;和持续交付/部署&#xff08;CD&#xff09;。…...

ESP32,uart安装驱动uart_driver_install函数剖析,以及intr_alloc_flags 参数的意义

在 uart_driver_install 函数中&#xff0c;参数 RX_BUF_SIZE * 2 指定了接收缓冲区&#xff08;RX buffer&#xff09;的大小。这个参数对于 UART 驱动程序来说非常重要&#xff0c;因为它决定了可以存储多少接收到的数据&#xff0c;直到应用程序读取它们为止。下面是对该函数…...

Ubuntu把应用程序放到桌面

有时候我们下载的软件是一个文件夹&#xff0c;通常需要进入进入指定文件夹下去执行.sh 文件来启动&#xff0c;下面来个实例如何把idea放到桌面 打开文件目录/usr/share/applications/或者~/.local/share/applications/目录。第一个目录是全局的&#xff0c;所有用户都可以使…...

什么是端口映射

端口映射 端口映射&#xff08;Port Mapping&#xff09;是一种网络技术&#xff0c;用于将外部网络请求转发到内部网络的特定设备或服务。它通常用于以下场景&#xff1a; 外部访问内部服务&#xff1a;允许外部用户通过公网IP访问内网中的设备或服务。多设备共享IP&#xf…...

数据结构《MapSet哈希表》

文章目录 一、搜索树1.1 定义1.2 模拟实现搜索 二、Map2.1 定义2.2 Map.Entry2.3 TreeMap的使用2.4 Map的常用方法 三、Set3.1 定义3.2 TreeSet的使用3.3 Set的常用方法 四、哈希表4.1 哈希表的概念4.2 冲突4.2.1 冲突的概念4.2.2 冲突的避免1. 选择合适的哈希函数2. 负载因子调…...

【QT】QComboBox:activated信号和currentIndexChanged信号的区别

目录 1、activated1.1 原型1.2 触发机制1.3 使用场景1.4 连接信号和槽的方法1.4.1 方式一1.4.2 方式二 2、currentIndexChanged2.1 原型2.2 触发机制2.3 使用场景2.4 连接信号和槽的方法 1、activated 1.1 原型 [signal] void QComboBox::activated(int index) [signal] void…...

【Block总结】ELGCA模块,池化-转置(PT)注意力和深度卷积有效聚合局部和全局上下文信息

ELGCA结构 论文题目&#xff1a;ELGC-Net: Efficient Local-Global Context Aggregation for Remote Sensing Change Detection 论文链接&#xff1a;https://arxiv.org/pdf/2403.17909 官方github&#xff1a;https://github.com/techmn/elgcnet 高效局部-全局上下文聚合器&…...

MERN全栈脚手架(MongoDB、Express、React、Node)与Yeoman详解

MERN 全栈脚手架是一种用于快速构建基于 MongoDB、Express、React 和 Node.js 的全栈应用的框架或模板。它帮助开发者快速启动项目&#xff0c;减少了从零开始配置的时间。以下是关于 MERN 全栈脚手架的详细解析。 一、MERN 技术栈简介 MongoDB: 文档型数据库&#xff0c;用于…...

基于springboot+vue+微信小程序的宠物领养系统

基于springbootvue微信小程序的宠物领养系统 一、介绍 本项目利用SpringBoot、Vue和微信小程序技术&#xff0c;构建了一个宠物领养系统。 本系统的设计分为两个层面&#xff0c;分别为管理层面与用户层面&#xff0c;也就是管理者与用户&#xff0c;管理权限与用户权限是不…...

如何使用策略模式并让spring管理

1、策略模式公共接口类 BankFileStrategy public interface BankFileStrategy {String getBankFile(String bankType) throws Exception; } 2、策略模式业务实现类 Slf4j Component public class ConcreteStrategy implements BankFileStrategy {Overridepublic String ge…...

react中hooks之useRef 用法总结

1. 基本概念 useRef 是 React 的一个 Hook&#xff0c;返回一个可变的 ref 对象&#xff0c;其 .current 属性被初始化为传入的参数。这个对象在组件的整个生命周期内保持不变。 2. 主要用途和特性 2.1 获取 DOM 元素实例 function TextInputWithFocusButton() {const inpu…...

使用 Docker 部署 Java 项目(通俗易懂)

目录 1、下载与配置 Docker 1.1 docker下载&#xff08;这里使用的是Ubuntu&#xff0c;Centos命令可能有不同&#xff09; 1.2 配置 Docker 代理对象 2、打包当前 Java 项目 3、进行编写 DockerFile&#xff0c;并将对应文件传输到 Linux 中 3.1 编写 dockerfile 文件 …...

如何在Ubuntu上安装和配置Git

版本控制系统&#xff08;VCS&#xff09;是软件开发过程中不可或缺的工具之一&#xff0c;它帮助开发者跟踪代码变更、协作开发以及管理不同版本的项目。Git作为当前最流行的分布式版本控制系统&#xff0c;因其高效性和灵活性而广受青睐。本文将指导你如何在Ubuntu操作系统上…...

FPGA 21 ,深入理解 Verilog 中的基数,以及二进制数与十进制数之间的关系( Verilog中的基数 )

目录 前言 一. 基数基础 1.1 基数介绍 2.1 基数符号 3.1 二进制数 二. 二进制与十进制数 三. 二进制数 3.1 定义寄存器类型变量 3.2 定义线网类型变量 3.3 赋值操作 3.4 解析二进制数为十进制数 四. 代码示例 五. 注意事项 六. 更多操作 前言 在Verilog中&#…...

【redis】redis-cli命令行工具的使用

redis-cli命令行工具是一个功能强大的Redis客户端&#xff0c;它允许用户与Redis数据库进行交互和管理。 以下是一些常用参数的使用说明&#xff1a; 基本连接参数 -h, --host <hostname>&#xff1a;指定要连接的Redis服务器的主机名或IP地址。如果未指定&#xff0c;…...

使用Matplotlib显示中文的方法

1 问题提出 使用图1所示的代码进行matplotlib绘图时&#xff0c;因为其默认不支持中文&#xff0c;此时无法显示正确内容&#xff0c;如图2所示。 图1 matplotlib绘图绘图代码 图2 matplotlib无法显示中文 2 问题解决 2.1 设置全局字体 在图1所示的代码中&#xff0c;第13…...

SQL Server2022详细安装教程

1. 打开SQL Server官网&#xff1a;SQL Server 下载 | Microsoft 2. 选择Developer版 3. 下载好安装包&#xff0c;打开&#xff0c;选择自定义 4. 选择下载位置&#xff0c;最好不要在C盘即主磁盘即可。等待下载 5. 下载成功之后会弹出这个框 6. 点击“安装”&#…...

家里温度随心控,假期出行更舒适~

春节假期马上到来啦&#xff01;这是放松身心、陪伴家人的最佳时机~      但旅途结束的温差变化、空气质量问题是否让你有些担忧呢&#xff1f;      别担心&#xff01;有了约克VRF中央空调&#xff0c;让你的假期更加舒心无忧~      清新空气&#xff0c;自在出游…...

从四皇后到N皇后:回溯算法的核心思想与实战演练

1. 从棋盘游戏到算法思维&#xff1a;四皇后问题入门 记得我第一次接触四皇后问题时&#xff0c;正坐在大学算法课的教室里。教授用粉笔在黑板上画出一个4x4的棋盘&#xff0c;然后突然转身问我们&#xff1a;"如果让你们来摆放这四个皇后&#xff0c;保证她们互不攻击&am…...

手把手教你用AT32F403A实现串口空闲中断接收完整数据帧

深入解析AT32F403A串口空闲中断实现高效数据帧接收 在嵌入式系统开发中&#xff0c;串口通信是最基础也最常用的外设接口之一。面对实际应用中常见的不定长数据帧接收需求&#xff0c;传统轮询方式不仅效率低下&#xff0c;还容易丢失数据。而国产MCU雅特力AT32F403A提供的**串…...

技术无罪,人心可畏 —— 写在 315 “GEO 投毒” 话题之后

2026 年央视 315 晚会&#xff0c;将镜头对准了人工智能领域的灰色地带 ——“AI 投毒” 与 “GEO” 一夜之间成为公众热议的话题。记者虚构了一款名为 “Apollo-9” 的智能手环&#xff0c;借助 “GEO 优化系统” 批量生成虚假内容&#xff0c;短短数小时就让多个主流 AI 大模…...

千问3.5-2B在VSCode中的集成应用:基于CodeX的智能编程助手搭建

千问3.5-2B在VSCode中的集成应用&#xff1a;基于CodeX的智能编程助手搭建 1. 引言 作为一名开发者&#xff0c;你是否经常在编码过程中遇到这些问题&#xff1a;记不清某个API的具体用法&#xff1f;需要快速生成重复性代码片段&#xff1f;遇到报错信息却找不到清晰的解释&…...

DP数组的容量要不要+1?

其实&#xff0c;dp 数组要不要 1&#xff0c;完全取决于 “DP数组”下标代表什么 。 简单来说&#xff0c;只有两种情况。我们结合“凑钱”题和经典的“爬楼梯”题来对比一下。&#x1f4cf; 情况一&#xff1a;下标代表“金额/重量/容量”&#xff08;需要 1&#xff09; 场景…...

Ascend CANN平台避坑指南:从算子开发到模型部署的5个关键陷阱

Ascend CANN平台避坑指南&#xff1a;从算子开发到模型部署的5个关键陷阱 在AI加速器领域&#xff0c;昇腾NPU凭借其独特的达芬奇架构和CANN软件栈&#xff0c;正在成为越来越多企业级AI部署的首选方案。然而在实际工程落地过程中&#xff0c;从算子开发到模型部署的完整链路里…...

GPU算力高效利用:Pixel Language Portal在单卡多实例部署中的资源隔离与负载均衡教程

GPU算力高效利用&#xff1a;Pixel Language Portal在单卡多实例部署中的资源隔离与负载均衡教程 1. 引言&#xff1a;为什么需要单卡多实例部署 在AI应用开发中&#xff0c;GPU资源往往是稀缺且昂贵的。Pixel Language Portal作为一款基于Tencent Hunyuan-MT-7B的高端翻译工…...

效率提升:基于快马平台实现openclaw windows部署的自动化与优化

最近在团队里负责优化openclaw在Windows环境的部署流程&#xff0c;发现传统手动部署方式存在不少效率瓶颈。经过在InsCode(快马)平台上的实践&#xff0c;我们实现了一套自动化部署方案&#xff0c;效果提升明显。这里分享几个关键优化点&#xff1a; 全流程一键化部署 过去部…...

S2-Pro在Windows系统的一键部署与简易客户端开发

S2-Pro在Windows系统的一键部署与简易客户端开发 1. 引言 如果你是一名Windows用户&#xff0c;想要快速体验S2-Pro的强大能力&#xff0c;但又不想折腾复杂的命令行操作&#xff0c;这篇文章就是为你准备的。我们将从零开始&#xff0c;带你完成两个关键步骤&#xff1a; 在…...

MAI-UI-8B入门:Node.js环境配置与自动化测试

MAI-UI-8B入门&#xff1a;Node.js环境配置与自动化测试 1. 开篇&#xff1a;为什么选择MAI-UI-8B进行自动化测试 如果你正在寻找一个能够真正理解图形界面、像真人一样操作应用的自动化测试方案&#xff0c;MAI-UI-8B绝对值得关注。这个由阿里通义实验室开源的GUI智能体模型…...