STM32 基础知识(探索者开发板)--135讲 ADC转换

ADC定义:

        ADC即模拟数字转换器,英文详称 Analog-to-digital converter,可以将外部的模拟信号转换

ADC数模转换中一些常用函数:

1. HAL_ADC_Init 函数
HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc); 初始化ADC
形参:ADC_HandleTypeDef 结构体类型指针变量        返回值:HAL_StatusTypeDef枚举类型
typedef struct
{
 ADC_TypeDef *Instance; /* ADC 寄存器基地址 */
 ADC_InitTypeDef Init; /* ADC 参数初始化结构体变量 */
 __IO uint32_t NbrOfCurrentConversionRank;/* 当前转换等级的 ADC 数 */
 DMA_HandleTypeDef *DMA_Handle; /* DMA 配置结构体 */
 HAL_LockTypeDef Lock; /* ADC 锁定对象 */
 __IO uint32_t State; /* ADC 工作状态 */
 __IO uint32_t ErrorCode; /* ADC 错误代码 */
}ADC_HandleTypeDef;
其中第二个成员变量Init需要重点配置
typedef struct {
uint32_t ClockPrescaler;             /* 设置预分频系数,即 PRESC[3:0]位,可选(2,4,6,8) */
uint32_t Resolution;                 /* 配置 ADC 的分辨率,可选(12位,10,8,6)分辨率高,精度高,时间长 */
uint32_t ScanConvMode;                 /* 扫描模式 可选(ADC_SCAN_DISABLE单通道,ADC_SCAN_ENABLE多)*/
uint32_t EOCSelection;                 /* 转换完成标志位() */
FunctionalState ContinuousConvMode; /* 开启连续转换模式否则就是单次转换模式 */
uint32_t NbrOfConversion;             /* 设置转换通道数目 */
FunctionalState DiscontinuousConvMode; /* 单次转换模式选择 */
uint32_t NbrOfDiscConversion;         /* 单次转换通道的数目 */
uint32_t ExternalTrigConv;             /* ADC 外部触发源选择 */
uint32_t ExternalTrigConvEdge;         /* ADC 外部触发极性*/
FunctionalState DMAContinuousRequests; /* DMA 转换请求模式*/
} ADC_InitTypeDef;
1) ClockPrescaler:ADC 预分频系数选择,可选的分频系数为 2、4、6、8。由于 ADC 最大时钟
不得超过 36Mhz,我们这里配置 4 分频,即 ADC 的时钟频率为:84 / 4 = 21Mhz。
2) Resolution:配置 ADC 的分辨率,可选的分辨率有 12 位、10 位、8 位和 6 位。分辨率越高,
转换数据精度越高,转换时间也越长;反之分辨率越低,转换数据精度越低,转换时间也越
短。
3) ScanConvMode:配置是否使用扫描。如果是单通道转换使用 ADC_SCAN_DISABLE,如果
是多通道转换使用 ADC_SCAN_ENABLE。
4) EOCSelection:可选参数为 ADC_EOC_SINGLE_CONV 和 ADC_EOC_SEQ_CONV,指定转
换结束时是否产生 EOS 中断或事件标志。
5) ContinuousConvMode:可选参数为 ENABLE 和 DISABLE,配置自动连续转换还是单次转换。
使用 ENABLE 配置为使能自动连续转换;使用 DISABLE 配置为单次转换,转换一次后停止
需要手动控制才重新启动转换。
6) NbrOfConversion:设置常规转换通道数目,范围是:1~16。
7) DiscontinuousConvMode:配置是否使用不连续的采样模式,比如要转换的通道有 1、2、5、
7、8、9,那么第一次触发会进行通道 1 与通道 2,下次触发就是转换通道 5 与通道 7,这
样不连续的转换,依次类推。此参数只有将 ScanConvMode 使能,还有 ContinuousConvMode
失能的情况下才有效,不可同时使能。
8) NbrOfDiscConversion:不连续采样通道数。
9) ExternalTrigConv:外部触发方式的选择,如果使用软件触发,那么外部触发会关闭。
10) ExternalTrigConvEdge:外部触发极性选择,如果使用外部触发,可以选择触发的极性,可
选有禁止触发检测、上升沿触发检测、下降沿触发检测以及上升沿和下降沿均可触发检测。
11) DMAContinuousRequests:指定 DMA 请求是否以一次性模式执行(当达到转换次数时,DMA
传输停止)或在连续模式下(DMA 传输无限制,无论转换的数量)。注:在连续模式下,DMA 必
须配置为循环模式。否则,当达到 DMA 缓冲区最大指针时将触发溢出。注意:当常规组和注
入组都没有转换时(禁用 ADC,或启用 ADC,没有连续模式或可以启动转换的外部触发器),
必须修改此参数。该参数可设置为“启用”或“禁用”。


2.HAL_ADCEx_Calibration_Start函数
HAL_StatusTypeDef HAL_ADCEx_Calibration_Start(ADC_HandleTypeDef *hadc);ADC自校准功能
形参:ADC_HandleTypeDef 结构体类型指针变量            返回值:HAL_StatusTypeDef枚举类型的值


3. HAL_ADC_ConfigChannel函数
HAL_StatusTypeDef HAL_ADC_ConfigChannel(ADC_HandleTypeDef *hadc, ADC_ChannelConfTypeDef *sConfig);ADC自校准功能
形参:参数1ADC_HandleTypeDef 结构体类型指针变量 参数2ADC_ChannelConfTypeDef 结构体类型指针变量
typedef struct {
 uint32_t Channel; /* ADC 转换通道(0~19)*/
 uint32_t Rank; /* ADC 转换顺序(1~16) */
 uint32_t SamplingTime; /* ADC 采样周期(480个ADC时钟周期) */
 uint32_t Offset; /* ADC 偏移量 */
} ADC_ChannelConfTypeDef;


4.HAL_ADC_Start 函数
HAL_StatusTypeDef HAL_ADC_Start(ADC_HandleTypeDef *hadc);ADC启动函数
形参:ADC_HandleTypeDef 结构体类型指针变量        返回值:HAL_StatusTypeDef枚举类型的值


5. HAL_ADC_PollForConversion函数                等待规则组转换完成函数
HAL_StatusTypeDef HAL_ADC_PollForConversion(ADC_HandleTypeDef *hadc,uint32_t Timeout);
形参:参数1ADC_HandleTypeDef 结构体类型指针变量 参数2等待转换的等待时间ms
返回值:HAL_StatusTypeDef 枚举类型的值。


6. HAL_ADC_GetValue 函数
uint32_t HAL_ADC_GetValue(ADC_HandleTypeDef *hadc);        获取ADC转换值
形参:ADC_HandleTypeDef 结构体类型指针变量    返回值:当前的转换值,uint32_t 类型数据


7.HAL_DMA_Start 函数                启动DMA传输(在任何能使用DMA传输的场景)
HAL_Status TypeDef HAL_DMA_Start(DMA_HandleTypeDef *hdma,
uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)
参数:(DMA_HandleTypeDef 结构体类型指针变量,DMA 传输的源地址,DMA 传输的目的地址,要传输的数据项数目)


8. HAL_ADC_Start_DMA 函数         只启动有ADC(DMA传输)方式
HAL_StatusTypeDef HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc,
uint32_t *pData, uint32_t Length);
形参:(ADC_HandleTypeDef 结构体类型指针变量, ADC 采样数据传输的目的地址,要传输的数据项数目)


9.HAL_DMA_Init 函数         初始化DMA
HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma);
参数:DMA_HandleTypeDef 结构体类型指针变量
typedef struct __DMA_HandleTypeDef
{
 void *Instance; /* 寄存器基地址 */
 DMA_InitTypeDef Init; /* DAM 通信参数 */
 HAL_LockTypeDef Lock; /* DMA 锁对象 */
 __IO HAL_DMA_StateTypeDef State; /* DMA 传输状态 */
 void *Parent; /* 父对象状态,HAL 库处理的中间变量 */
void (*XferCpltCallback)( struct __DMA_HandleTypeDef *hdma);/*DMA 传输完成回调*/
/* DMA 一半传输完成回调 */
void (* XferHalfCpltCallback)( struct __DMA_HandleTypeDef * hdma);
 /* DMA 传输完整的 Memory1 回调 */
void (* XferM1CpltCallback)( struct __DMA_HandleTypeDef * hdma);
/* DMA 传输半完全内存回调 */
void (* XferM1HalfCpltCallback)( struct __DMA_HandleTypeDef * hdma);
/*DMA 传输错误回调*/
void (* XferErrorCallback)( struct __DMA_HandleTypeDef * hdma);
/* DMA 传输中止回调 */
 void (* XferAbortCallback)( struct __DMA_HandleTypeDef * hdma);
 __IO uint32_t ErrorCode; /* DMA 存取错误代码 */
 uint32_t StreamBaseAddress; /* DMA 通道基地址 */
uint32_t StreamIndex; /* DMA 通道索引 */
}DMA_HandleTypeDef;
重点介绍第二个成员变量Init
typedef struct
{
 uint32_t Channel; /* 传输通道,例如:DMA_CHANEL_4 */ 
 uint32_t Direction; /* 传输方向,例如存储器到外设 DMA_MEMORY_TO_PERIPH */
 uint32_t PeriphInc; /* 外设(非)增量模式,非增量模式 DMA_PINC_DISABLE */ 
 uint32_t MemInc; /* 存储器(非)增量模式,增量模式 DMA_MINC_ENABLE */ 
 uint32_t PeriphDataAlignment; /* 外设数据大小:8/16/32 位 */
 uint32_t MemDataAlignment; /* 存储器数据大小:8/16/32 位 */
 uint32_t Mode; /* 模式:外设流控模式/循环模式/普通模式 */ 
 uint32_t Priority; /* DMA 优先级:低/中/高/非常高 */
 uint32_t FIFOMode; /* FIFO 模式开启或者禁止 */
 uint32_t FIFOThreshold; /* FIFO 阈值选择 */
 uint32_t MemBurst; /* 存储器突发模式:单次/4 个节拍/8 个节拍/16 个节拍 */ 
 uint32_t PeriphBurst; /* 外设突发模式:单次/4 个节拍/8 个节拍/16 个节拍 */ 
}DMA_InitTypeDef

单通道ADC采集配置步骤

a.开启ADCx和GPIO时钟

b.初始化ADCx,配置器工作参数和硬件Msp的IO

c.配置ADC通道并启动AD转换

d.读取ADC值

单/多通道ADC采集(DMA读取)配置

a.开启ADCx和GPIO时钟

b.初始化ADC,配置其工作参数和硬件Msp

c.配置ADC通道并启动AD转换

d.初始化DMA

e.使能DMA对应数据流中断,配置DMA中断优先级

f.编写中断服务函数

单通道ADC采集实验代码

//adc.c#include "./BSP/ADC/adc.h"
#include "./SYSTEM/delay/delay.h"ADC_HandleTypeDef g_adc_handle;   /* ADC句柄 *//*** @brief       ADC初始化函数*   @note      本函数支持ADC1/ADC2任意通道, 但是不支持ADC3*              我们使用12位精度, ADC采样时钟=21M, 转换时间为: 采样周期 + 12个ADC周期*              设置最大采样周期: 480, 则转换时间 = 492 个ADC周期 = 23.42us* @param       无* @retval      无*/
void adc_init(void)
{g_adc_handle.Instance = ADC_ADCX;g_adc_handle.Init.ClockPrescaler = ADC_CLOCKPRESCALER_PCLK_DIV4;        /* 4分频,ADCCLK = PCLK2/4 = 84/4 = 21Mhz */g_adc_handle.Init.Resolution = ADC_RESOLUTION_12B;                      /* 12位模式 */g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;                      /* 右对齐 */g_adc_handle.Init.ScanConvMode = DISABLE;                               /* 非扫描模式 */g_adc_handle.Init.ContinuousConvMode = DISABLE;                         /* 关闭连续转换 */g_adc_handle.Init.NbrOfConversion = 1;                                  /* 1个转换在规则序列中 也就是只转换规则序列1 */g_adc_handle.Init.DiscontinuousConvMode = DISABLE;                      /* 禁止不连续采样模式 */g_adc_handle.Init.NbrOfDiscConversion = 0;                              /* 不连续采样通道数为0 */g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;                /* 软件触发 */g_adc_handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* 使用软件触发 */g_adc_handle.Init.DMAContinuousRequests = DISABLE;                      /* 关闭DMA请求 */HAL_ADC_Init(&g_adc_handle);                                            /* 初始化 */
}/*** @brief       ADC底层驱动,引脚配置,时钟使能此函数会被HAL_ADC_Init()调用* @param       hadc:ADC句柄* @retval      无*/
void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
{if(hadc->Instance == ADC_ADCX){GPIO_InitTypeDef gpio_init_struct;ADC_ADCX_CHY_CLK_ENABLE();      /* 使能ADCx时钟 */ADC_ADCX_CHY_GPIO_CLK_ENABLE(); /* 开启GPIO时钟 *//* AD采集引脚模式设置,模拟输入 */gpio_init_struct.Pin = ADC_ADCX_CHY_GPIO_PIN;gpio_init_struct.Mode = GPIO_MODE_ANALOG;   //模拟输入模式gpio_init_struct.Pull = GPIO_NOPULL;        //该模式用来配置gpio的外部上下拉电阻HAL_GPIO_Init(ADC_ADCX_CHY_GPIO_PORT, &gpio_init_struct);}
}/*** @brief       设置ADC通道采样时间* @param       adcx : adc句柄指针,ADC_HandleTypeDef* @param       ch   : 通道号, ADC_CHANNEL_0~ADC_CHANNEL_17* @param       stime: 采样时间  0~7, 对应关系为:*   @arg       ADC_SAMPLETIME_3CYCLES,  3个ADC时钟周期        ADC_SAMPLETIME_15CYCLES, 15个ADC时钟周期*   @arg       ADC_SAMPLETIME_28CYCLES, 28个ADC时钟周期       ADC_SAMPLETIME_56CYCLES, 56个ADC时钟周期*   @arg       ADC_SAMPLETIME_84CYCLES, 84个ADC时钟周期       ADC_SAMPLETIME_112CYCLES,112个ADC时钟周期*   @arg       ADC_SAMPLETIME_144CYCLES,144个ADC时钟周期      ADC_SAMPLETIME_480CYCLES,480个ADC时钟周期* @param       rank: 多通道采集时需要设置的采集编号,假设你定义channel1的rank=1,channel2的rank=2,那么对应你在DMA缓存空间的变量数组AdcDMA[0] 就i是channel1的转换结果,AdcDMA[1]就是通道2的转换结果。 单通道DMA设置为 ADC_REGULAR_RANK_1*   @arg       编号1~16:ADC_REGULAR_RANK_1~ADC_REGULAR_RANK_16* @retval      无*/
void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime)
{/* 配置对应ADC通道 */ADC_ChannelConfTypeDef adc_channel;adc_channel.Channel = ch;               /* 设置ADCX对通道ch */adc_channel.Rank = rank;                /* 设置采样序列 */adc_channel.SamplingTime = stime;       /* 设置采样时间 */HAL_ADC_ConfigChannel( adc_handle, &adc_channel);   
}/*** @brief       获得ADC转换后的结果* @param       ch: 通道值 0~17,取值范围为:ADC_CHANNEL_0~ADC_CHANNEL_17* @retval      无*/
uint32_t adc_get_result(uint32_t ch)
{adc_channel_set(&g_adc_handle, ch, 1, ADC_SAMPLETIME_480CYCLES);    /* 设置通道,序列和采样时间 */HAL_ADC_Start(&g_adc_handle);                                       /* 开启ADC */HAL_ADC_PollForConversion(&g_adc_handle, 10);                       /* 轮询转换 */return (uint16_t)HAL_ADC_GetValue(&g_adc_handle);                   /* 返回最近一次ADC1规则组的转换结果 */
}/*** @brief       获取通道ch的转换值,取times次, 然后平均* @param       ch      : 通道号, 0~17* @param       times   : 获取次数* @retval      通道ch的times次转换结果平均值*/
uint32_t adc_get_result_average(uint32_t ch, uint8_t times)
{uint32_t temp_val = 0;uint8_t t;for (t = 0; t < times; t++)     /* 获取times次数据 */{temp_val += adc_get_result(ch);delay_ms(5);}return temp_val / times;        /* 返回平均值 */
}//adc.h#ifndef __ADC_H
#define __ADC_H#include "./SYSTEM/sys/sys.h"/******************************************************************************************/
/* ADC及引脚 定义 */#define ADC_ADCX_CHY_GPIO_PORT              GPIOA
#define ADC_ADCX_CHY_GPIO_PIN               GPIO_PIN_5
#define ADC_ADCX_CHY_GPIO_CLK_ENABLE()      do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)         /* PA口时钟使能 */#define ADC_ADCX                            ADC1 
#define ADC_ADCX_CHY                        ADC_CHANNEL_5                                       /* 通道Y,  0 <= Y <= 17 */ 
#define ADC_ADCX_CHY_CLK_ENABLE()           do{ __HAL_RCC_ADC1_CLK_ENABLE(); }while(0)          /* ADC1 时钟使能 *//******************************************************************************************/void adc_init(void);                                            /* ADC初始化 */
void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime); /* ADC通道设置 */
uint32_t adc_get_result(uint32_t ch);                           /* 获得某个通道值 */
uint32_t adc_get_result_average(uint32_t ch, uint8_t times);    /* 得到某个通道给定次数采样的平均值 */#endif

main.c

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/LCD/lcd.h"
#include "./BSP/ADC/adc.h"int main(void)
{uint16_t adcx;float temp;HAL_Init();                             /* 初始化HAL库 */sys_stm32_clock_init(336, 8, 2, 7);     /* 设置时钟,168Mhz */delay_init(168);                        /* 延时初始化 */usart_init(115200);                     /* 串口初始化为115200 */led_init();                             /* 初始化LED */lcd_init();                             /* 初始化LCD */adc_init();                             /* 初始化ADC */lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);lcd_show_string(30, 70, 200, 16, 16, "ADC TEST", RED);lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "ADC1_CH5_VAL:", BLUE);lcd_show_string(30, 130, 200, 16, 16, "ADC1_CH5_VOL:0.000V", BLUE); /* 先在固定位置显示小数点 */while (1){adcx = adc_get_result_average(ADC_ADCX_CHY, 10);    /* 获取通道5的转换值,10次取平均 */lcd_show_xnum(134, 110, adcx, 5, 16, 0, BLUE);      /* 显示ADC采样后的原始值 */temp = (float)adcx * (3.3 / 4096);                  /* 获取计算后的带小数的实际电压值,比如3.1111 */adcx = temp;                                        /* 赋值整数部分给adcx变量,因为adcx为u16整形 */lcd_show_xnum(134, 130, adcx, 1, 16, 0, BLUE);      /* 显示电压值的整数部分,3.1111的话,这里就是显示3 */temp -= adcx;                                       /* 把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111 */temp *= 1000;                                       /* 小数部分乘以1000,例如:0.1111就转换为111.1,相当于保留三位小数。 */lcd_show_xnum(150, 130, temp, 3, 16, 0X80, BLUE);   /* 显示小数部分(前面转换为了整形显示),这里显示的就是111. */LED0_TOGGLE();delay_ms(100);}
}

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

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

相关文章

后端主流框架-SpringMvc-day2

Java中的文件下载 2 文件下载 文件下载&#xff1a;就是将服务器&#xff08;表现在浏览器中&#xff09;中的资源下载&#xff08;复制&#xff09;到本地磁盘&#xff1b; 2.1 前台代码 前台使用超链接&#xff0c;超链接转到后台控制器&#xff0c;在控制器通过流的方式…

AI:111-基于深度学习的工业设备状态监测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

技术与艺术的完美结合,AI艺术字生成平台一览

在创作的世界里&#xff0c;文字不仅是沟通的桥梁&#xff0c;更是灵魂的画笔。有时&#xff0c;我们的海报需要一丝文案的点缀&#xff0c;一些充满艺术感的文字&#xff0c;为作品注入更多的情感与深度。除了手写的文字&#xff0c;AI艺术字为我们提供了新的可能。AI生成未来…

CF1909_C. Heavy Intervals题解

CF1909_C. Heavy Intervals题解 题目传送门&#xff08;Problem - C - CodeforcesCodeforces. Programming competitions and contests, programming communityhttps://codeforces.com/contest/1909/problem/C&#xff09;。 题目翻译如下&#xff1a;&#xff08;图片来源&a…

操作系统期末复习!

引论及进程管理 1.操作系统的主要功能有( )。 A.进程管理、存储器管理、设备管理、处理机管理 B.虚拟存储管理、处理机管理、进程管理、文件管理 C.处理机管理、存储器管理、设备管理、文件管理 D.进程管理、中断管理、设备管理、文件管理 2.操作系统是对( )进行管…

助力工业生产“智造”,基于YOLOv8全系列模型【n/s/m/l/x】开发构建纺织生产场景下布匹瑕疵检测识别系统

纯粹的工业制造没有办法有长久的发展过程&#xff0c;转制造为全流程全场景的生产智造才是未来最具竞争力的生产场景&#xff0c;在前面的开发实践中我们已经涉足工业生产场景下进行了很多实地的项目开发&#xff0c;如&#xff1a;PCB电路板缺陷检测、焊接缺陷检测、螺母螺钉缺…

系列十、Spring Cloud Gateway

一、Spring Cloud Gateway 1.1、概述 Spring Cloud全家桶中有个很重要的组件就是网关&#xff0c;在1.x版本中采用的是Zuul网关&#xff0c;但是在2.x版本中&#xff0c;由于Zuul的升级一直跳票&#xff0c;Spring Cloud最后自己研发了一个网关替代Zuul&#xff0c;即&#xf…

ASP.NET Core基础之图片文件(一)-WebApi图片文件上传到文件夹

阅读本文你的收获&#xff1a; 了解WebApi项目保存上传图片的三种方式学习在WebApi项目中如何上传图片到指定文件夹中 在ASP.NET Core基础之图片文件(一)-WebApi访问静态图片文章中&#xff0c;学习了如何获取WebApi中的静态图片&#xff0c;本文继续分享如何上传图片。 那么…

详谈电商网站建设的四大流程!

在21世纪的互联网时代&#xff0c;电商网站的建设是每个企业发展不可缺少的一次机遇。企业商城网站建设成功也许会获得更大的了利润&#xff1b;如果网站建设不成功&#xff0c;那么也会带来一定的损失。所以建设电商网站不是那么一件简单的事情。那么电商网站制作流程是怎样的…

C++_find 统计一个单词 在一段文中出现的次数

注解: 使用y.find(x, n)从位置n开始在字符串y中查找子串x首次出现的位置。如果找到了子串x&#xff0c;则find()函数会返回该子串在y中的起始索引&#xff08;位置&#xff09;&#xff0c;否则返回-1&#xff08;或npos&#xff09;表示未找到。当find()函数返回非-1值时&…

我开发了一个聚合网盘资源搜索引擎-支持阿里云盘与夸克网盘资源

还在为找不到电子书资源而发愁&#xff1f;还在愁没有高清影视剧观看&#xff1f; 来试试我开发的云盘资源搜索引擎吧&#xff01; 公众号回复关键词: 搜索 ! 就可以获取到网站网址。 这里还有资源分享微信群&#xff0c;不定期分享资源。 关于界面 怎么使用这个引擎&#x…

ubuntu远程桌面连接之novnc

一、前言 该操作是为了实现vnc桌面连接为url连接方式&#xff0c;且在浏览器中可以对ubuntu进行操作。在使用novnc进行操作前&#xff0c;需要先安装vnc才可。ubuntu下如何安装vnc&#xff0c;可看博主前面写的一篇文&#xff0c;ubuntu远程桌面连接之vnc-CSDN博客&#xff0c;…

[雷池WAF]长亭雷池WAF配置基于健康监测的负载均衡,实现故障自动切换上游服务器

为了进一步加强内网安全&#xff0c;在原有硬WAF的基础上&#xff0c;又在内网使用的社区版的雷池WAF&#xff0c;作为应用上层的软WAF。从而实现多WAF防护的架构。 经过进一步了解&#xff0c;发现雷池WAF的上游转发代理是基于Tengine的&#xff0c;所以萌生出了一个想法&…

低代码平台在自动驾驶系统开发中的应用

自动驾驶技术的发展正在为交通领域带来革命性的变化。其中关键的一环是自动驾驶系统的开发&#xff0c;该过程通常需要大量的编程工作和复杂的算法。然而&#xff0c;随着低代码技术的崛起&#xff0c;开发者能够大幅简化自动驾驶系统的开发过程&#xff0c;为了降低开发难度和…

算法与数据结构之链表<一>(Java)

目录 1、链表的定义 2、链表的特点 3、为何要使用链表 4、数组与链表的区别 5、链表的增删查 5.1、在头部插入链表 5.2、在中间插入链表 5.3、删除头节点 5.4、删除中间节点 5.5、查询某个值 6、链表的应用 6.1 如何设计一个LRU缓存算法&#xff1f; 6.2 约瑟夫问题 1、链表的定…

计算机毕业设计-----SSM自习室图书馆座位预约管理系统

项目介绍 一款由jspssmmysql实现的图书馆预约占座管理系统&#xff0c;前端采用的是当下最流行的easyui框架&#xff0c;后台用的ssm&#xff08;spring、springMVC、mybaits&#xff09;框架.添加学生和教师时会自动在用户表中注册&#xff0c;定时任务会定时生成座位信息&am…

马蹄集oj赛(双周赛第十八次)

目录 幸运的3 打靶 照亮街道 九次九日九重色 寻找串 竹鼠的白色季节 捉迷藏 好的三连 三角数 买马 可怜的小码哥 花园浇水 高次方程 幸运的3 难度:黄金时间限制: 1秒四占用内存:128M 你有 n 个数&#xff0c;可以将它们两两匹配(即将两数首尾相连)&#xff0c;每个…

YOLOv8融合改进 更换检测头为Detect_DyHead同时添加C2f-EMSC和C2f-EMSCP模块

一、Detect_DyHead检测头和C2f-EMSC&#xff0c;C2f-EMSCP模块 详细介绍和代码在往期的博客里&#xff1a; Detect_DyHead&#xff1a; &#xff08;YOLOv8改进检测头Detect为Detect_Dyhead-CSDN博客&#xff09; C2f-EMSC和C2f-EMSCP&#xff1a; &#xff08;YOLOv8改进…

leetcode2487.从链表中移除节点

文章目录 题目思路复杂度Code 题目 给你一个链表的头节点 head 。 移除每个右侧有一个更大数值的节点。 返回修改后链表的头节点 head 。 示例 1&#xff1a; 输入&#xff1a;head [5,2,13,3,8] 输出&#xff1a;[13,8] 解释&#xff1a;需要移除的节点是 5 &#xff0…

云盘扩容、云盘缩容

天翼云文档地址&#xff1a;https://www.ctyun.cn/document/10027696/10169558 1、输入 growpart命令&#xff0c;检查此云主机是否已安装growpart扩容工具。若出现图中回显信息&#xff0c;则说明已经安装&#xff0c;无需手动安装。 注意 若没有图示信息&#xff0c;请执行…