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

3.4 stm32系列:定时器(PWM、定时中断)

一、定时器概述

1.1 软件定时原理

使用纯软件(CPU死等)的方式实现定时(延时)功能;

不精准的延迟:

/* 微秒级延迟函数* 不精准* stm32存在压出栈过程需要消耗时间* 存在流水线,执行时间不确定*/
void delay_us(uint32_t us)
{us*=72;    /* 延时因子 */while(us--);
}
1.2 定时器原理

使用精准的时基,通过硬件的方式,实现定时功能;

定时器的核心是计数器,原理:
精准的时钟源(产生CLK时钟信号)->预分频器(PSC,频率做一个除法,得到计数器工作频率->CNT计数器(没来一个时钟计一个数)->产生溢出(时间到,并自动重装CNT计数器值)

1.3 STM32定时器分类

常规定时器:基本定时器、通用定时器、高级定时器

专用定时器:独立看门狗、窗口看门狗、实时时钟、低功耗定时器

内核定时器:SysTick定时器

(1)定时器配置(F1系列)
基本定时器TIM6/TIM7(16位0-65535,递增,分频系数1~65535);
通用定时器TIM2-5(16位、递增/递减/中央对齐,分频系数1~65535,捕获比较通道4);
高级定时器TIM1/TIM8(16位、递增/递减/中央对齐,分频系数1~65535,捕获比较通道4,互补输出)

(2)功能区别
基本定时器:没有输入输出通道,常用作时基,即定时功能;
通用定时器:具有多路独立通道,可用作输入捕获/输出比较,也可用作时基;
高级定时器:除具备通用定时器所有功能外,还具备带死区控制的互不信号输出、刹车输入等功能(可用作电机控制、数字电源设计等)

二、定时器计数模式及溢出条件

2.1 基本定时器简介

1. 基本定时器:TIM6/TIM7(F1);

2. 主要特性:
16位递增计数器(计数值:0~65535);
16位预分频器(分频系数:1~65536,等于PSC寄存器值+1);
可用于触发DAC;
在更新事件(计数器溢出)时,可产生中断/DMA请求;

2.2 定时器计数模式及溢出条件

递增计数模式:CNT==ARR(自动重装载计数器设定)
递减计数模式:CNT==0
中心对齐模式:CNT==ARR-1、CNT==1

2.3 实例说明

(1)递增计数模式

PSC=1;     /* 分频系数=PSC+1=2 */
ARR=36;    /* 计数到36时产生溢出 */

CK_PSC为时钟信号,CNT_EN为使能信号(使能使计数器起作用计数) ,定时器时钟(经过PSC+1分频后的计数),计数寄存器每来一个定时器时钟进行加一,计数器上溢/更新事件/更新中断标志(达到溢出计数值时触发置1);

(2)递减模式

PSC=1;     /* 分频系数=PSC+1=2 */
ARR=36;    /* 计数到36时产生溢出 */

(3)中心对齐模式

PSC=0;     /* 分频系数=PSC+1=1 */
ARR=6;     /* 计数到6时产生溢出 */

上图开始时计数器寄存器递减直至0时触发置1,再递增直至到6后触发置1再递减。

三、定时器相关寄存器及溢出时间计算方法

3.1 定时器中断相关寄存器(F1)

(1)TIM6和TIM7控制寄存器1(TIMx_CR1)
ARPE(位7):自动重装载使能,默认为0(TIMx_ARR寄存器没有缓存,操控ARR后立即赋值到影子寄存器生效),置1(操控ARR后,需等到U事件发生再赋值到影子寄存器);
CEN(位0):0关闭计数器,1使能计数器;

(2)TIM6和TIM7 DMA/中断使能寄存器(TIMx_DIER)
UDE(位8):更新DMA请求使能,0禁止更新DMA请求,1使能更新DMA请求;
UIE(位0):更新中断使能,0禁止更新中断,1使能更新中断;

(3)TIM6和TIM7 状态寄存器(TIMx_SR)
UIF(位0):用于判断是否产生了更新中断,由硬件置1,软件清除。更新中断标志,硬件在更新中断设置时设置该位,由软件清除。0没有产生更新,1产生了更新中断。

(4)TIM6和TIM7 计数器(TIMx_CNT)
计数器实时数值,可用于设置计时器初始值,范围:0~65535;

(5)TIM6和TIM7 预分频器(TIMx_PSC)
计数器的时钟频率CK_CNT等于f(ck_psc)/(PSC+1);

(6)TIM6和TIM7 自动重装载寄存器(TIMx_ARR)

3.2 定时器溢出时间计算方法

定时器溢出时间计算公式:

T_{out}=\frac{(ARR+1)*(PSC+1)}{F_t}
其中,Tout是定时器溢出时间,Ft是定时器的时钟源频率(未经过分频),ARR是自动重装载寄存器的值,PSC是预分频寄存器的值。

四、基本定时器中断实验配置

4.1 中断实验配置步骤

(1)配置定时器基础工作参数
HAL_TIM_Base_Init()
主要寄存器:CR1、ARR、PSC
功能:初始化定时器基础参数

(2)定时器基础MSP初始化
HAL_TIM_Base_MspInit()
功能:存放NVIC、CLOCK、GPIO初始化代码

(3)使能更新中断并启动计数器
HAL_TIM_Base_Start_IT()
寄存器:DIER、CR1
功能:使能更新中断并启动计数器

(4)设置优先级,使能中断
HAL_NVIC_SetPriority()、HAL_NVIC_Enable()

(5)编写中断服务函数
TIMx_IRQHandler()等->调用HAL_TIM_IRQHandler()
寄存器:SR
功能:定时器中断处理公用函数,处理各种中断

(6)编写定时器更新中断回调函数
HAL_TIM_PeriodElapsedCallback()
功能:定时器更新中断回调函数,由用户重定义

4.2 基本定时器中断程序设计

实现功能:使用定时器6,实现500ms定时器更新中断,在中断里翻转LED0

参数设定:
(1)挂载在APB1(36MHz),定时器时钟x2=72MHz,Ft=72MHz;
(2)分频系数:PSC设为7199(加1刚好为7200);
(3)ARR=0.5*72000000/7200=5000->ARR=4999。

源码:

主函数:

int main(void)
{HAL_Init();                             /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */delay_init(72);                         /* 延时初始化 */usart_init(115200);                     /* 串口初始化为115200 */led_init();                             /* 初始化LED */btim_timx_int_init(5000 - 1, 7200 - 1); /* 10Khz的计数频率,计数5K次为500ms */
}

定时器头文件:

#ifndef __BTIM_H
#define __BTIM_H#include "./SYSTEM/sys/sys.h"#define BTIM_TIMX_INT                       TIM6
#define BTIM_TIMX_INT_IRQn                  TIM6_DAC_IRQn
#define BTIM_TIMX_INT_IRQHandler            TIM6_DAC_IRQHandler
#define BTIM_TIMX_INT_CLK_ENABLE()          do{ __HAL_RCC_TIM6_CLK_ENABLE(); }while(0)   /* TIM6 时钟使能 */void btim_timx_int_init(uint16_t arr, uint16_t psc);    /* 基本定时器 定时中断初始化函数 */#endif

定时器代码:

#include "./BSP/TIMER/btim.h"TIM_HandleTypeDef g_timx_handle;  /* 定时器句柄 *//* 定时器中断初始化函数 */
void btim_timx_int_init(uint16_t arr, uint16_t psc)
{g_timx_handle.Instance = BTIM_TIMX_INT;                      /* 通用定时器X */g_timx_handle.Init.Prescaler = psc;                          /* 设置预分频系数 */g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP;         /* 递增计数模式 */g_timx_handle.Init.Period = arr;                             /* 自动装载值 */HAL_TIM_Base_Init(&g_timx_handle);HAL_TIM_Base_Start_IT(&g_timx_handle);    /* 使能定时器x及其更新中断 */
}/* 
* 定时器基础MSP初始化函数
* 定时器底层驱动,开启时钟,设置中断优先级
* 此函数会被HAL_TIM_Base_Init()函数调用*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if (htim->Instance == BTIM_TIMX_INT){BTIM_TIMX_INT_CLK_ENABLE();                     /* 使能TIM时钟 */HAL_NVIC_SetPriority(BTIM_TIMX_INT_IRQn, 1, 3); /* 抢占1,子优先级3,组2 */HAL_NVIC_EnableIRQ(BTIM_TIMX_INT_IRQn);         /* 开启ITM3中断 */}
}/* 定时器6中断服务函数 */
void BTIM_TIMX_INT_IRQHandler(void)
{HAL_TIM_IRQHandler(&g_timx_handle); /* 定时器中断公共处理函数 */
}/* 定时器溢出中断回调函数 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if (htim->Instance == BTIM_TIMX_INT){LED1_TOGGLE(); /* LED1反转 */}
}

五、通用定时器

 5.1 通用定时器简介

(1)通用定时器(F1):TIM2~TIM5;
(2)主要特性:16位递增、递减中心对齐计数器(计数值:0~65535);16位预分频器(1~65535),可用于触发DAC和ADC;在更新事件、触发事件输入捕获输出比较,会产生终端/DMA请求;
(3)4个独立通道,可用于:输入捕获、输出比较输出PWM单脉冲模式
(4)使用外部信号控制定时器,且可实现多个定时器互连的同步电路
(5)支持编码器和霍尔传感器电路等

5.2 计数器时钟源寄存器设置

(1)内部时钟(CK_INT):设置TIMx_SMCR的SMS=000

(2)外部时钟模式1(外部输入引脚TIx)

设置TIMx_SMCR的SMS=111(ECE为0),输入:TI1_ED(双边沿检测,通道1)、TI1FP1(单边沿,通道1)、TI2FP2(单边沿,通道2);

TS寄存器:100(TI1的边沿检测器TI1_ED)、101滤波后的定时器输入1(TI1FP1)、110(滤波后的定时器输入2)、111(外部触发输入ETFR)

ICF[3:0]寄存器(滤波器配置):0000无滤波器(以fDTS采样),0001采样频率fSAMPLING=fCK_INT(N=2),0010采样频率fSAMPLING=fCK_INT(N=4),0011采样频率fSAMPLING=fCK_INT(N=8),0100采样频率fSAMPLING=fDTS/2(N=6),0101采样频率fSAMPLING=fDTS/2(N=8),0110采样频率fSAMPLING=fDTS/4(N=6),0111采样频率fSAMPLING=fDTS/4(N=8),1000采样频率fSAMPLING=fDTS/8(N=6),....1111采样频率fSAMPLING=fDTS/32(N=8)
如当配置0011,即采样频率为72MHz,滤波次数N=8,即采样到连续8次的高/低电平,才会更改电平。

CKD寄存器(配置fDTS):00(tDTS=tCK_INT内部时钟源频率),01(tDTS=2xtCK_INT),10(tDTS=4xtCK_INT),11(保留);

CC1P:输入/捕获1输出极性,0(捕获上升沿),1(捕获下降沿)

(3)外部时钟模式2(外部输入触发ETR)

设置TIMx_SMCR的ECE=1,引脚输入:ETR引脚输入

ETP寄存器:0(高电平或上升沿有效)、1(低电平或下降沿有效);

ETPS寄存器:00关闭预分频、01ETPR频率/2、10ETPR频率/4、11ETPR频率/8;

ETP寄存器:外部触发滤波,与外部时钟1中的ICF相同定义

使用一个定时器作为来一个定时器的预分频器

MMS寄存器:主模式选择,010(更新,更新事件被选为触发输入。主定时器的时钟可以被用作分定时器的预分频器);
SMS=111;
TS:当从定时器为TIM2,000(定时器1作为主)、001(定时器8作为主)、010(定时器2作为主),011(定时器4为主)

(4)内部触发输入

5.3 通用定时器中断实验

与基本定时器异同:通用定时器有三种模式——递增、递减、中间对齐

(1)主函数编写

int main(void)
{HAL_Init();                             /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */delay_init(72);                         /* 延时初始化 */usart_init(115200);                     /* 串口初始化为115200 */led_init();                             /* 初始化LED */gtim_timx_int_init(5000 - 1, 7200 - 1); /* 10Khz的计数频率,计数5K次为500ms */}

(2)通用定时器头文件编写

#ifndef __GTIM_H
#define __GTIM_H
#include "./SYSTEM/sys/sys.h"
/******************************************************************************************/
/* 通用定时器 定义 *//* TIMX 中断定义 * 默认是针对TIM2~TIM5.* 注意: 通过修改这4个宏定义,可以支持TIM1~TIM8任意一个定时器.*/
#define GTIM_TIMX_INT                       TIM3
#define GTIM_TIMX_INT_IRQn                  TIM3_IRQn
#define GTIM_TIMX_INT_IRQHandler            TIM3_IRQHandler
#define GTIM_TIMX_INT_CLK_ENABLE()          do{ __HAL_RCC_TIM3_CLK_ENABLE(); }while(0)  /* TIM3 时钟使能 */
/******************************************************************************************/
void gtim_timx_int_init(uint16_t arr, uint16_t psc);        /* 通用定时器 定时中断初始化函数 */
#endif

(3)通用定时器.c文件编写

#include "./BSP/TIMER/gtim.h"
#include "./BSP/LED/led.h"
TIM_HandleTypeDef g_timx_handle; /* 定时器x句柄 */
/*** @brief       通用定时器TIMX定时中断初始化函数* @note*              通用定时器的时钟来自APB1,当PPRE1 ≥ 2分频的时候*              通用定时器的时钟为APB1时钟的2倍, 而APB1为36M, 所以定时器时钟 = 72Mhz*              定时器溢出时间计算方法: Tout = ((arr + 1) * (psc + 1)) / Ft us.*              Ft=定时器工作频率,单位:Mhz** @param       arr: 自动重装值。* @param       psc: 时钟预分频数* @retval      无*/
void gtim_timx_int_init(uint16_t arr, uint16_t psc)
{GTIM_TIMX_INT_CLK_ENABLE();                                 /* 使能TIMx时钟 */g_timx_handle.Instance = GTIM_TIMX_INT;                     /* 通用定时器x */g_timx_handle.Init.Prescaler = psc;                         /* 预分频系数 */g_timx_handle.Init.CounterMode = TIM_COUNTERMODE_UP;        /* 递增计数模式 */g_timx_handle.Init.Period = arr;                            /* 自动装载值 */HAL_TIM_Base_Init(&g_timx_handle);HAL_NVIC_SetPriority(GTIM_TIMX_INT_IRQn, 1, 3);             /* 设置中断优先级,抢占优先级1,子优先级3 */HAL_NVIC_EnableIRQ(GTIM_TIMX_INT_IRQn);                     /* 开启ITMx中断 */HAL_TIM_Base_Start_IT(&g_timx_handle);                      /* 使能定时器x和定时器x更新中断 */
}/*** @brief       定时器中断服务函数* @param       无* @retval      无*/
void GTIM_TIMX_INT_IRQHandler(void)
{/* 以下代码没有使用定时器HAL库共用处理函数来处理,而是直接通过判断中断标志位的方式 */if(__HAL_TIM_GET_FLAG(&g_timx_handle, TIM_FLAG_UPDATE) != RESET){LED1_TOGGLE();__HAL_TIM_CLEAR_IT(&g_timx_handle, TIM_IT_UPDATE);  /* 清除定时器溢出中断标志位 */}
}

六、通用定时器PWM输出

6.1 通用定时器输出PWM原理

(1)输出比较框图(定时器1)

捕获/比较预装载寄存器->满足输出条件->捕获比较影子寄存器->与计数器一同进入比较器->输出

满足输出条件:1)CCR1寄存器已写完;2)CC1S配置为0则设定定时器1可输出;3)OC1PE(0禁止TIMx_CCR1寄存器预装载功能,1开启TIMx_CCR1预转载功能--需发送UEV更新事件)

(2)寄存器配置

CC1S:00(通道1为输出),01-11均为输入;

OC1M:输出模式选择,共有8种(F1)。110和111均为PWM输出模式。CCxP=0(高电平有效),CCxP=1(低电平有效)
110:向上计数时,一旦TIMx_CNT<TIMx_CCR1时,通道1为有效电平,否则为无效电平。向下计数时,TIMx_CNT>TIMx_CCR1时,通道1为有效电平,否则为无效电平;
111:向上计数时,一旦TIMx_CNT<TIMx_CCR1时,通道1为无效电平,否则为有效电平。向下计数时,TIMx_CNT>TIMx_CCR1时,通道1为无效电平,否则为有效电平;

ETRF:强制清零,默认为0不受ETRF影响;当设为1时,一旦检测到ETRF高电平,清除输出OC1REF=0;

CC1P:输出极性选择,0时OC1高电平有效,1时OC1低电平有效;

CC1E:0关闭——OC1禁止输出,1开启——OC1开启输出

(3)输出PWM原理

假设:递增计数模式

ARR:自动重装载寄存器的值;CCRx:捕获/比较寄存器x的值;

即,当CNT<CCRx,IO输出0;当CNT>=CCRx,IO输出1

总结:PWM波周期或频率由ARR决定,PWM占空比由CCRx决定

6.2 PWM输出程序配置步骤

(1)配置定时器基础工作参数:HAL_TIM_PWM_Init(),
主要寄存器:CR1、ARR、PSC,初始化定时器基础参数;

(2)定时器PWM输出MSP初始化:HAL_TIM_MspInit(),
配置NVIC、CLOCK、GPIO等;

(3)配置PWM模式/比较值等:HAL_TIM_PWM_ConfigChanel()
主要寄存器:CCMRx、CCRx、CCER,配置PWM模式、比较值、输出极性等;

(4)使能输出并启动计数器:HAL_TIM_PWM_Start()
主要寄存器:CCER、CR1,使能输出比较并启动计数器

(5)修改比较值控制占空比(可选):__HAL_TIM_SET_COMPARE()
主要寄存器:CCRx,修改比较值

(6)使能通道预装载(可选)
主要寄存器:CCER,使能通道预装载

6.3 PWM定时器输出实验

(1)确定PWM波的周期/频率Tout=(ARR+1)*(PSC+1)/Ft,2KHz为例,PSC=71,ARR=499.

(2)配置输出比较模式:PWM模式1,通道输出极性位:低电平有效。

(3)main函数编写

#include "./SYSTEM/sys/sys.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"
#include "./BSP/LED/led.h"
#include "./BSP/TIMER/gtim.h"extern TIM_HandleTypeDef g_timx_pwm_handle;     /* 定时器x句柄 */
int main(void)
{HAL_Init();                             /* 初始化HAL库 */sys_stm32_clock_init(RCC_PLL_MUL9);     /* 设置时钟, 72Mhz */delay_init(72);                         /* 延时初始化 */usart_init(115200);                     /* 串口初始化为115200 */led_init();                             /* 初始化LED *//* 定时器及pwm初始化,2kHz */gtim_timx_pwm_init(500-1, 72-1);uint16_t ledrpwmval=0;uint8_t dir=1;while (1){delay_ms(5);if (dir)ledrpwmval++;else ledrpwmval--;if (ledrpwmval > 300) dir=0;if (ledrpwmval == 0) dir=1;/* 修改定时器占空比进而实现灯亮度调节->呼吸灯 */__HAL_TIM_SET_COMPARE(&g_timx_pwm_handle, TIM_CHANNEL_2, ledrpwmval);    }
}

(4)gtim.c文件编写

#include "./BSP/TIMER/gtim.h"
#include "./BSP/LED/led.h"TIM_HandleTypeDef g_timx_pwm_handle;  /* 定时器x句柄 *//* 通用定时器PWM输出初始化函数 */
void gtim_timx_pwm_init(uint16_t psc, uint16_t arr)
{g_timx_pwm_handle.Instance=TIM3;        /* 选择定时器3 */g_timx_pwm_handle.Init.Prescaler=psc;   /* 分频系数 */g_timx_pwm_handle.Init.Period=arr;      /* 自动重装置值 */g_timx_pwm_handle.Init.CounterMode=TIM_COUNTERMODE_UP;  /* 向上计数模式 */HAL_TIM_PWM_Init(&g_timx_pwm_handle);  TIM_OC_InitTypeDef timx_oc_pwm_chy;     /* 定义pwm配置句柄 */timx_oc_pwm_chy.OCMode=TIM_OCMODE_PWM1; /* 配置为PWM1模式 */timx_oc_pwm_chy.Pulse=arr / 2;          /* 比较值设为arr一半->占空比50% */ timx_oc_pwm_chy.OCPolarity=TIM_OCPOLARITY_LOW;  /* 输出极性设置为低 *//* PWM初始化分别输入定时器配置、pwm配置以及通道 */HAL_TIM_PWM_ConfigChannel(&g_timx_pwm_handle, &timx_oc_pwm_chy, TIM_CHANNEL_2);/* 开启PWM */HAL_TIM_PWM_Start(&g_timx_pwm_handle, TIM_CHANNEL_2);
}/* 通用定时器PWM MSP初始化函数* 配置NVIC/CLOCK/GPIO
*/
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM3)                /* 如果为定时器3 */{GPIO_InitTypeDef gpio_init_struct;  /* GPIO初始化句柄 */__HAL_RCC_GPIOB_CLK_ENABLE();       /* GPIOB使能 */__HAL_RCC_TIM3_CLK_ENABLE();        /* 定时器使能 */gpio_init_struct.Pin=GPIO_PIN_5;    /* 使能GPIOB5,LED0,TIM3 通道2*/gpio_init_struct.Mode=GPIO_MODE_AF_PP;          /*推挽复用*/gpio_init_struct.Pull=GPIO_PULLUP;              /* 上拉 */gpio_init_struct.Speed=GPIO_SPEED_FREQ_HIGH;    /* 高速 */HAL_GPIO_Init(GPIOB, &gpio_init_struct);__HAL_RCC_AFIO_CLK_ENABLE();        /* 重映射时钟使能 */__HAL_AFIO_REMAP_TIM3_PARTIAL();    /* 定时器3部分重映射(通道2手册对应选项) */}
}

(5)gtim.h文件编写

#ifndef __GTIM_H
#define __GTIM_H#include "./SYSTEM/sys/sys.h"/* 通用定时器PWM输出初始化函数 */
void gtim_timx_pwm_init(uint16_t psc, uint16_t arr);/* 通用定时器PWM MSP初始化函数 */
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim);#endif

相关文章:

3.4 stm32系列:定时器(PWM、定时中断)

一、定时器概述 1.1 软件定时原理 使用纯软件&#xff08;CPU死等&#xff09;的方式实现定时&#xff08;延时&#xff09;功能&#xff1b; 不精准的延迟&#xff1a; /* 微秒级延迟函数* 不精准* stm32存在压出栈过程需要消耗时间* 存在流水线&#xff0c;执行时间不确定…...

【环境搭建】Python、PyTorch与cuda的版本对应表

一个愿意伫立在巨人肩膀上的农民...... 在深度学习的世界里&#xff0c;选择合适的工具版本是项目成功的关键。CUDA、PyTorch和Python作为深度学习的三大支柱&#xff0c;它们的版本匹配问题不容忽视。错误的版本组合可能导致兼容性问题、性能下降甚至项目失败。因此&#xff0…...

【经验总结】AUTOSAR架构下基于TJA1145收发器偶发通信丢失不可恢复问题分析

目录 前言 正文 1.问题描述 2.尝试问题复现 3.尝试问题定位 4.直接原因 5.总结 前言 在《【CAN通信】TJA1145收发器重要功能介绍》一文中我们详细介绍了TJA1145收发器的重点内容,最近在开发测试过程中就遇到了一个CAN通信丢失且不可恢复的偶发问题,解决该问题的思路和…...

帝国CMS:如何去掉帝国CMS登录界面的认证码登录

如果在安装的时候&#xff0c;不小心选中了认证码选项&#xff0c;那么后面登录帝国后台都会要求输入认证码才能登录&#xff0c;如何去除这个设置呢&#xff0c;笔者以古诗词网 www.gushichi.com为例&#xff0c;为大家举例说明&#xff01; 去除步骤如下&#xff1a; 1.前往…...

CTF入门:单主机渗透——flag_XEE的常规思路

学习通过技术手段获取目标主机中预置的5个flag值。 在kali操作机中打开终端&#xff0c;然后使用nmap工具对目标机器进行端口扫描&#xff1a; nmap -sT 192.168.12.26 访问80端口。 网站首页是一个登录框&#xff0c;在界面上有一个提示的标签“弱口令”&#xff0c;说…...

Note2024122303_Code2Docu插件使用

Note2024122303_Code2Docu插件初使用V1.0 step1: 安装 跳转链接 文档阅读&#xff1a;下载文档阅读。 根据文档内容&#xff0c;大概知道首先下载并安装插件&#xff1a; 资料说明和安装方式&#xff1a; 意思是&#xff1a; 下载文件后直接运行 Code2Docu_Installati…...

深度学习之目标检测篇——残差网络与FPN结合

特征金字塔多尺度融合特征金字塔的网络原理 这里是基于resnet网络与Fpn做的结合&#xff0c;主要把resnet中的特征层利用FPN的思想一起结合&#xff0c;实现resnet_fpn。增强目标检测backone的有效性。代码实现如下&#xff1a; import torch from torch import Tensor from c…...

共模电感的工作原理

共模电感也称为共模扼流线圈&#xff0c;是一种抑制共模干扰的器件&#xff0c;它是由两个尺寸相同&#xff0c;匝数相同的线圈对称地绕制在同一个铁氧体环形磁芯上&#xff0c;形成的一个四端器件。当共模电流流过共模电感时&#xff0c;磁芯上的两个线圈产生的磁通相互叠加&a…...

mysql高阶语句

mysql高阶语句 1.对结果排序 SELECT id,name,score FROM info; #由于对id设置了主键约束&#xff0c;默认排序按id的大小升序排序 select name,score from info order by score; #默认按升序&#xff08;从小到大排序&#xff09; select name,score from info order by score…...

sfnt-pingpong -测试网络性能和延迟的工具

sfnt-pingpong 是一个用于测试网络性能和延迟的工具&#xff0c;通常用于测量不同网络环境下的数据包传输性能、吞吐量、延迟等指标。 它通常是基于某种网络协议&#xff08;如 TCP&#xff09;执行“ping-pong”式的测试&#xff0c;即客户端和服务器之间相互发送数据包&…...

PostgreSQL 的历史

title: PostgreSQL 的历史 date: 2024/12/23 updated: 2024/12/23 author: cmdragon excerpt: PostgreSQL 是一款功能强大且广泛使用的开源关系型数据库管理系统。其历史可以追溯到1986年,当时由加州大学伯克利分校的一个研究团队开发。文章将深入探讨 PostgreSQL 的起源、…...

【express-generator】01-安装和基本使用

创建和初始化项目 安装 npm i -g express-generator 创建一个express应用程序 //express 文件名 express blog_demo 跟着提示 cd blog_demo //移动到该目录下 npm install //初始化 npm start //启动服务 在页面打开localhost:3000&#xff08;默认启动的端口&#xff09…...

20241230 基础数学-线性代数-(1)求解特征值(numpy, scipy)

所有代码实现&#xff0c;基于教程中的理论通过python实现出来的。效率不高&#xff0c;但有代码可以看。 由于scipy/sckitlearn/sparkx 底层的实现都被封装了&#xff08;小白兔水平有限&#xff0c;fortran代码实在没看懂&#xff09;这里的实现至少可以和理论公式对应的上。…...

无人零售 4G 工业无线路由器赋能自助贩卖机高效运营

工业4G路由器为运营商赋予 “千里眼”&#xff0c;实现对贩卖机销售、库存、设备状态的远程精准监控&#xff0c;便于及时补货与维护&#xff1b;凭借强大的数据实时传输&#xff0c;助力深度洞察销售趋势、优化库存、挖掘商机&#xff1b;还能远程升级、保障交易安全、快速处理…...

python+opencv+棋盘格实现相机标定及相对位姿估计

pythonopencv棋盘格实现相机标定及相对位姿估计 引言1&#xff0c;使用相机采集含棋盘格图像14张2&#xff0c;进行相机标定&#xff08;1&#xff09;测试软件1标定结果&#xff08;内参及畸变系数&#xff09;&#xff08;2&#xff09;测试软件2标定结果&#xff08;内参及畸…...

【YashanDB知识库】in大量参数时查询性能慢

本文内容来自YashanDB官网&#xff0c;原文内容请见 https://www.yashandb.com/newsinfo/7802939.html?templateId1718516 **【标题】**in大量参数时查询性能慢 **【关键字】**in 大量参数 FAST FULL SCAN INDEX RANGE SCAN **【问题描述】**测试表数据量200w&#xff0c;表…...

kubevirt网络

六、KubeVirt网络 KubeVirt网络相关组件 用户在KubeVirt平台创建虚拟机只需创建一个vmi&#xff08;Virtual Machine Instance&#xff09;对象&#xff0c;之后virt-controller会根据vmi对象中的信息创建一个Pod&#xff0c;这里把这个Pod叫做vmi pod。Vmi pod中有kubevirt组…...

LeetCode100之腐烂的橘子(994)--Java

1.问题描述 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到单元…...

【Leetcode】855. 考场就座

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 题目链接&#x1f517; 在考场里&#xff0c;有 n n n 个座位排成一行&#xff0c;编号为 0 0 0 到 n − 1 n - 1 n−1。 当学生进入考场后&#xff0c;他必须坐在离最近的人最远的座位上。如果有多个…...

AI,cursor快速上手思维导图

https://cursor101.com/zh/tutorial/learn-cursor-tab...

【演化博弈】期望收益函数公式、复制动态方程——化简功能技巧

期望化简 在演化博弈论的研究中&#xff0c;期望收益函数和复制动态方程是核心工具。化简这些公式的功能技巧具有以下几个重要作用&#xff1a; 提高公式的可读性和理解度 复杂的数学表达式可能让人感到困惑。通过化简&#xff0c;公式变得更加简单和易读&#xff0c;使研究者…...

常用Linux命令

常用Linux命令介绍 1.ls命令用于列出当前目录的内容&#xff0c;包括目录、文件和压缩包等。 2.ls命令的参数可以以长格式显示文件信息&#xff0c;如修改时间、文件大小等。 3.使用ls -a参数可以显示隐藏文件和文件夹。 4.通过ls -lh命令可以以人类可读的方式显示文件和文件夹…...

记录树莓派4B安装向日葵的过程

到向日葵官网下载向日葵 for Linux的麒麟Arm64版本&#xff1b;sudo dpkg -i 文件名.deb 安装&#xff1b;安装依赖&#xff1a; sudo apt install libappindicator3-1 如果没有的话就使用&#xff1a; sudo apt install libayatana-appindicator3-1 关闭wayvnc服务及其自启动…...

模型 课题分离

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。明确自我与他人责任。 1 课题分离的应用 1.1课题分离在心理治疗中的应用案例&#xff1a;李晓的故事 李晓&#xff0c;一位28岁的软件工程师&#xff0c;在北京打拼。他面临着工作、家庭和感情的多重…...

docker部署微信小程序自动构建发布和更新

通过 Jenkins 和 Docker 部署微信小程序&#xff0c;并实现自动构建、发布和版本更新&#xff0c;主要涉及以下几个步骤&#xff1a; 设置 Jenkins 环境配置 GitLab 与 Jenkins 的集成构建 Docker 镜像部署和发布微信小程序配置 Jenkins 自动构建 以下是详细的步骤说明&#…...

0.96寸OLED显示屏详解

我们之前讲了 LCD1602&#xff0c;今天我们将它的进阶模块——OLED。它接线更少&#xff0c;性能更强&#xff0c;也能显示中文和图像了。 大家在学习单片机的时候是否会遇到调试的问题呢&#xff1f;例如 “这串代码我到底运行成功了没有” &#xff0c;我相信很多刚开始学习…...

【Python使用】嘿马python高级进阶全体系教程第10篇:静态Web服务器-返回固定页面数据,1. 开发自己的静态Web服务器【附代码文档】

本教程的知识点为&#xff1a;操作系统 1. 常见的操作系统 4. 小结 ls命令选项 2. 小结 mkdir和rm命令选项 1. mkdir命令选项 压缩和解压缩命令 1. 压缩格式的介绍 2. tar命令及选项的使用 3. zip和unzip命令及选项的使用 4. 小结 编辑器 vim 1. vim 的介绍 2. vim 的工作模式 …...

H3C AC_AP基本配置流程

前置摘要 AP管理地址:10.115.8.0/ AP业务地址:10.115.10.0 SSID qdtest passwd 123chery map.txt system-view vlan 1010 quit interface GigabitEthernet 1/0/1 port link-type trunk port trunk permit vlan 1010AC配置 vlan 1008 des Ap_manager quit int vlan 1008 ip ad…...

准备写一个内网穿透的工具

准备写一个内网穿透的工具&#xff0c;目前只实现了HTTP内网穿透的GET方式&#xff0c;看能不能坚持写下去 git地址&#xff1a; xuejiazhi/PortRelay...

模型高效微调方式

除了LoRA&#xff08;Low-Rank Adaptation&#xff09;外&#xff0c;还有其他一些快速且效果好的模型微调方法。这些方法可以在保持模型性能的同时&#xff0c;减少计算和存储需求。以下是几种常见的方法&#xff1a; 1. 参数高效微调&#xff08;Parameter-Efficient Fine-T…...

Linux系统编程——理解系统内核中的信号捕获

目录 一、sigaction() 使用 信号捕捉技巧 二、可重入函数 三、volatile关键字 四、SIGCHLD信号 在信号这一篇中我们已经学习到了一种信号捕捉的调用接口&#xff1a;signal(),为了深入理解操作系统内核中的信号捕获机制&#xff0c;我们今天再来看一个接口&#xff1a;si…...

ISP算法之BNR降噪(Bayer域)

概述 BNR&#xff08;Bayer Noise Reduction&#xff09;即Bayer域降噪算法。对于噪声的分类如下表所示&#xff1a; 高斯噪声&#xff08; Gaussian&#xff09; 高斯噪声也被称为热噪声&#xff0c;通常是由于电路系统中自由电子的热运动&#xff0c;这种噪声幅度分布服从高…...

HBuilder快捷键大全

目录 一、最常用快捷键 二、文件操作快捷键 三、选择操作快捷键 四、插入操作快捷键 五、编辑操作快捷键 六、删除操作快捷键 七、查找操作快捷键 八、标签规范快捷键 八、运行操作快捷键 九、转换操作快捷键 十、跳转操作快捷键 十一、附加功能快捷键 十二、快捷键…...

Diffusion_Policy项目测试报错记录

1、项目连接 paper&#xff1a;2303.04137 (arxiv.org) github: real-stanford/diffusion_policy: [RSS 2023] Diffusion Policy Visuomotor Policy Learning via Action Diffusion (github.com) 2、问题与解决办法 1&#xff09; 运行 python train.py --..... 显示无法Err…...

Linux内核学习资源

老版本内核源码&#xff1a; https://mirrors.edge.kernel.org/pub/linux/kernel/Historic/old-versions/ 内核源码分析开源项目&#xff1a; https://github.com/ultraji/linux-0.12/tree/master/srchttps://gitee.com/wslyx/linux-0.12https://github.com/0voice/linux_ke…...

NGINX的安装和配置(Linux环境)

目录 NGINX 安装方式1、 离线编译安装2、 在线仓库安装 NGINX 常用命令1、进程管理命令2、信息查看命令 NGINX 配置文件1、进程使用的配置2、配置文件格式3、配置文件层级 NGINX 全局配置1、全局配置常用指令2、连接相关配置 NGINX 配置MIME1、MIME 标准2、types 配置块3、defa…...

Leetcode打卡:考场就坐

执行结果&#xff1a;通过 题目&#xff1a; 855 考场就坐 在考场里&#xff0c;有 n 个座位排成一行&#xff0c;编号为 0 到 n - 1。 当学生进入考场后&#xff0c;他必须坐在离最近的人最远的座位上。如果有多个这样的座位&#xff0c;他会坐在编号最小的座位上。(另外&am…...

STM32——“SPI Flash”

引入 在给单片机写程序的时候&#xff0c;有时会用到显示屏&#xff0c;就拿市面上的0.96寸单色显示器来说&#xff0c;一张全屏的图片就占用8x1281024个字节&#xff0c;即1kb的空间&#xff0c;这对于单片机来说确实有点奢侈&#xff0c;于是我买了一个8Mb的SPI Flash&#x…...

Zookeeper基本命令解析

ZooKeeper -server host:port -client-configuration properties-file cmd args addWatch [-m mode] path # optional mode is one of [PERSISTENT, PERSISTENT_RECURSIVE] - default is PERSISTENT_RECURSIVE addauth scheme auth 一、整体命令格式 ZooKeeper -serve…...

React-更新state的数据,dom没有重新渲染

{entourageList.map((person) > (<Row key{person.id}> {/* 使用唯一的 person.id */}<Col span{16}><Row gutter{16}><Col lg{9} md{18} sm{24}><FormItem label{姓名}>{getFieldDecorator(name-${person.id}, {initialValue: person.name,…...

消息队列技术的发展历史

消息队列技术的演进历程宛如一幅波澜壮阔的科技画卷&#xff0c;历经多个标志性阶段&#xff0c;各阶段紧密贴合不同的技术需求与市场风向&#xff0c;下面为您详细道来。 第一阶段&#xff1a;消息中间件的起源&#xff08;1970 年代末期 - 1980 年代中期&#xff09; 在计算…...

20.抽卡只有金,带保底(WPF) C#

这是一个界面应用化后的抽卡&#xff0c;目前只能抽金&#xff0c;只有基础概率加保底概率 适合界面化应用初学者。 这是展示图&#xff1a; 使用的是WPF不是winform&#xff0c;我也是第一次做WPF内容&#xff0c;就可以试一试&#xff0c;代码都在这里了&#xff0c;简单来…...

DALFox-一款XSS自动化扫描工具

声明&#xff01;本文章所有的工具分享仅仅只是供大家学习交流为主&#xff0c;切勿用于非法用途&#xff0c;如有任何触犯法律的行为&#xff0c;均与本人及团队无关&#xff01;&#xff01;&#xff01; 目录标题 一、介绍及使用启动及使用1. 单个扫描2. 多个扫描3. 文件扫描…...

软件测试之压力测试【详解】

压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&#xff0c;并确保软件在危急情况下不会崩溃。它甚至可以测试超出正常工作点的测试&#xff0c;并评估软件在极端…...

电视大全 1.3.8|汇聚多频道资源,秒切换流畅播放

电视大全TV版是一款功能丰富的TV端直播软件&#xff0c;由悠兔电视的同一开发者打造。最新版本更新了更多频道&#xff0c;包括央视、卫视和地方频道等&#xff0c;提供了多线路流畅播放体验&#xff0c;并支持节目回看、线路选择、开机自启等功能。该应用免登录且无购物频道&a…...

MaxKB基于大语言模型和 RAG的开源知识库问答系统的快速部署教程

1 部署要求 1.1 服务器配置 部署服务器要求&#xff1a; 操作系统&#xff1a;Ubuntu 22.04 / CentOS 7.6 64 位系统CPU/内存&#xff1a;4C/8GB 以上磁盘空间&#xff1a;100GB 1.2 端口要求 在线部署MaxKB需要开通的访问端口说明如下&#xff1a; 端口作用说明22SSH安装…...

大恒相机开发(3)—大恒相机工业检测的实际案例

大恒相机工业检测的实际案例 工业检测的实际案例图像采集性能优化技巧工业环境下的稳定性 工业检测的实际案例 以下是一些使用大恒相机进行工业检测的实际案例&#xff1a; 多特征光学成像系统&#xff1a; 在这个案例中&#xff0c;使用大恒相机构建了一个全方位、多特征的图…...

《Java 与 OpenAI 协同:开启智能编程新范式》

在当今科技飞速发展的时代&#xff0c;人工智能已成为推动各领域创新变革的核心力量。OpenAI 作为人工智能领域的领军者&#xff0c;其开发的一系列强大模型&#xff0c;如 GPT 系列&#xff0c;为自然语言处理等诸多任务带来了前所未有的突破。而 Java&#xff0c;作为一种广泛…...

HarmonyOS NEXT 技术实践-基于基础视觉服务的多目标识别

在智能手机、平板和其他智能设备日益智能化的今天&#xff0c;视觉识别技术成为提升用户体验和智能交互的重要手段。HarmonyOS NEXT通过基础视觉服务&#xff08;HMS Core Vision&#xff09;提供了一套强大的视觉识别功能&#xff0c;其中多目标识别作为其关键技术之一&#x…...

MySQL体系架构

MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层。 网络连接层 客户端连接器&#xff08;Connectors&#xff09;&#xff1a;提供与MySQL服务器建立的支持。目前几乎支持所有主 流的服务端编程技术&#xff0c;例如常见的 Java、C、Python、.…...