STM32标准库-ADC数模转换器
文章目录
- 一、ADC
- 1.1简介
- 1. 2逐次逼近型ADC
- 1.3ADC框图
- 1.4ADC基本结构
- 1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)
- 1.4.2 信号 “调度站”:多路开关
- 1.4.3 信号 “加工厂”:ADC 转换器(规则组 + 注入组)
- 1.4.4信号 “暂存柜”:AD 数据寄存器
- 1.4.5 信号 “监督员”:模拟看门狗
- 1.4.6信号 “报警器”:中断输出控制 + NVIC
- 1.4.7 系统 “动力源”:触发控制 + RCC
- 1.4.8系统 “总开关”:开关控制
- 1.5输入通道
- 1.6转换模式
- 1.7触发控制
- 1.8数据对齐
- 1.9转换时间
- 1.10校准
- 1.11硬件电路
- 二、AD单通道
- 2.1接线图
- 2.2代码
- 2.3ADC 相关 API 函数
- 1. 时钟配置函数
- 2. GPIO 配置函数
- 3. ADC 配置函数
- 4. ADC 控制函数
- 5. 状态和数据读取函数
- 2.4工作现象
- 三、AD多通道
- 3.1接线图
- 3.2代码
- 3.3AD单通道未提及的关键 API
- 1. ADC 通道配置函数
- 2. 采样时间说明
- 3. ADC 状态标志位
- 3.4工作现象
- 1. **光敏传感器(AO 接 ADC 通道,如 PA0)**
- 2. **声音传感器(AO 接 ADC 通道,如 PA1)**
- 3. **红外避障传感器(AO 接 ADC 通道,如 PA2)**
- 4. **电位器(中间引脚接 ADC 通道,如 PA3)**
一、ADC
1.1简介
1. 2逐次逼近型ADC
1.3ADC框图
1.4ADC基本结构
以下用更通俗的 “信号 journey(旅程)” 逻辑,拆解各模块咋连接、咋配合干活:
1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)
- GPIO(16 路):像 16 个 “小天线”,能接外部五花八门的模拟信号(比如传感器电压、旋钮调节的电平 ),是最常用的信号入口。
- 温度传感器:专门测温度,把温度变化转成电压信号,相当于 “温度→电信号” 翻译器。
- V_REFINT:内部精准参考电压,像 “标准尺”,给 ADC 转换当基准(比如转换时拿信号和它比,确定数字值 )。
这些信号要先 “排队上车”,统一交给 多路开关(下面讲它的作用 )。
1.4.2 信号 “调度站”:多路开关
- 作用:当 “交通调度员”,决定让哪路信号进 ADC 转换器。
- 逻辑:比如同时有 GPIO、温度传感器的信号,它选 1 路(规则组模式)或几路(注入组模式 ),送往后边的 ADC 转换器。
1.4.3 信号 “加工厂”:ADC 转换器(规则组 + 注入组)
- 规则组(最多 16 路):常规 “生产线”,按预设顺序、节奏转换信号(比如循环采集 16 路 GPIO ),适合普通、批量的转换需求。
- 注入组(最多 4 路):“加急生产线”,优先级更高!遇到紧急信号(比如关键传感器超阈值 ),能插队先转换,灵活处理特殊需求。
不管规则组还是注入组,干的事一样:把模拟信号(连续电压 )切成数字信号(0 和 1 组成的编码 )。
1.4.4信号 “暂存柜”:AD 数据寄存器
- 转换完的数字信号,得找地方 “临时存一下”:
- 规则组结果:存在 “规则结果 ×1” 里(1 组数据对应 1 个寄存器 )。
- 注入组结果:存在 “注入结果 ×4” 里(最多存 4 组,方便快速连续处理 )。
- 就像工厂生产完零件,先放仓库,等 CPU 来 “取货” 处理。
1.4.5 信号 “监督员”:模拟看门狗
- 作用:当 “质量检测员”,盯着转换后的数字信号,看是否超出你设定的范围(比如温度不能太高 / 太低 )。
- 触发:一旦超范围,立马发信号(相当于 “报警” ),告诉系统 “这信号有问题!”
1.4.6信号 “报警器”:中断输出控制 + NVIC
- 中断输出控制:收到模拟看门狗的 “报警” 后,整理信号,决定咋通知系统。
- NVIC(嵌套向量中断控制器):系统的 “总调度台”,收到中断信号后,暂停当前任务,优先处理 “信号异常” 事件(比如触发紧急程序、记录日志 )。
1.4.7 系统 “动力源”:触发控制 + RCC
- RCC(时钟控制器):给 ADC 整个系统提供 “心跳”(时钟信号 ),所有模块得跟着时钟节奏干活,否则会乱套。
- 触发控制:决定啥时候启动 ADC 转换,像 “开关”:可以软件手动触发(程序里写代码启动 ),也能硬件触发(比如定时器定时启动 ),发的信号叫 “START”。
1.4.8系统 “总开关”:开关控制
- 简单粗暴:控制 ADC 模块整体 “开 / 关”。不用 ADC 时,关掉省点电;要用时,打开干活。
1.5输入通道
1.6转换模式
1.7触发控制
1.8数据对齐
1.9转换时间
1.10校准
1.11硬件电路
二、AD单通道
2.1接线图
2.2代码
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"uint16_t ADValue; //定义AD值变量
float Voltage; //定义电压变量int main(void)
{/*模块初始化*/OLED_Init(); //OLED初始化AD_Init(); //AD初始化/*显示静态字符串*/OLED_ShowString(1, 1, "ADValue:");OLED_ShowString(2, 1, "Voltage:0.00V");while (1){ADValue = AD_GetValue(); //获取AD转换的值Voltage = (float)ADValue / 4095 * 3.3; //将AD值线性变换到0~3.3的范围,表示电压OLED_ShowNum(1, 9, ADValue, 4); //显示AD值OLED_ShowNum(2, 9, Voltage, 1); //显示电压值的整数部分OLED_ShowNum(2, 11, (uint16_t)(Voltage * 100) % 100, 2); //显示电压值的小数部分Delay_ms(100); //延时100ms,手动增加一些转换的间隔时间}
}
AD.c
#include "stm32f10x.h" // Device header/*** 函 数:AD初始化* 参 数:无* 返 回 值:无*/
void AD_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*设置ADC时钟*/RCC_ADCCLKConfig(RCC_PCLK2_Div6); //选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA0引脚初始化为模拟输入/*规则组通道配置*/ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //规则组序列1的位置,配置为通道0/*ADC初始化*/ADC_InitTypeDef ADC_InitStructure; //定义结构体变量ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //模式,选择独立模式,即单独使用ADC1ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据对齐,选择右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部触发,使用软件触发,不需要外部触发ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //连续转换,失能,每转换一次规则组序列后停止ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描模式,失能,只转换规则组的序列1这一个位置ADC_InitStructure.ADC_NbrOfChannel = 1; //通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1ADC_Init(ADC1, &ADC_InitStructure); //将结构体变量交给ADC_Init,配置ADC1/*ADC使能*/ADC_Cmd(ADC1, ENABLE); //使能ADC1,ADC开始运行/*ADC校准*/ADC_ResetCalibration(ADC1); //固定流程,内部有电路会自动执行校准while (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) == SET);
}/*** 函 数:获取AD转换的值* 参 数:无* 返 回 值:AD转换的值,范围:0~4095*/
uint16_t AD_GetValue(void)
{ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发AD转换一次while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //等待EOC标志位,即等待AD转换结束return ADC_GetConversionValue(ADC1); //读数据寄存器,得到AD转换的结果
}
2.3ADC 相关 API 函数
1. 时钟配置函数
c
运行
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
-
功能:启用或禁用 APB2 总线上的外设时钟(如 ADC1、GPIOA)。
-
参数 :
RCC_APB2Periph
:外设选择(如RCC_APB2Periph_ADC1
、RCC_APB2Periph_GPIOA
)。NewState
:ENABLE
或DISABLE
。
c
运行
void RCC_ADCCLKConfig(uint32_t RCC_PCLK2);
-
功能:配置 ADC 时钟分频(ADC 时钟必须 ≤ 14MHz)。
-
参数 :
RCC_PCLK2
:分频选项(如RCC_PCLK2_Div6
表示 72MHz/6=12MHz)。
2. GPIO 配置函数
c
运行
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
-
功能:初始化 GPIO 引脚。
-
参数 :
GPIOx
:GPIO 端口(如GPIOA
)。GPIO_InitStruct
:GPIO 配置结构体(模式、引脚、速度)。
3. ADC 配置函数
c
运行
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
-
功能:配置规则组通道的转换顺序和采样时间。
-
参数 :
ADCx
:ADC 外设(如ADC1
)。ADC_Channel
:通道号(如ADC_Channel_0
对应 PA0)。Rank
:序列位置(1~16)。ADC_SampleTime
:采样周期(如ADC_SampleTime_55Cycles5
)。
c
运行
void ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct);
-
功能:初始化 ADC 参数。
-
参数 :
ADCx
:ADC 外设。ADC_InitStruct
:ADC 配置结构体(模式、对齐方式、触发方式等)。
4. ADC 控制函数
c
运行
void ADC_Cmd(ADC_TypeDef* ADCx, FunctionalState NewState);
-
功能:启用或禁用 ADC。
-
参数 :
ADCx
:ADC 外设。NewState
:ENABLE
或DISABLE
。
c
运行
void ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState);
-
功能:软件触发 ADC 转换。
-
参数 :
ADCx
:ADC 外设。NewState
:ENABLE
触发一次转换。
c
运行
void ADC_ResetCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetResetCalibrationStatus(ADC_TypeDef* ADCx);
void ADC_StartCalibration(ADC_TypeDef* ADCx);
FlagStatus ADC_GetCalibrationStatus(ADC_TypeDef* ADCx);
- 功能:ADC 校准流程(复位校准、获取复位状态、开始校准、获取校准状态)。
5. 状态和数据读取函数
c
运行
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
-
功能:检查 ADC 标志位状态(如转换完成标志
ADC_FLAG_EOC
)。 -
参数 :
ADCx
:ADC 外设。ADC_FLAG
:标志位类型。
c
运行
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx);
-
功能:获取 ADC 转换结果(0~4095,12 位分辨率)。
-
参数 :
ADCx
:ADC 外设。
AD.h
#ifndef __AD_H
#define __AD_Hvoid AD_Init(void);
uint16_t AD_GetValue(void);#endif
2.4工作现象
- 初始化阶段
- 调用
AD_Init()
后,ADC1 时钟开启,GPIOA 引脚配置为模拟输入模式,规则组通道 0(PA0)完成配置,ADC 进入就绪状态。 - 校准过程中,
ADC_ResetCalibration
和ADC_StartCalibration
会触发内部校准电路工作,校准完成后标志位自动清除。
- 调用
- 转换阶段
- 调用
AD_GetValue()
时,软件触发转换(ADC_SoftwareStartConvCmd
),ADC_FLAG_EOC
标志位在转换完成后置 1,返回值在 0~4095 范围内(对应输入电压 0~3.3V)。 - 若输入电压稳定(如接固定电阻分压),多次读取的 ADC 值波动较小(通常≤±3LSB)。
- 调用
- 数据对应关系
三、AD多通道
3.1接线图
3.2代码
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"uint16_t AD0, AD1, AD2, AD3; //定义AD值变量int main(void)
{/*模块初始化*/OLED_Init(); //OLED初始化AD_Init(); //AD初始化/*显示静态字符串*/OLED_ShowString(1, 1, "AD0:");OLED_ShowString(2, 1, "AD1:");OLED_ShowString(3, 1, "AD2:");OLED_ShowString(4, 1, "AD3:");while (1){AD0 = AD_GetValue(ADC_Channel_0); //单次启动ADC,转换通道0AD1 = AD_GetValue(ADC_Channel_1); //单次启动ADC,转换通道1AD2 = AD_GetValue(ADC_Channel_2); //单次启动ADC,转换通道2AD3 = AD_GetValue(ADC_Channel_3); //单次启动ADC,转换通道3OLED_ShowNum(1, 5, AD0, 4); //显示通道0的转换结果AD0OLED_ShowNum(2, 5, AD1, 4); //显示通道1的转换结果AD1OLED_ShowNum(3, 5, AD2, 4); //显示通道2的转换结果AD2OLED_ShowNum(4, 5, AD3, 4); //显示通道3的转换结果AD3Delay_ms(100); //延时100ms,手动增加一些转换的间隔时间}
}
AD.c
#include "stm32f10x.h" // Device header/*** 函 数:AD初始化* 参 数:无* 返 回 值:无*/
void AD_Init(void)
{/*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //开启ADC1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*设置ADC时钟*/RCC_ADCCLKConfig(RCC_PCLK2_Div6); //选择时钟6分频,ADCCLK = 72MHz / 6 = 12MHz/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); //将PA0、PA1、PA2和PA3引脚初始化为模拟输入/*不在此处配置规则组序列,而是在每次AD转换前配置,这样可以灵活更改AD转换的通道*//*ADC初始化*/ADC_InitTypeDef ADC_InitStructure; //定义结构体变量ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //模式,选择独立模式,即单独使用ADC1ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据对齐,选择右对齐ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //外部触发,使用软件触发,不需要外部触发ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //连续转换,失能,每转换一次规则组序列后停止ADC_InitStructure.ADC_ScanConvMode = DISABLE; //扫描模式,失能,只转换规则组的序列1这一个位置ADC_InitStructure.ADC_NbrOfChannel = 1; //通道数,为1,仅在扫描模式下,才需要指定大于1的数,在非扫描模式下,只能是1ADC_Init(ADC1, &ADC_InitStructure); //将结构体变量交给ADC_Init,配置ADC1/*ADC使能*/ADC_Cmd(ADC1, ENABLE); //使能ADC1,ADC开始运行/*ADC校准*/ADC_ResetCalibration(ADC1); //固定流程,内部有电路会自动执行校准while (ADC_GetResetCalibrationStatus(ADC1) == SET);ADC_StartCalibration(ADC1);while (ADC_GetCalibrationStatus(ADC1) == SET);
}/*** 函 数:获取AD转换的值* 参 数:ADC_Channel 指定AD转换的通道,范围:ADC_Channel_x,其中x可以是0/1/2/3* 返 回 值:AD转换的值,范围:0~4095*/
uint16_t AD_GetValue(uint8_t ADC_Channel)
{ADC_RegularChannelConfig(ADC1, ADC_Channel, 1, ADC_SampleTime_55Cycles5); //在每次转换前,根据函数形参灵活更改规则组的通道1ADC_SoftwareStartConvCmd(ADC1, ENABLE); //软件触发AD转换一次while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET); //等待EOC标志位,即等待AD转换结束return ADC_GetConversionValue(ADC1); //读数据寄存器,得到AD转换的结果
}
AD.h
#ifndef __AD_H
#define __AD_Hvoid AD_Init(void);
uint16_t AD_GetValue(uint8_t ADC_Channel);#endif
3.3AD单通道未提及的关键 API
除了之前提到的 ADC API,这段代码还涉及以下未详细说明的函数:
1. ADC 通道配置函数
c
运行
void ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime);
-
功能:配置规则组序列中的通道及其采样时间。
-
参数 :
ADC_Channel
:通道号(如ADC_Channel_0
~ADC_Channel_17
)。Rank
:序列位置(1~16,单通道模式下固定为 1)。ADC_SampleTime
:采样周期(如ADC_SampleTime_55Cycles5
)。
2. 采样时间说明
ADC 采样时间影响转换精度和速度,可选值包括:
c
运行
ADC_SampleTime_1Cycles5 // 1.5个ADC时钟周期(最快)
ADC_SampleTime_7Cycles5 // 7.5个周期
ADC_SampleTime_13Cycles5 // 13.5个周期
ADC_SampleTime_28Cycles5 // 28.5个周期
ADC_SampleTime_41Cycles5 // 41.5个周期
ADC_SampleTime_55Cycles5 // 55.5个周期
ADC_SampleTime_71Cycles5 // 71.5个周期
ADC_SampleTime_239Cycles5 // 239.5个周期(最慢,抗干扰最强)
3. ADC 状态标志位
c
运行
FlagStatus ADC_GetFlagStatus(ADC_TypeDef* ADCx, uint8_t ADC_FLAG);
-
常用标志位 :
ADC_FLAG_EOC
:规则组转换完成标志(代码中使用)。ADC_FLAG_AWD
:模拟看门狗触发标志(需额外配置)。ADC_FLAG_OVR
:数据溢出标志(连续转换模式下可能出现)。
3.4工作现象
-
初始化后:ADC1 和 GPIOA 时钟开启,PA0~PA3 配置为模拟输入模式,ADC 处于就绪状态但未开始转换(需调用
AD_GetValue()
触发)。 -
动态通道选择:每次调用
AD_GetValue(channel)
时,会临时配置规则组序列 1 为指定通道(如ADC_Channel_2
对应 PA2),然后触发单次转换。 -
转换结果
:返回值范围为 0~4095,对应输入电压 0~3.3V(假设 VREF 为 3.3V)。例如:
- 输入 1.65V → 返回值约为 2048(1.65V/3.3V × 4095 ≈ 2048)。
- 输入悬空(无信号)→ 返回随机值(受噪声影响)。
1. 光敏传感器(AO 接 ADC 通道,如 PA0)
-
现象 :
- 光照越强(如手电筒照射),ADC 值 越大(对应电压越高,假设传感器输出与光照正相关);
- 光照越弱(手遮挡),ADC 值 越小,OLED / 串口数据同步变化。
-
原理:光敏电阻阻值随光照变化,转换为电压信号被 ADC 采集。
2. 声音传感器(AO 接 ADC 通道,如 PA1)
-
现象 :
- 安静时,ADC 值 稳定在低范围(背景噪声小);
- 拍手 / 说话时,ADC 值 瞬间跳升(声音越强,跳升幅度越大),数据波动明显。
-
原理:咪头采集声波,转换为电压波动,ADC 捕捉瞬时变化。
3. 红外避障传感器(AO 接 ADC 通道,如 PA2)
-
现象 :
- 无遮挡时,ADC 值 接近最大值(红外反射强,输出电压高);
- 手靠近遮挡时,ADC 值 骤降(反射弱,电压低),响应迅速。
-
原理:红外发射 + 接收,距离 / 遮挡影响反射强度,转换为电压变化。
4. 电位器(中间引脚接 ADC 通道,如 PA3)
-
现象 :
- 顺时针旋转:ADC 值 从 0→4095 线性递增(或递减,取决于接线方向);
- 逆时针旋转:ADC 值 反向递减 / 递增,变化平滑无跳变。
-
原理:电位器分压,输出电压与旋转角度线性相关。
相关文章:

STM32标准库-ADC数模转换器
文章目录 一、ADC1.1简介1. 2逐次逼近型ADC1.3ADC框图1.4ADC基本结构1.4.1 信号 “上车点”:输入模块(GPIO、温度、V_REFINT)1.4.2 信号 “调度站”:多路开关1.4.3 信号 “加工厂”:ADC 转换器(规则组 注入…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
node.js的初步学习
那什么是node.js呢? 和JavaScript又是什么关系呢? node.js 提供了 JavaScript的运行环境。当JavaScript作为后端开发语言来说, 需要在node.js的环境上进行当JavaScript作为前端开发语言来说,需要在浏览器的环境上进行 Node.js 可…...

何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...

【若依】框架项目部署笔记
参考【SpringBoot】【Vue】项目部署_no main manifest attribute, in springboot-0.0.1-sn-CSDN博客 多一个redis安装 准备工作: 压缩包下载:http://download.redis.io/releases 1. 上传压缩包,并进入压缩包所在目录,解压到目标…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...

Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...

rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...

高分辨率图像合成归一化流扩展
大家读完觉得有帮助记得关注和点赞!!! 1 摘要 我们提出了STARFlow,一种基于归一化流的可扩展生成模型,它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流(TARFlow&am…...

负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...

leetcode73-矩阵置零
leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...

归并排序:分治思想的高效排序
目录 基本原理 流程图解 实现方法 递归实现 非递归实现 演示过程 时间复杂度 基本原理 归并排序(Merge Sort)是一种基于分治思想的排序算法,由约翰冯诺伊曼在1945年提出。其核心思想包括: 分割(Divide):将待排序数组递归地分成两个子…...

Xcode 16 集成 cocoapods 报错
基于 Xcode 16 新建工程项目,集成 cocoapods 执行 pod init 报错 ### Error RuntimeError - PBXGroup attempted to initialize an object with unknown ISA PBXFileSystemSynchronizedRootGroup from attributes: {"isa">"PBXFileSystemSynchro…...

Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...

[拓扑优化] 1.概述
常见的拓扑优化方法有:均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有:有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法
用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...

门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...