STM32——ADC知识总结及多通道采样实验

news/2024/2/24 6:53:35/文章来源:https://blog.csdn.net/m0_73502349/article/details/135625939

1.ADC概念

ADC,全称:Analog-to-Digital Converter,指模拟/数字转换器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 STM32各系列ADC的主要特性

在这里插入图片描述

3.F4框图

在这里插入图片描述

4.转换序列与转换时间

A/D转换被组织为两组:规则组(常规转换组)和注入组(注入转换组)
规则组最多可以有16个转换,注入组最多有4个转换

4.1规则组和注入组执行优先级对比

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2转换时间

在这里插入图片描述
在这里插入图片描述

5.触发源blog.csdnimg.cn/direct/f7ca0dd32f5443aab9798321c743be8e.png)

6.中断

在这里插入图片描述

7.单次转换模式和连续转换模式与扫描模式

单次转换模式和连续转换模式与
扫描模式
在这里插入图片描述
在这里插入图片描述

8 结构体

typedef struct
{
ADC_TypeDef Instance; / ADC 寄存器基地址 /
ADC_InitTypeDef Init; /
ADC 参数初始化结构体变量 */
DMA_HandleTypeDef DMA_Handle; / DMA 配置结构体 */
……
} ADC_HandleTypeDef;

typedef struct
{
uint32_t DataAlign; /* 设置数据的对齐方式 /
uint32_t ScanConvMode; /
扫描模式 /
FunctionalState ContinuousConvMode; /
开启单次转换模式或者连续转换模式 / uint32_t NbrOfConversion; / 设置转换通道数目 /
FunctionalState DiscontinuousConvMode; /
是否使用规则通道组间断模式 /
uint32_t NbrOfDiscConversion; /
配置间断模式的规则通道个数 /
uint32_t ExternalTrigConv; /
ADC 外部触发源选择 */
} ADC_InitTypeDef;

typedef struct
{
uint32_t Channel; /* ADC 转换通道*/
uint32_t Rank; /* ADC 转换顺序 /
uint32_t SamplingTime; /
ADC 采样周期 */
} ADC_ChannelConfTypeDef;

9. 多通道采集实验配置步骤在这里插入图片描述

在这里插入图片描述

10 实战

10.1 adc.h

#ifndef __ADC_H
#define __ADC_H#include "./SYSTEM/sys/sys.h"//1.开启 ADCx 和通道输出的 GPIO 时钟,配置该 IO 口的复用功能输出
//1.1 ADC及引脚定义  ADC复用PA5口
#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_ADCX_GPIO_CLK_ENABLE()      do{ __HAL_RCC_ADC1_CLK_ENABLE(); }while(0)    // PA口时钟使能#define ADC_CH_NUM              6                                                          //转换的通道数目 ///* ADC DMA采集 DMA数据流相关 定义
// * 注意: 这里我们的通道还是使用上面的定义.
#define ADC_ADCX_DMASx             DMA2_Stream4
#define ADC_ADCX_DMASx_Chanel      DMA_CHANNEL_0                                          //ADC1_DMA请求源
#define ADC_ADCX_DMASx_IRQn        DMA2_Stream4_IRQn                                      //DMA2_Stream4_IRQn
#define ADC_ADCX_DMASx_IRQHandler  DMA2_Stream4_IRQHandler                                #define ADC_ADCX_DMASx_IS_TC()     ( DMA2->HISR & (1 << 5) )                             //判断 DMA2_Stream4 传输完成标志, 这是一个假函数形式, * 不能当函数使用, 只能用在if等语句里面
#define ADC_ADCX_DMASx_CLR_TC()     do{ DMA2->HIFCR |= 1 << 5; }while(0)                 //清除 DMA2_Stream4 传输完成标志void adc_channel_set(ADC_HandleTypeDef *adc_handle, uint32_t ch, uint32_t rank, uint32_t stime);    /* ADC通道设置 */void adc_dma_enable( uint16_t ndtr);        /* 使能一次ADC DMA采集传输 */void adc_nch_dma_init(uint32_t tmr);        /* ADC多通道 DMA采集初始化 */
void adc_nch_dma_gpio_init(void);           /* ADC多通道 GPIO初始化 */
void adc_nch_dma_enable(uint16_t ndtr);     /* 使能一次ADC DMA多通道采集传输 */#endif 

10.2 adc.c


#include "./SYSTEM/delay/delay.h"
#include "./BSP/ADC/adc.h"//使用 ADC1 采集(DMA 读取)通道 0\1\2\3\4\5 的电压,在 LCD 模块上面显示对应的 ADC
//转换值以及换算成电压后的电压值。可以使用杜邦线连接 PA0\PA1\PA2\PA3\PA4\PA5 到你想测
//量的电压源(0~3.3V),然后通过 TFTLCD 显示的电压值。
//多通道 ADC 采集(DMA 读取)配置步骤:
//1.开启 ADCx 和通道输出的 GPIO 时钟,配置该 IO 口的复用功能输出//2.初始化 ADCx,配置其工作参数
//2.1  HAL_ADC_Init 函数,设置 ADCx 时钟分频系数、分辨率、模式、扫描方式、对齐方式等信息。
//2.2  会调用:HAL_ADC_MspInit 回调函数来,对 ADC 底层以及其输入通道 IO
//的初始化,包括:ADC 及 GPIO 时钟使能、GPIO 模式设置等//3.配置 ADC 通道并启动 AD 转换器
//3.1在 HAL 库中,通过 HAL_ADC_ConfigChannel 函数来设置配置 ADC 的通道,根据需求设
//置通道、序列、采样时间和校准配置单端输入模式或差分输入模式等。这里配置多通道输出,
//需要多次调用该函数
//3.2 配置好 ADC 通道之后,通过 HAL_ADC_Start 函数启动 AD 转换器//4 初始化 DMA
//4.1HAL_DMA_Init 函数初始化 DMA,包括配置通道,外设地址,存储器地址,传输数
//据量等。
//4.2HAL 库为了处理各类外设的 DMA 请求,在调用相关函数之前,需要调用一个宏定义标识
//符,来连接 DMA 和外设句柄。这个宏定义为__HAL_LINKDMA。//5 使能 DMA 对应数据流中断,配置 DMA 中断优先级,使能 ADC,使能并启动 DMA
//5.1 HAL_ADC_Start 函数开启 ADC 转换
//5.2 HAL_DMA_Start_IT 函数启动 DMA 读取,使能 DMA 中断。
//5.3 HAL_NVIC_EnableIRQ 函数使能 DMA 数据流中断。
//5.4 HAL_NVIC_SetPriority 函数设置中断优先级//6 编写中断服务函数
//通用DMA中断处理函数HAL_DMA_IRQHandler,
//在该函数内部ADC_HandleTypeDef g_adc_nch_dma_handle;     /* 与DMA关联的ADC句柄 */
DMA_HandleTypeDef g_dma_nch_adc_handle;     /* 与ADC关联的DMA句柄 */
uint8_t g_adc_dma_sta = 0;              /* DMA传输状态标志, 0,未完成; 1, 已完成 */// * @brief       ADC初始化函数
// *   @note      本函数支持ADC1/ADC2任意通道, 但是不支持ADC3
// *              我们使用12位精度, ADC采样时钟=21M, 转换时间为: 采样周期 + 12个ADC周期
// *              设置最大采样周期: 480, 则转换时间 = 492 个ADC周期 = 23.42us
// * @param       无
// * @retval      无
// *///2.初始化 ADCx,配置其工作参数
//2.1  HAL_ADC_Init 函数,设置 ADCx 时钟分频系数、分辨率、模式、扫描方式、对齐方式等信息。
//2.2  会调用:HAL_ADC_MspInit 回调函数来,对 ADC 底层以及其输入通道 IO
//的初始化,包括:ADC 及 GPIO 时钟使能、GPIO 模式设置等//4 初始化 DMA
//4.1HAL_DMA_Init 函数初始化 DMA,包括配置通道,外设地址,存储器地址,传输数
//据量等。
//4.2HAL 库为了处理各类外设的 DMA 请求,在调用相关函数之前,需要调用一个宏定义标识
//符,来连接 DMA 和外设句柄。这个宏定义为__HAL_LINKDMA。
void adc_nch_dma_init(uint32_t mar)
{ADC_ADCX_CHY_CLK_ENABLE();                     //使能ADCx时钟//疑问1if ((uint32_t)ADC_ADCX_DMASx > (uint32_t)DMA2)      /* 大于DMA1_Stream7, 则为DMA2 */{__HAL_RCC_DMA2_CLK_ENABLE();                    /* DMA2时钟使能 */}else{__HAL_RCC_DMA1_CLK_ENABLE();                    /* DMA1时钟使能 */}// HAL_DMA_Init 函数初始化 DMA,包括配置通道,外设地址,存储器地址,传输数据量等。g_dma_nch_adc_handle.Instance = ADC_ADCX_DMASx;                             /* 设置DMA数据流 寄存器基地址 */g_dma_nch_adc_handle.Init.Channel = DMA_CHANNEL_0;                          /* 设置DMA通道 */g_dma_nch_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;                 /* DIR = 1 , 外设到存储器模式 */g_dma_nch_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE;                     /* 外设非增量模式 */g_dma_nch_adc_handle.Init.MemInc =  DMA_MINC_ENABLE;                         /* 存储器增量模式 */g_dma_nch_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;    /* 外设数据长度:16位 */g_dma_nch_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;       /* 存储器数据长度:16位 */g_dma_nch_adc_handle.Init.Mode = DMA_NORMAL;                                /* 外设流控模式 */g_dma_nch_adc_handle.Init.Priority = DMA_PRIORITY_MEDIUM;                   /* 中等优先级 */HAL_DMA_Init(&g_dma_nch_adc_handle);                                        /* 初始化DMA *///5.1 HAL_ADC_Start 函数开启 ADC 转换HAL_DMA_Start(&g_dma_nch_adc_handle, (uint32_t)&ADC_ADCX->DR, mar, 0);      /* 配置DMA传输参数 *///HAL_ADC_Init 函数,设置 ADCx 时钟分频系数、分辨率、模式、扫描方式、对齐方式等信息。g_adc_nch_dma_handle.DMA_Handle = &g_dma_nch_adc_handle;    /* 设置ADC对应的DMA */g_adc_nch_dma_handle.Instance = ADC_ADCX;g_adc_nch_dma_handle.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;            /* 4分频,ADCCLK = PCLK2/4 = 84/4 = 21Mhz */g_adc_nch_dma_handle.Init.Resolution = ADC_RESOLUTION_12B;                      /* 12位模式 */g_adc_nch_dma_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;                      /* 右对齐 */g_adc_nch_dma_handle.Init.ScanConvMode = ENABLE;                                /* 扫描模式 */g_adc_nch_dma_handle.Init.ContinuousConvMode = ENABLE;                          /* 连续转换模式,转换完成之后接着继续转换 */g_adc_nch_dma_handle.Init.DiscontinuousConvMode = DISABLE;                      /* 禁止不连续采样模式 */g_adc_nch_dma_handle.Init.NbrOfConversion = ADC_CH_NUM;                         /* 使用转换通道数,需根据实际转换通道去设置 */g_adc_nch_dma_handle.Init.NbrOfDiscConversion = 0;                              /* 不连续采样通道数为0 */g_adc_nch_dma_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;                /* 软件触发 */g_adc_nch_dma_handle.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; /* 使用软件触发, 此位忽略 */g_adc_nch_dma_handle.Init.DMAContinuousRequests = ENABLE;                       /* 开启DMA连续转换 */HAL_ADC_Init(&g_adc_nch_dma_handle);                                            /* 初始化ADC */adc_nch_dma_gpio_init();    /* GPIO 初始化 */adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_0,1, ADC_SAMPLETIME_480CYCLES);// 设置采样规则序列1~6 adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_1,2, ADC_SAMPLETIME_480CYCLES);adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_2,3, ADC_SAMPLETIME_480CYCLES);adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_3,4, ADC_SAMPLETIME_480CYCLES);adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_4,5, ADC_SAMPLETIME_480CYCLES);adc_channel_set(&g_adc_nch_dma_handle, ADC_CHANNEL_5,6, ADC_SAMPLETIME_480CYCLES);//5 使能 DMA 对应数据流中断,配置 DMA 中断优先级,使能 ADC,使能并启动 DMA//5.2 HAL_DMA_Start_IT 函数启动 DMA 读取,使能 DMA 中断。//5.3 HAL_NVIC_EnableIRQ 函数使能 DMA 数据流中断。//5.4 HAL_NVIC_SetPriority 函数设置中断优先级HAL_NVIC_SetPriority(ADC_ADCX_DMASx_IRQn, 3, 3);    /* 设置DMA中断优先级为3,子优先级为3 */HAL_NVIC_EnableIRQ(ADC_ADCX_DMASx_IRQn);            /* 使能DMA中断 */    HAL_ADC_Start_DMA(&g_adc_nch_dma_handle, &mar, sizeof(uint16_t));   /* 开始DMA数据传输 */__HAL_DMA_ENABLE_IT(&g_dma_nch_adc_handle, DMA_IT_TC);              /* TCIE=1, 使能传输完成中断 */}/*** @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      无*///3.配置 ADC 通道并启动 AD 转换器
//3.1在 HAL 库中,通过 HAL_ADC_ConfigChannel 函数来设置配置 ADC 的通道,根据需求设
//置通道、序列、采样时间和校准配置单端输入模式或差分输入模式等。这里配置多通道输出,
//需要多次调用该函数
//3.2 配置好 ADC 通道之后,通过 HAL_ADC_Start 函数启动 AD 转换器
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); /* 初始化ADC通道 */
}
/*** @brief       多通道ADC的gpio初始化函数* @param       无* @note        此函数会被adc_nch_dma_init()调用* @note        PA0-ADC_CHANNEL_0、PA1-ADC_CHANNEL_1、PA2-ADC_CHANNEL_2PA3-ADC_CHANNEL_3、PA4-ADC_CHANNEL_4、PA5-ADC_CHANNEL_5
* @retval       无*/
//2.2对 ADC 底层以及其输入通道 IO的初始化,包括:ADC 及 GPIO 时钟使能、GPIO 模式设置等
void adc_nch_dma_gpio_init()
{GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOA_CLK_ENABLE();                    /* 开启GPIOA引脚时钟 *//* ADC采集引脚模式设置,模拟输入 */gpio_init_struct.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5; /* GPIOA0~5 */;gpio_init_struct.Mode = GPIO_MODE_ANALOG;gpio_init_struct.Pull = GPIO_NOPULL;HAL_GPIO_Init(GPIOA, &gpio_init_struct);}
/*** @brief       使能一次ADC DMA传输* @param       ndtr: DMA传输的次数* @retval      无*/
void adc_nch_dma_enable(uint16_t ndtr)
{__HAL_ADC_DISABLE(&g_adc_nch_dma_handle);       /* 先关闭ADC */__HAL_DMA_DISABLE(&g_dma_nch_adc_handle);       /* 关闭DMA传输 */g_dma_nch_adc_handle.Instance->NDTR = ndtr;     /* 重设DMA传输数据量 */__HAL_DMA_ENABLE(&g_dma_nch_adc_handle);        /* 开启DMA传输 */__HAL_ADC_ENABLE(&g_adc_nch_dma_handle);        /* 重新启动ADC */ADC_ADCX->CR2 |= 1 << 30;                       /* 启动规则转换通道 */
}
/*** @brief       ADC DMA采集中断服务函数* @param       无* @retval      无*/void ADC_ADCX_DMASx_IRQHandler(void)
{if (ADC_ADCX_DMASx_IS_TC())    //是否传输完成{g_adc_dma_sta = 1;          /* 标记DMA传输完成 */ADC_ADCX_DMASx_CLR_TC();    /* 清除DMA2 数据流4 传输完成中断 */}
}

10.3 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"
#include "./BSP/DMA/dma.h"#define ADC_DMA_BUF_SIZE        50 * 6      /* ADC DMA采集 BUF大小, 应等于ADC通道数的整数倍 */
uint16_t g_adc_dma_buf[ADC_DMA_BUF_SIZE];   /* ADC DMA BUF */extern uint8_t g_adc_dma_sta;               /* DMA传输状态标志, 0, 未完成; 1, 已完成 */int main(void)
{uint16_t i, j;uint16_t adcx;uint32_t sum;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_nch_dma_init((uint32_t)&g_adc_dma_buf);lcd_show_string(30,  50, 200, 16, 16, "STM32", RED);lcd_show_string(30,  70, 200, 16, 16, "ADC 6CH DMA TEST", RED);lcd_show_string(30,  90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 12, 12, "ADC1_CH0_VAL:", BLUE);lcd_show_string(30, 122, 200, 12, 12, "ADC1_CH0_VOL:0.000V", BLUE); /* 先在固定位置显示小数点 */lcd_show_string(30, 140, 200, 12, 12, "ADC1_CH1_VAL:", BLUE);lcd_show_string(30, 152, 200, 12, 12, "ADC1_CH1_VOL:0.000V", BLUE); /* 先在固定位置显示小数点 */lcd_show_string(30, 170, 200, 12, 12, "ADC1_CH2_VAL:", BLUE);lcd_show_string(30, 182, 200, 12, 12, "ADC1_CH2_VOL:0.000V", BLUE); /* 先在固定位置显示小数点 */lcd_show_string(30, 200, 200, 12, 12, "ADC1_CH3_VAL:", BLUE);lcd_show_string(30, 212, 200, 12, 12, "ADC1_CH3_VOL:0.000V", BLUE); /* 先在固定位置显示小数点 */lcd_show_string(30, 230, 200, 12, 12, "ADC1_CH4_VAL:", BLUE);lcd_show_string(30, 242, 200, 12, 12, "ADC1_CH4_VOL:0.000V", BLUE); /* 先在固定位置显示小数点 */lcd_show_string(30, 260, 200, 12, 12, "ADC1_CH5_VAL:", BLUE);lcd_show_string(30, 272, 200, 12, 12, "ADC1_CH5_VOL:0.000V", BLUE); /* 先在固定位置显示小数点 */adc_nch_dma_enable(ADC_DMA_BUF_SIZE);   /* 启动ADC DMA多通道采集 */while (1){if (g_adc_dma_sta == 1){/* 循环显示通道0~通道5的结果 */for(j = 0; j < 6; j++)  /* 遍历6个通道 */{sum = 0; /* 清零 */for (i = 0; i < ADC_DMA_BUF_SIZE / 6; i++)  /* 每个通道采集了10次数据,进行10次累加 */{sum += g_adc_dma_buf[(6 * i) + j];  /* 相同通道的转换数据累加 */}adcx = sum / (ADC_DMA_BUF_SIZE / 6);    /* 取平均值 *//* 显示结果 */lcd_show_xnum(108, 110 + (j * 30), adcx, 4, 12, 0, BLUE);   /* 显示ADC采样后的原始值 */temp = (float)adcx * (3.3 / 4096);      /* 获取计算后的带小数的实际电压值,比如3.1111 */adcx = temp;    /* 赋值整数部分给adcx变量,因为adcx为u16整形 */lcd_show_xnum(108, 122 + (j * 30), adcx, 1, 12, 0, BLUE);   /* 显示电压值的整数部分,3.1111的话,这里就是显示3 */temp -= adcx;   /* 把已经显示的整数部分去掉,留下小数部分,比如3.1111-3=0.1111 */temp *= 1000;   /* 小数部分乘以1000,例如:0.1111就转换为111.1,相当于保留三位小数。 */lcd_show_xnum(120, 122 + (j * 30), temp, 3, 12, 0X80, BLUE);/* 显示小数部分(前面转换为了整形显示),这里显示的就是111. */}g_adc_dma_sta = 0;  /* 清除DMA采集完成状态标志 */adc_nch_dma_enable(ADC_DMA_BUF_SIZE);   /* 启动下一次ADC DMA多通道采集 */}LED0_TOGGLE();delay_ms(100);}
}

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

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

相关文章

【征服redis1】基础数据类型详解和应用案例

博客计划 &#xff0c;我们从redis开始&#xff0c;主要是因为这一块内容的重要性不亚于数据库&#xff0c;但是很多人往往对redis的问题感到陌生&#xff0c;所以我们先来研究一下。 本篇&#xff0c;我们先看一下redis的基础数据类型详解和应用案例。 1.redis概述 以mysql为…

使用composer生成的DMG和PKG格式软件包有何区别

在使用Composer从包源构建软件包时候&#xff0c;有两种不同类型的包&#xff1a;PKG和DMG。你知道两者之间的区别吗? 以及如何选取吗&#xff1f; 每种格式都有各自的优势具体取决于软件包的预期用途以及用于部署软件包的工具。下面我们来了解一下PKG和DMG格式的区别和用途。…

科研绘图(八)线性热图

线性热图&#xff08;Linear Heat Map&#xff09;是一种数据可视化技术&#xff0c;用于展示数值在一维线性空间上的分布情况。它通常用于展示沿着一条线&#xff08;例如时间线或任何一维序列&#xff09;的数据密度或强度变化。线性热图与传统的二维热图不同&#xff0c;后者…

InternLM第5次课笔记

LMDeploy 大模型量化部署实践 1 大模型部署背景 2 LMDeploy简介 3 动手实践环节 https://github.com/InternLM/tutorial/blob/main/lmdeploy/lmdeploy.md 3

Spring Security-查询数据库认证

查询数据库认证权限(未自定义页面) 整合mybatis-plus 完成数据库操作 1.引入相关依赖 再父工程中 增加 mybatis-plus lombok mysql 相关依赖及版本号 <dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</grou…

AIGC ChatGPT 4 Prompt 万能提示词公式

最近大家都在使用ChatGPT来帮助自己完成相应的工作。很多时候大家提出的问题得不到很清晰,很明确的答案。 我们应该怎么样来和ChatGPT进行有效的沟通呢? 例如我们先来问一问ChatGPT: 要获得最准确的回复,请确保遵循以下建议: 明确性:请尽量明确描述您的问题。确保提供足…

AI大模型预先学习笔记一:transformer和fine tune技术介绍

一、商业观点&#xff1a;企业借助大模型获得业务增长可能 二、底层原理&#xff1a;transformer 1&#xff09;备注 ①下面每个步骤都是自回归的过程&#xff08;aotu-regressive&#xff09;&#xff1a;已输出内容的每个字作为输入&#xff0c;一起生成下一个字 ②合起来就…

Android中的SPI实现

Android中的SPI实现 SPI是JVM世界中的标准API&#xff0c;但在Android应用程序中并不常用。然而&#xff0c;它可以非常有用地实现插件架构。让我们探讨一下如何在Android中利用SPI。 问题 在Android中&#xff0c;不同的提供者为推送功能提供服务&#xff0c;而在大型项目中…

使用micro-app将现有项目改造成微前端,对现有项目实现增量升级

使用micro-app将现有项目改造成微前端&#xff0c;对现有项目实现增量升级 基座应用 1、安装依赖 npm i micro-zoe/micro-app --save2、在入口引入 //main.js import microApp from micro-zoe/micro-appnew Vue({ }) //在new Vue 下面执行 microApp.start()3、新增一个vue页…

Nacos和Eureka比较、统一配置管理、Nacos热更新、多环境配置共享、Nacos集群搭建步骤

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Nacos和eureka的对比二、统一配置管理二、Nacos热更新方式一方式二 三、多环境配置共享四、Nacos集群搭建步骤&#xff08;黑马springCloud的p29&#xff0…

SpringCloud 源码系列之全局 Fegin 日志收集(okHttpClient、httpClient)

SpringCloud 源码系列之全局 Fegin 日志收集&#xff08;okHttpClient、httpClient&#xff09;目录 HttpClient 全局日志收集思路切换成HttpClient验证配置效果HttpClient 全局日志收集源码分析看源码顺带产物okHttpClient 全局日志收集总结 接上文SpringCloud OpenFegin 底层…

Python爬虫---scrapy shell 调试

Scrapy shell是Scrapy提供的一个交互式shell工具&#xff0c;它可以帮助我们进行爬虫的开发和调试。可以使用它来测试xpath或css表达式&#xff0c;查看它们是如何工作的&#xff0c;以及它们从你试图抓取的网页中提取的数据。它允许你在编写spider时交互地测试表达式&#xff…

【QT】自定义对话框及其调用

目录 1 对话框的不同调用方式 2 对话框QWDialogSize的创建和使用 3 对话框QWDialogHeaders的创建和使用 4 对话框QWDialogLocate的创建与使用 5 利用信号与槽实现交互操作 1 对话框的不同调用方式 在一个应用程序设计中&#xff0c;为了实现一些特定的功能&#xff0c;必须设计…

UI设计中插画赏析和产品色彩分析

插画赏析&#xff1a; 1. 插画是设计的原创性和艺术性的基础 无论是印刷品、品牌设计还是UI界面&#xff0c;更加风格化的插画能够将不同的风格和创意加入其中&#xff0c;在激烈的竞争中更容易因此脱颖而出。留下用户才有转化。 2. 插画是视觉触发器&#xff0c;瞬间传达大量…

13 | 使用代理ip爬取安居客房源信息

这是一个简单的Python爬虫代码,用于从安居客网站爬取房地产信息。该爬虫使用了代理IP来绕过可能的封禁,并提供了一些基本的信息抽取功能。 如果访问过多,那么可能出现了验证码 对此,最好的方法就是换ip。 使用代理IP的主要目的是保护爬虫的稳定性和隐私。以下是一些常见的原…

8.临床预测模型验证——交叉验证/Bootstrap法

基本概念 交叉验证&#xff1a; 将一定比例的数据挑选出来作为训练集&#xff0c;将其余未选中的样本作为测试集&#xff0c;先在训练集中构建模型&#xff0c;再在测试集中做预测。 内部验证&#xff1a;手动将样本随机分为训练集和测试集&#xff0c;先在训练集中构建模型…

世邦通信 SPON IP网络对讲广播系统getzoneterminaldata.php 未授权访问

产品介绍 世邦通信SPON IP网络对讲广播系统采用领先的IPAudio™技术,将音频信号以数据包形式在局域网和广域网上进行传送,是一套纯数字传输系统。 漏洞描述 spon IP网络对讲广播系统getuserdata.php存在未授权访问漏洞&#xff0c;攻击者可通过该漏洞获取后台敏感数据。 资…

解决kali beef启动失败解问题

只限于出现这个提示的时候使用 卸载 ruby apt remove ruby 卸载 beef apt remove beef-xss 重新安装ruby apt-get install ruby apt-get install ruby-dev libpcap-dev gem install eventmachine 重新安装beef apt-get install beef-xss 弄完以上步骤如果还是不行就重启kali再试…

现代雷达车载应用——第3章 MIMO雷达技术 3.4节 自动驾驶使用的高分辨成像雷达

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 3.4 自动驾驶使用的高分辨成像雷达 如今&#xff0c;许多专为ADAS功能设计的汽车雷达收发器&#xff0c;如NXP半导体的MR3003和德州仪器的AWR2243&…

力扣hot100 打家劫舍 DP 滚动数组

Problem: 198. 打家劫舍 文章目录 思路复杂度&#x1f496; Code&#x1f496; DP空间优化版 思路 &#x1f468;‍&#x1f3eb; 参考地址 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( n ) O(n) O(n) &#x1f496; Code class Solution {public static …