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

STM32TIM定时中断(6)

一、TIM介绍

1、TIM简介

TIM(Timer)定时器 

定时器的基本功能:定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断。

即定时触发中断,同时也可以看出,定时器就是一个计数器,当这个计数器的输入是一个准确可靠的基准时钟的时候, 那它在对这个基准时钟进行计数的过程,实际上就是计时的过程。

比如在STM32中,定时器的基准时钟一般都是主频72MHz,如果对72MHz计72个数,计1个数的周期那就是1MHz,1/1MHz=0.000001s,也就是1us的时间,如果对72MHz计72000个数,计1个数的周期那就是1KHz,1/1KHz=0.001,也就是1ms的时间。

STM32的定时器拥有16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时,STM32是16位的,因此如果预分频器设置最大,自动重装也设置最大,2的16次方就是65536,即1/(72MHz/65536/65536) = 59.65s。

这里计数器就是用来执行计数定时的一个寄存器,每来一个时钟,计数器加1。

预分频器,可以对计数器的时钟进行分频,让这个计数更加灵活。

自动重装寄存器就是计数的目标值,就是想要计多少个时钟申请中断。

这些寄存器构成了定时器最核心的部分,我们把这一块电路称为时基单元。

STM32的定时器,不仅具备基本的定时中断功能,而且还包含内外时钟源选择、输入捕获、输出比较、编码器接口、主从触发模式等多种功能。

以上功能分为四个部分介绍:

第一部分是定时器中断和内外时钟源选择的功能;

第二部分是输出比较;

第三部分输入捕获和主从触发模式;

第四部分是编码器接口。

本篇文章主要就是介绍第一部分,定时器中断和内外时钟源选择的功能。

STM32的定时器,根据复杂程度和应用场景分为了高级定时器、通用定时器和基本定时器三种类型。

其中高级定时器最复杂,通用定时器中等复杂但最常用,基本定时器最简单,本篇文章主要就是介绍通用定时器。

2、定时器类型

STM32F103C8T6内部拥有的定时器资源是:TIM1、TIM2、TIM3、TIM4,即一个高级定时器,3个通用定时器,没有基本定时器。

不同的芯片型号,拥有的定时器资源是不同的

3、基本定时器

基本定时器拥有定时中断和主模式触发DAC的功能。

预分频器之前,连接的就是基准计数时钟的输入,由于基本定时器只能选择内部时钟,所以可以直接认为预分频器的输入是由内部时钟过来的,内部时钟的来源是RCC_TIMxCLK,这里的频率值一般都是系统的主频72MHz,所以通向时基单元的计数基准频率就是72MHz。

接下来看下面部分,由三个最重要的寄存器组成,分别是计数器、预分频器、自动重装寄存器,它们构成了最基本的计数计时电路,所以这一块电路就叫做时基单元。

预分频器可以对72MHz的计数时钟进行预分频,比如预分频器写0,那就是不分频,或者说是1分频,这时候输出频率=输入频率=72MHz,如果预分频器写1,那就是2分频,,输出频率=输入频率/2=36MHz,如果预分频写2,就是3分频,输出频率=输入频率/3=24MHz,以此类推,所以预分频器的值和实际的分频系数相差了1,即实际分频系数=预分频器的值+1,这个预分频器是16位的,所以最大值可以写65535,也就是65536分频。

计数器可以对预分频后的计数时钟进行计数,计数时钟每来一个上升沿,计数器的直接就加1,这个计数器也是16位的,所以里面的值可以从0一直加到65535,如果再加,计数器就会回到0重新开始,计数器的值是在计时过程中会不断地自增运行,当自增运行到目标值时,产生中断,那就完成了定时任务。

所以还需要一个存储目标值的寄存器,那就是自动重装寄存器,自动重装寄存器也是16位的,它存的就是我们写入的计数目标,在运行的过程中,计数值不断自增,自动重装值是固定的目标,当计数值等于自动重装时,也就是计时时间到了,那它就会产生一个中断信号,并且清零计数器,计数器自动开始下一次的计数计时。

图里面右下角画的一个向上的折线箭头UI,就代表这里会产生中断信号,像这种计数值等于自动重装值产生的中断,一般称作为“更新中断”,这个更新中断之后就会通往NVIC,我们再配置好NVIC的定时器通道,那定时器的更新中断就能够得到CPU的响应了。

右下角画的向下的箭头U,代表的是会产生一个事件,这里对应的事件就叫做“更新事件”,更新事件不会触发中断,但可以触发内部其他电路的工作。

以上这些,就是定时器定时中断的全部流程了。

4、通用定时器

通用定时器除了基本定时器的功能外,计数器的计数模式就不止向上计数(计数器从0开始,向上自增,计数到重装值,清零同时申请中断)这一种了,还支持向下计数模式和中央对齐模式。

向下计数模式,就是从重装值开始,向下自减,减到0之后,回到重装值同时申请中断,然后继续下一轮,依次循环,这就是向下计数。

中央对齐的计数模式,就是从0开始,先向上自增,计数到重装值,申请中断,然后再向下自减,计数到重装值,再申请中断,然后继续下一轮,依次循环,这就是中央对齐模式。

在中间时基单元的上方,是内外时钟源选择和主从触发模式的结构。

先看内外时钟源选择,对于基本定时器而言,定时只能选择内部时钟,也就是系统频率72MHz,对于通用定时器,时钟源不仅可以选择内部的72MHz时钟,还可以选择外部时钟。

具体包括:
        第一个外部时钟就是来自TIMx_ETR引脚上的外部时钟,参考引脚定义表可知,可以看到PA0处有TIM2_CH1_ETR功能,意思是这个TIM2的CH1和ETR都是复用在了PA0引脚位置。              可以在TIM2的ETR引脚,也就是PA0上接一个外部方波时钟,然后配置一下内部的极性选择、边沿检测和预分频电路,再配置一下输入滤波电路,这两块电路可以对外部时钟进行一定的整形,因为是外部引脚的时钟,所以难免会有些毛刺,那这些电路就可以对输入的波形进行滤波,最后,滤波后的信号,兵分两路,上面一路ETRF进入触发控制器,紧跟着就可以选择作为时基单元的时钟了。                                                                                                                                              如果想在ETR外部引脚提供时钟,或者想对ETR时钟进行计数,把这个定时器当作计数器来用的话,那就可以配置这一路的电路,在STM32中,这一路也叫做“外部时钟模式2”。

除了外部引脚ETR可以提供时钟外,下面还有一路可以提供时钟,就是TRGI(Trigger In),这一路从名字上来看的话,主要作用是用作触发输入来使用的,这个触发输入可以触发定时器的从模式,也可以作为外部时钟来使用,当TRGI当作外部时钟使用时,这一路就叫做“外部时钟模式1”。

具体有哪些外部时钟通过TRGI这一路,首先是ETR引脚的信号,这里ETR引脚的信号既可以通过ETRF上面一路来当作时钟,又可以通过TRGI下面一路来当作时钟,两种情况对于时钟输入而言是等价的,只不过是下面这一路输入会占用触发输入的通道而已。

其次就是ITR信号,这一部分的时钟信号是来自其他定时器,从右边可以看出,这个主模式的输出TRGO可以通向其他定时器,通向其他定时器的时候,就接到了其他定时器的ITR引脚上来了。左边输入的ITR0和ITR3分别来自其他4个定时器的TRGO输出,定时器的ITRx和定时器TIMx的TRGO连接方式如下图所示。
通过这一路,就可以实现定时器级联的功能。比如,可以先初始化TIM3,然后使用主模式把它的更新事件映射到TRGO上,接着再初始化TIM2,这里选择ITR2,对应的就是TIM3的TRGO,然后后面再选择时钟为外部时钟模式1,这样TIM3的更新事件就可以驱动TIM2的时基单元,也就实现了定时器的级联。

 最后,还可以选择TI1F_ED信号,这里连接的是下面的输入捕获单元的CH1引脚,也就是从CH1引脚获得时钟,后缀ED(edge)就是边沿的意思,通过TIMx_CH1这一路输入的时钟,上升沿和下降沿均有效,最后这个时钟还可以通过TI1FP1和TI2FP2获得。

在中间时基单元的下方,包含了两块电路,右边一块是输出比较电路,总共有四个通道,分别对应CH1到CH4的引脚,可以用于输出PWM波形、驱动电机;左边一块是输入捕获电路,也是四个通道,可以用于测量输入方波的频率等;中间的一个寄存器是捕获/比较寄存器,是输入捕获和输出比较电路共用的,因为输入捕获和输出比较不能同时使用,所以这里的寄存器是共用的,引脚也是共用的。

5、定时中断基本结构

首先时基单元下方的运行控制,就是控制寄存器的一些位,比如启动停止、向上或向下计数等等,操作这些寄存器就能控制时基单元的运行。

中间黄色块及左边区域,是为时基单元提供时钟的部分,这里可以选择RCC提供的内部时钟,也可以选择ETR引脚提供的外部时钟模式2,还可以选择触发输入,当做外部时钟模式1,对应的有ETR外部时钟、ITRx其他定时器、TIx输入捕获通道,这些就是定时器所有可选的时钟源了。
最后的编码器模式是编码器独用的模式,普通的时钟用不到这个。

时基单元的右边,就是计时时间到,产生更新中断后的信号去向,中断信号会在状态寄存器里置一个中断标志位, 这个标志位会通过中断输出控制,到NVIC申请中断。中断输出控制就是一个中断输出的允许位,如果需要某个中断,才打开允许位。

6、时基单元的时序

(1)预分频器时序

CK_PSC:预分频器的输入时钟,选内部时钟一般是72MHz;

CN_EN:计数器使能,高电平计数器正常运行,低电平计数器停止;

CK_CNT:计数器时钟,它既是预分频器的时钟输出,也是计数器的时钟输入。
计数器未使能时,计数器时钟不运行,使能后,前半段,预分频系数为1,计数器的时钟等于预分频器的时钟,后半段,预分频器系数变为2了,计数器的时钟也变为之前的一半了。

计数器寄存器:在计数器时钟的驱动下,计数器寄存器也跟随时钟的上升沿不断自增。

自动重装值是FC,当计数值计数到和重装值相等时,在下一个时钟来临时,计数值才清零,同时下面产生一个更新事件,这就是一个计数周期的工作流程。

在计数计到一半时,改变了预分频控制寄存器的分频值,这个变化不会立刻生效,而是会等到本次计数周期结束时,产生了更新事件,预分频控制寄存器的值才会被传递到缓冲寄存器里面去,变化才会生效。

预分频计数器:预分频器内部实际上也是靠计数来分频的,当预分频值为0时,计数器就一直为0,直接输出原频率,当预分频器为1时,计数器就0、1、0、1这样计数,再回到0的时候,输出一个脉冲,这样输出频率就是输入频率的2分频,预分频器的值(PSC)和实际的分频系数之间有一个数的偏移,计数器时钟= 72MHz / (预分频器值 + 1)。

(2)计数器时序

CK_INT:内部时钟72MHz

CNT_EN:时钟使能,高电平启动

CK_CNT:计数器时钟,因为分频系数为2,所以这个频率是内部时钟频率的二分之一

计数器寄存器:在计数器时钟每个上升沿时自增

自动重装初值为0036,因此在0036后的一个计数器时钟上升沿处,计数器寄存器清零,计数器溢出,产生一个更新事件脉冲UEV,还会置一个更新中断标志UIF,这个标志位只要置1,就会申请中断,中断响应后,需要在中断程序中手动清零。

计数器溢出频率=72MHz/(预分频器值+1)/(自动重装值+1),溢出时间=1/计数器溢出频率

通过设置ARPE位,就可以选择是否使用预装功能。

计数器无预装时序时

改变自动重装初值为36时,计数器寄存器计到36就会计数器溢出,直接更新事件,开启下一轮计数。

计数器有预装时序时

在计数中途,将自动重装值由F5改成36,在本轮计数目标仍然会是F5,计数器寄存器会计数到F5后,计数器溢出,更新事件,影子寄存器才会将自动重装值由F5改成36,开启下一轮计数的自动重装值才会变成36。

引入影子(缓存)寄存器,是为了让值的变化和更新事件,同步发生,防止在运行途中更改造成错误。

7、RCC时钟树

在程序中主函数之前,程序还会执行一个SystemInit函数,这个函数就是用来配置时钟树的。

图中左边部分都是时钟的产生电路,右边的都是时钟的分配电路,中间的SYSCLK就是系统时钟72MHz。

在时钟产生电路中,有四个震荡源,分别是内部的8MHz高速RC振荡器(HSI RC);外部的4-16MHz高速石英晶体振荡器,也就是晶振(HSE OSC),一般接8MHz;外部的32.768KHz低速晶振(LSE OSC),这个一般是给RTC提供时钟的;最后是内部的40KHz低速RC振荡器(LSI RC),这个可以给看门狗提供时钟。

上面两个高速晶振,是用来提供系统时钟的,AHB、APB2、APB1的时钟都来源于这两个高速晶振,外部的石英振荡器比内部的RC振荡器相对来说更加稳定一些,所以一般都用外部晶振,如果系统简单,而且不需要那么精确的时钟,也可以用内部RC振荡器,这样就可以省下外部晶振的电路。

在SystemInit函数里,ST公司是按下面这样来配置时钟的。首先会启动内部时钟,选择内部8MHz为系统时钟,暂时以内部8MHz的时钟运行,然后再启动外部时钟,配置外部时钟如上图所示,进入PLLXTPRE锁相环进行倍频,8MHz倍频9倍,得到72MHz,等到锁相环输出稳定后,选择锁相环输出为系统时钟,这样就把系统时钟由8MHz切换成了72MHz。 

CSS是时钟安全系统,它也是负责切换时钟的,它可以监测外部时钟的运行状态,一但外部时钟失效,它就会自动把外部时钟切换回内部时钟,保证系统时钟的运行,防止程序卡死造成事故。外部时钟和内部时钟时间差了大概10倍左右。

在时钟分配电路中,首先系统时钟72MHz进入AHB总线,AHB总线有一个预分频器,在SystemInit里配置的分配系数是1,因此AHB的时钟就是72MHz,然后进入APB1总线,这里配置的分频系数为2,所以APB1总线的时钟就是36MHz,由下面的电路,时钟频率又乘2,因此APB1总线的时钟也是72MHz,所以无论是高级、通用还是基本定时器,它们的内部基准时钟都是72MHz。

二、定时器输出比较功能(PWM)

输出比较简称OC(Output Compare),输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。

CNT是计数器,CCR是捕获/比较寄存器,当CCR为比较寄存器时,CNT计数自增的值会与CCR中的给定值相比较,当CNT的值小于、等于或大于CCR中给定值时,CCR就会输出对应的置1、置0、置1、置0,这样就可以输出一个电平不断跳变的PWM波形,这就是输出比较的基本功能。 

每个高级定时器和通用定时器都拥有4个输出比较通道,但是它们是共用一个CNT计数器的。

1、PWM波形介绍

脉冲宽度调制简称PWM(Pulse Width Modulation),在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,即通过输入数字量,来得到输出模拟量,常应用于电机控速等领域。

PWM参数

T_S:周期,T_ON:高电平,T_OFF:低电平
频率 = 1 / T_S            占空比 = T_ON / T_S           
分辨率 = 占空比变化步距(分辨率为1%,则占空比按1%、2%、3%变化)

输出比较的8个模式


其中有效电平就是指高电平,无效电平就是指低电平。
这里主要使用PWM模式1中的向上计数。

2、PWM的基本结构

PWM初始化配置
(1)RCC开启TIM外设和GPIO的时钟;
(2)配置时钟源;
(3)配置时基单元;
(4)配置输出比较单元,包括CCR的值,输出比较模式、极性选择和输出使能;
(5)配置GPIO口,把PWM对应的GPIO口,初始化为复用推挽输出;
(6)运行控制,启动计数器。


配置好时基单元后,CNT就会不断自增运行,CCR是给定值,CNT和CCR会不断比较,后面的输出模式控制器采用PWM模式1,向上计数方式。

当CNT<CCR时,REF参考值输出高电平;当CNT≥CCR时,REF参考值输出低电平。

上图中,黄色线是ARR自动重装器的值,蓝色线是CNT计数器不断自增的值,红色线是CCR中给定值。
假设给ARR=99,CCR=30时,当CNT=0~29,输出高电平给GPIO;当CNT=30~99,输出低电平给GPIO。这样就能通过这三个寄存器的值来调控PWM的频率和占空比了。

3、PWM的参数计算

PWM频率:  Freq = CK_PSC / (PSC + 1) / (ARR + 1)
PWM占空比:  Duty = CCR / (ARR + 1)
PWM分辨率:  Reso = 1 / (ARR + 1)

CK_PSC:预分频器的输入时钟,选内部时钟一般是72MHz;
PSC:预分频器的值
ARR:自动重装器的值
CCR:比较器的值

三、定时器输入捕获(测频率和占空比)

输入捕获简称IC(Input Capture),输入捕获模式下,当通道输入引脚出现指定电平跳变时,当前CNT(计数器)的值将被锁存到CCR(捕获寄存器)中,可用于测量PWM波形的频率(脉冲间隔)、占空比(电平持续时间)等参数。

每个高级定时器和通用定时器都拥有4个输入捕获通道。
可配置为PWMI模式,同时测量频率和占空比;
可配合主从触发模式,实现硬件全自动测量(在CNT值存到CCR中后,将CNT清零)。

1、频率测量

测频法(适合测量高频信号):在闸门时间T内,对上升沿计次,得到N,则频率:

测周法(适合测量低频信号):两个上升沿内,以标准频率fc计次,得到N ,则频率:

中界频率:测频法与测周法误差相等的频率点:

当信号频率大于中界频率时,采用测频法;当信号频率小于中界频率时,采用测周法。

本次实验测量PWM信号的频率和占空比采用的是测周法。
上升沿用于触发输出捕获,CNT用于计数计时,每来一个上升沿,就取CNT的值,自动存在CCR里, CCR捕获到的值就是计次N,CNT的驱动时钟就是标准频率fc(72M/预分频系数),通过fc/N就能得到信号频率。

每次捕获CNT的值存在CCR中后,都要将CNT清零,这样下次上升沿再捕获的时候,取出的CNT才是两个上升沿的时间间隔。


2、主从触发模式

主从触发模式:为主模式、从模式和触发源选择三个模式的简称。

主模式可以将定时器内部的信号,映射到TRGO引脚,用于触发别的外设;
从模式就是接收其他外设或者自身外设的一些信号,用于控制自身定时器的运行,也就是被别的信号所控制;
触发源选择就是选择从模式的触发信号源,选择指定的一个信号,得到TRGI去触发从模式,然后从模式就可以在列表中选择一项来自动执行,也可以认为触发源选择是从模式的一部分。 

因此为了使捕获CNT的值存在CCR中后,将CNT清零操作,触发源选择TI1FP1,然后从模式执行的操作选择Reset,这样TI1FP1的信号就可以自动触发从模式,从模式自动清零CNT。

3、输入捕获基本结构

这里只使用了一个输入捕获通道,只能测量频率。

首先将右上角的时基单元配置好,启动定时器,CNT就会开始自增。
从GPIO会输入一个左上角的方波信号,经过滤波器和边沿检测,选择TIFP1为上升沿触发,之后输入选择直连的通道,分频器选择不分频,当TIFP1出现上升沿时,CNT的当前计数值存到CCR1里;之后触发源选择,选中TIFP1为触发信号,从模式选择复位操作,这样TIFP1的上升沿就会通过上面的Reset去触发CNT清零。

计算信号频率:f=标准频率fc(72M/预分频系数)/N(CCR)

4、PWMI基本结构

PWMI模式使用两个通道同时捕获一个引脚,可以同时测量周期和占空比。

TI1FP1配置上升沿触发,触发捕获和清零CNT;
TI1FP2配置下降沿触发,通过交叉通道,去触发通道2的捕获单元。
如左上角图所示,第一个上升沿是TI1FP1触发上升沿,将CNT值存在CCR1中,之后CNT清零;第一个下降沿,就是TI1FP2触发,将这时的CNT值存到CCR2中,这里的CNT值就是高电平期间的计数值,并不触发CNT清零。
所以CCR2就是高电平期间的计数值,CCR1就是一整个周期的计数值。

占空比=CCR2/CCR1

输入捕获模式初始化配置:
(1)RCC开启时钟,将TIM和GPIO的时钟打开;
(2)GPIO初始化,把GPIO配置成输入模式,一般选择上拉输入或浮空输入;
(3)配置时基单元,让CNT计数器在内部时钟的驱动下自增运行;
(4)配置输入捕获单元,包括滤波器、极性、直连通道还是交叉通道、分频器这些参数;
(5)选择从模式的触发源,触发源选择为TI1FP1;
(6)选择触发之后的操作,执行Reset操作;
(7)调用TIM_Cmd函数,开启定时器。 

四、定时器的编码器接口

触发外部中断手动计次(5-2程序):当电机高速旋转时,每秒产生成千上万个脉冲,程序就得频繁中断,进中断后,完成的任务又只是简单得加1减1,软件资源就会被简单又低级的工作占用了,所以对于需要频繁执行,操作又比较简单的任务,一般都会设计一个硬件电路模块来自动完成。因此采用定时器的编码器接口自动计次(6-8程序),会更好的利用软件资源。

1、编码器接口简介

编码器接口(Encoder Interface),可接收增量(正交)编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度。

每个高级定时器和通用定时器都拥有1个编码器接口,两个输入引脚借用了输入捕获的通道1和通道2。

2、正交编码器

当编码器的旋转轴转起来时,A相和B相就会输出上图所示的方波信号给STM32,转的越快,这个方波的频率就越高,所以频率就代表了速度,取出任意相的信号来测频率,就能得到旋转速度。但是只有一相的信号时,无法测出旋转方向。

编码器接口的设计逻辑
首先把A相和B相的所有边沿作为计数器的计数时钟,出现边沿信号时,就计数自增或自减,具体是增还是减就需要靠另一项状态来决定。当出现某个边沿时,判断另一相的高低电平,如果另一项状态为上表中,则判断为正传,计数自增;反之,当出现某个边沿时,另一项的状态符合下表,则判断为反转,计数自减。

TI1FP1对应A相,TI1FP2对应B相。相对信号的电平对应另一相的高低电平。
向上计数意思就是正传,向下计数意思就是反转。

仅在T1计数,意思是只在A相上升沿和下降沿的时候计数,不考虑B相;
仅在T2计数,意思是只在B相上升沿和下降沿的时候计数,不考虑A相;
在T1和T2计数,意思是同时考虑A相和B相的上升沿和下降沿时候计数。**(一般使用这个模式,精度最高)**

采用在T1和T2同时计数时,下面是实例(均不反相)。
中间的毛刺就是噪声,通过检测A相和B相两个方波信号,可以滤掉噪声。

采用在T1和T2同时计数时,下面是实例(反相)。
这里的TI1信号是反相的,需要将TI1高低电平取反之后,查表才是正确的。
如果接一个编码器,发现数据的加减方向反了,这时候就可以调整以下极性,把任意一个引脚反相,就能反转计数方向了,或者也可以将A相和B相的引脚换一下,也可以改变极性。


3、编码器接口的基本结构

(1)RCC开启时钟,开启GPIO和定时器时钟;
(2)配置GPIO口,需要把PA6和PA7配置成输入模式;
(3)配置时基单元,预分频器一般选择不分频,自动重装其ARR一般给最大值65535,只需要CNT执行计数就可以了;
(4)配置输入捕获单元,只有滤波器和极性两个参数有用到;
(5)配置编码器接口模式;
(6)启动定时器。 
 

相关文章:

STM32TIM定时中断(6)

一、TIM介绍 1、TIM简介 TIM&#xff08;Timer&#xff09;定时器 定时器的基本功能&#xff1a;定时器可以对输入的时钟进行计数&#xff0c;并在计数值达到设定值时触发中断。 即定时触发中断&#xff0c;同时也可以看出&#xff0c;定时器就是一个计数器&#xff0c;当…...

hz2新建Keyword页面

新建一个single-keywords.php即可&#xff0c;需要筛选项再建taxonomy-knowledge-category.php 参考&#xff1a;https://www.tkwlkj.com/customize-wordpress-category-pages.html WordPress中使用了ACF创建了自定义产品分类products&#xff0c;现在想实现自定义产品分类下的…...

STL?vector!!!

一、前言 之前我们借助手撕string加深了类和对象相关知识&#xff0c;今天我们将一起手撕一个vector&#xff0c;继续深化类和对象、动态内存管理、模板的相关知识 二、vector相关的前置知识 1、什么是vector&#xff1f; vector是一个STL库中提供的类模板&#xff0c;它是存储…...

Android SDK

Windows纯净卸载Android SDK 1.关闭所有安卓相关的程序 Android StudioEmulators 如模拟器Command prompts using SDK 如appium服务 2.移除SDK相关目录 # Delete your SDK directory F:\android_sdk\android-sdk-windows# Also check and remove if present: $env:LOCALAPP…...

老旧 LabVIEW 系统升级改造

在工业自动化领域&#xff0c;LabVIEW 凭借其直观的图形化编程方式和强大的数据处理能力&#xff0c;成为开发测试测量与控制系统的主流平台。然而&#xff0c;随着技术的快速迭代和业务需求的不断变化&#xff0c;许多早期开发的 LabVIEW 系统逐渐暴露出性能不足、功能缺失或兼…...

【IDEA_Maven】(进阶版)永久性的更改IDEA中每个项目所依赖的Maven默认配置文件及其仓库路径

【IDEA_Maven】永久性的更改IDEA中每个项目所依赖的Maven默认配置文件及其仓库路径 问题解决 问题 Maven使用在线导入&#xff0c;在网络不佳时&#xff0c;往往加载很慢。十分浪费时间&#xff0c;所以我们需要在maven官网找到合适版本的maven&#xff0c;将其压缩包下载下来…...

VSCode远程无法选择虚拟环境问题

1. 无法选择虚拟环境 1.先保证扩展安装正确&#xff0c; 安装python&#xff0c;pylance和intelliCode 2. 直接在设置&#xff08;ctrl shift p&#xff09;里面搜索&#xff0c;点击“Python:Select Interpreter”选项 3. 可能有人会出现第三步的问题&#xff0c;参考链接…...

七、Hadoop 历史追踪、数据安全阀与 MapReduce初体验

Hadoop 实战拾遗&#xff1a;作业历史追踪、数据安全阀与 MapReduce 巧算 π 一、追溯作业足迹&#xff1a;JobHistory Server 的配置与使用 Hadoop 集群高效运行的背后&#xff0c;离不开对已完成作业的细致分析。JobHistory Server (JHS) 就像是作业的“黑匣子”&#xff0…...

【MySQL】联合查询

个人主页&#xff1a;♡喜欢做梦 欢迎 &#x1f44d;点赞 ➕关注 ❤️收藏 &#x1f4ac;评论 目录 一、什么是联合查询 1.概念 2.语法要求 3.示例 4.为什么要使用联合查询 内连接 1.概念 2.语法 3.步骤&#xff1a; 外连接 1.概念 2.分类&#xff1a; 左外连…...

Java 原生实现代码沙箱(OJ判题系统第1期)——设计思路、实现步骤、代码实现

设计思路&#xff1a; 1、保存代码文件 ✅ 目的&#xff1a; 将用户提交的源码以字符串形式写入磁盘&#xff0c;生成 .java 文件。 &#x1f4cc; 原因&#xff1a; Java 是静态语言&#xff0c;必须先编译成 .class 文件才能运行。 需要物理文件路径来调用 javac 或使用 Java…...

课程设计。。。。

人脸考勤系统 需求分析 需求 1.实现企业日常人脸打卡需求 2.管理员要可以管理相关数据 3.可以移植到相关嵌入式设备 …..需求主要是这些&#xff0c;还可以让ai拓展一点 实现 1.介于可移植性这个需求&#xff0c;选用Qt框架&#xff0c;Qt框架跨平台性特比好&#xff0…...

gitlab相关面试题及答案

一、GitLab 基础 1. 什么是 GitLab&#xff1f;它与 GitHub 有什么区别&#xff1f; 答案&#xff1a; GitLab 是一个开源的 DevOps 平台&#xff0c;提供代码托管、CI/CD、问题跟踪等功能。与 GitHub 的主要区别&#xff1a; 开源与商业&#xff1a;GitLab 社区版开源&#x…...

『不废话』之Python 3.14 Beta版新特性

Python 3.14 的第一个Beta版已发布&#xff0c;有几个新特性可以提高我们的编码效率。 未来注释 在上一篇《『不废话』之Python高级特性技巧-CSDN博客》中提到3.7中新增了 “未来注释”&#xff0c;可以使用“from __future__ import annotations”或双引号包括的方式解决当类…...

AWS之数据分析类产品

以下是 Amazon Athena、Amazon QuickSight、AWS Lake Formation、AWS Glue、Amazon OpenSearch Service&#xff08;原 Elasticsearch Service&#xff09;、Amazon Kinesis Data Analytics 和 Amazon Redshift 的核心区别及典型使用场景的对比分析&#xff1a; 1. Amazon Athe…...

RabbitMQ消息的重复消费问题如何解决?

在RabbitMQ中&#xff0c;消息重复消费是一个常见问题&#xff0c;它通常发生在消费者处理消息时出现网络波动、节点故障或消费者自身处理逻辑异常&#xff0c;ACK 失败等情况&#xff0c;都会导致RabbitMQ 不能够正确感知消息已被成功处理&#xff0c;从而重新投递消息。以下是…...

5月9号.

v-for: v-bind: v-if&v-show: v-model: v-on: Ajax: Axios: async&await: Vue生命周期: Maven: Maven坐标:...

如何减少极狐GitLab 容器镜像库存储?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 减少容器镜像库存储 (BASIC ALL) 未清理的容器镜像库会随着时间的推移而变大。添加大量镜像或标签时&#xff1a; 获取可用标…...

怎么用idea打jar包

背景 前端使用vue开发&#xff0c;打包生成dist文件&#xff0c;需要打包成jar包 步骤 前端的dict文件放到后端的src\main\resources目录下dict文件夹改名为staticidea打开后端代码&#xff0c;依次点击右侧maven下的clean 、package最后会在项目的target目录下生成jar&…...

03 mysql 连接

安装 MySQL 后,我们就需要连接它。 使用命令行方式连接使用图形化工具连接一、使用命令行客户端连接 在上一节内容02 mysql 管理(Windows版)-CSDN博客 我们采用的就是这个连接方法,这种方法直接连接的是root用户,找到该命令行属性,打开可以看到里面的参数是root: 这种…...

Jenkins集成Maven

一、概述 Jenkins是一个开源的持续集成工具&#xff0c;用于自动化各种开发任务。Maven是一个项目管理和构建自动化工具&#xff0c;主要用于Java项目。通过将Jenkins和Maven集成&#xff0c;可以实现自动化构建、测试和部署&#xff0c;提高开发效率和代码质量。 二、前提条…...

Qwen智能体qwen_agent与Assistant功能初探

Qwen智能体qwen_agent与Assistant功能初探 一、Qwen智能体框架概述 Qwen&#xff08;通义千问&#xff09;智能体框架是阿里云推出的新一代AI智能体开发平台&#xff0c;其核心模块qwen_agent.agent提供了一套完整的智能体构建解决方案。该框架通过模块化设计&#xff0c;将L…...

Linux——MySQL基础

基础知识 连接服务器 mysql -h 127.0.0.1 -P 3306 -u root -p -h 指明登录部署了myqsl服务的主机 -P 指明访问的端口号 -u 指明用户 -p 指明登录密码&#xff08;可以不填写&#xff09; 什么是数据库 首先&#xff0c;数据库是分为服务端和客户端的&#xff1a; mysql是客户…...

k8s监控方案实践(二):集成Alertmanager告警与钉钉Webhook通知

k8s监控方案实践&#xff08;二&#xff09;&#xff1a; 集成Alertmanager告警与钉钉Webhook通知 文章目录 k8s监控方案实践&#xff08;二&#xff09;&#xff1a; 集成Alertmanager告警与钉钉Webhook通知一、Alertmanager简介1. 什么是Alertmanager&#xff1f;2. Promethe…...

学习threejs,使用Physijs物理引擎

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Physijs 物理引擎1.1.1 ☘️…...

UG471 之 SelectIO 逻辑资源

背景 《ug471》介绍了Xilinx 7 系列 SelectIO 的输入/输出特性及逻辑资源的相关内容。 第 1 章《SelectIO Resources》介绍了输出驱动器和输入接收器的电气特性&#xff0c;并通过大量实例解析了各类标准接口的实现。 第 2 章《SelectIO Logic Resources》介绍了输入输出数据…...

基于HISI3519dv500的yolov8-obb车位检测

1. 数据标注 标注软件&#xff1a;roLabelImg 安装方式&#xff1a;见 https://github.com/cgvict/roLabelImg.git 操作指南&#xff1a; 标注后的数据格式如下&#xff1a; <annotation verified"no"><folder>4800</folder><filename>fr…...

Prometheus生产实战全流程详解(存储/负载/调度篇)

一、存储架构实战&#xff08;TSDB深度优化&#xff09; 1. 存储拓扑设计 2. 关键参数调优 4. 性能压测对照表 二、负载治理实战&#xff08;百万级Series管控&#xff09; 三、调度优化实战&#xff08;精准采集控制&#xff09; 2. 优先级调度配置 3. 自适应抓取调整 4…...

Mac电脑远程连接window系统服务器

1.下载 首先需要下载Microsoft Remote Desktop软件&#xff0c;下载链接如下&#xff1a; https://go.microsoft.com/fwlink/?linkid868963 2、软件下载成功后&#xff0c;可按照引导程序进行安装&#xff0c;成功后进入软件&#xff0c;可看到如下界面&#xff1a;...

【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64

【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64 目录 【Qt】编译 Qt 5.15.x For Windows 基础教程 Visual Studio 2019 MSVC142 x64准备工作&#xff1a;&#xff08;必须&#xff09;第一步&#xff1a;第二步&#xff1a;第三步&#xff1a; 建议…...

【Qt】之【Bug】点击按钮(ui->pushButton)触发非本类设置的槽函数

解决 先说解决办法&#xff0c;按钮在ui为默认命名ui->pushButton,后面改了下按钮名为该按钮的功能相关&#xff0c;就不会随意触发其他槽函数了。 没想到是这个原因。。。 可能是之前默认的objectName与旧的槽函数自动连接了 记录一下&#xff0c;找了好久其他的原因。 以…...

buck和boost总结

目录 1. 基本概念与原理 2. 工作模式 3. 典型应用场景 4. Buck-Boost电路&#xff1a;升降压结合 5. 核心区别与选择 1. 基本概念与原理 Buck电路&#xff08;降压电路&#xff09; 通过开关器件&#xff08;如MOSFET&#xff09;周期性地导通和关断&#xff0c;控制电感充…...

rtsp,。。。。

下面是基于 FFmpeg H.264 RTSP GStreamer 的低延时视频传输方案的详细搭建指南。此方案可将延迟控制在 <100ms&#xff0c;适合远程驾驶、监控等实时性要求较高的应用场景。 &#x1f4e6; 方案架构 摄像头&#xff08;OpenCV&#xff09;→ FFmpeg&#xff08;H.264编码…...

微信小程序地图缩放scale隐性bug

bug1 在真机环境下通过this.mapCtx.getScale获取当前地图的缩放等级带小数&#xff0c; 当设置scale带小数时&#xff0c;地图会先执行到缩放到带小数的缩放等级&#xff0c;然后会再次缩放取整的缩放等级&#xff08;具体向上取整还是向下取整未知&#xff0c;两种情况都观察…...

Java中关于多态的总结

多态是面向对象编程的三大特性之一&#xff08;封装、继承、多态&#xff09;&#xff0c;它允许不同类的对象对同一消息做出不同的响应。 多态的基本概念 1、定义 多态(Polymorphism)指同一操作作用于不同的对象&#xff0c;可以有不同的解释&#xff0c;产生不同的执行结果…...

突破跨界传输瓶颈:Zynq OCM与DDR核间数据共享性能深度调优

一、当硬件加速遇上内存墙:Zynq数据共享的终极挑战 在某军工雷达信号处理项目中,工程师小王遇到了棘手难题——通过Zynq的ARM核与FPGA协同处理雷达回波数据时,系统吞吐量始终无法突破200MB/s的瓶颈。经过三天三夜的排查,发现问题的根源竟是OCM与DDR之间的数据传输效率不足…...

基于 Ubuntu 24.04 部署 WebDAV

无域名&#xff0c;HTTP 1. 简介 WebDAV&#xff08;Web Distributed Authoring and Versioning&#xff09;是一种基于 HTTP 的协议&#xff0c;允许用户通过网络直接编辑和管理服务器上的文件。本教程介绍如何在 Ubuntu 24.04 上使用 Apache2 搭建 WebDAV 服务&#xff0c;无…...

JVM、JRE、JDK的区别

JVM JVM全称Java虚拟机(Java Virtual Machine, JVM),它是运行java字节码的虚拟机&#xff0c;JVM针对不同的系统有不同的实现&#xff0c;目的运行相同的字节码有同样的结果&#xff0c;JVM是“一次编译&#xff0c;到处运行”实现的关键。如下不同的编程语言编译生成字节码文…...

解密火星文:LeetCode 269 题详解与 Swift 实现

文章目录 摘要描述题解答案题解代码分析构建图&#xff08;Graph&#xff09;拓扑排序&#xff08;Topological Sort&#xff09; 示例测试及结果时间复杂度空间复杂度实际场景类比总结 摘要 这篇文章我们来聊聊 LeetCode 269 题&#xff1a;火星词典&#xff08;Alien Dictio…...

系统思考:短期困境与长期收益

最近在项目中&#xff0c;一直有学员会提到一个议题&#xff0c;如何平衡当前困境和长期收益&#xff1f; 我的思考是在商业和人生的路上&#xff0c;我们常常听到“鱼和熊掌不可兼得”的说法&#xff0c;似乎短期利益和长期目标注定是对立的。但事实上&#xff0c;鱼与熊掌是…...

K8S - Harbor 镜像仓库部署与 GitLab CI 集成实战

引言 在 Kubernetes 环境中&#xff0c;容器镜像的存储与管理至关重要。企业级镜像仓库&#xff08;如 Harbor&#xff09;为团队提供了安全、稳定、可扩展的镜像管理解决方案。 一、Harbor 安装与配置 Harbor 是由 VMware 开源的企业级云原生镜像仓库&#xff0c;它不仅支持…...

2025-05-10-FFmepg库裁切有水印的视频

裁后 代码 import subprocess# 文件路径 input_video_path "bg_video.mp4" output_video_path "output_video_cropped.mp4"# 裁剪视频下方的水印 def crop_video(input_video_path, output_video_path, crop_height):# 获取视频的分辨率def get_video…...

通信协议选型篇:如何根据项目需求选择合适的通信协议?

🧭 本文为《嵌入式通信协议全解析》第七篇,面向系统架构师、嵌入式开发者与技术决策者,提供一套实用的通信协议选型方法论,结合性能对比表、使用案例与决策树,助你在“带宽、功耗、距离、可靠性、生态”之间做出最优权衡。 🔍 一、为什么通信协议的选型很关键? 在嵌入…...

Altera系列FPGA纯verilog视频图像去雾,基于暗通道先验算法实现,提供4套Quartus工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目Altera系列FPGA相关方案推荐本博主已有的图像处理方案 3、设计思路框架工程设计原理框图输入Sensor之-->OV7725摄像头输入Sensor之-->OV5640摄像头输入Sensor之…...

大模型的实践应用39-Qwen3(72B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法等研发数学教学管理与成绩提升系统

大家好,我是微学AI,今天给大家介绍一下大模型的实践应用39-Qwen3(72B)+langchain框架+MCP(大模型上下文协议)+RAG+传统算法等研发数学教学管理与成绩提升系统。 在2025年AI技术快速发展的背景下,大模型已展现出在教育领域的巨大潜力。通义千问Qwen3作为阿里云推出的最新一代…...

【强化学习】动态规划(Dynamic Programming, DP)算法

1、动态规划算法解题 LeetCode 931. 下降路径最小和 给你一个 n x n 的 方形 整数数组 matrix &#xff0c;请你找出并返回通过 matrix 的下降路径 的 最小和 。 下降路径 可以从第一行中的任何元素开始&#xff0c;并从每一行中选择一个元素。在下一行选择的元素和当前行所选…...

【Linux】深入拆解Ext文件系统:从磁盘物理结构到Linux文件管理

目录 1、理解硬件 &#xff08;1&#xff09;磁盘 &#xff08;2&#xff09;磁盘的物理结构 &#xff08;3&#xff09;磁盘的存储结构 &#xff08;4&#xff09;磁盘的逻辑结构 &#xff08;5&#xff09;CHS && LBA地址 2、引入文件系统 &#xff08;1&…...

linux ptrace 图文详解(八) gdb跟踪被调试程序的子线程、子进程

目录 一、gdb跟踪被调试程序的fork、pthread_create操作 二、实现原理 三、代码实现 四、总结 &#xff08;代码&#xff1a;linux 6.3.1&#xff0c;架构&#xff1a;arm64&#xff09; One look is worth a thousand words. —— Tess Flanders 相关链接&#xff1a; …...

【列表类型】

1、按索引取值 索引可正向存取&#xff0c;也可反向存取 l [111, paipai, cat] # 正向取值 print(l[1]) # 方向取值 print(l[-1]) # 通过索引给列表重新赋值,前提&#xff1a;索引存在 l[0] ccat print(l) # 索引不存在的情况下&#xff0c;取值or重新赋值的情况下都会报错 …...

MySQL 8.0 OCP 英文题库解析(二)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到2025.07.31 之前。所有人均可以免费考取 原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题6~15。 试题6: …...

数据分析与逻辑思维:六步解决业务难题;参考书籍《数据分析原理:6步解决业务分析难题 (周文全, 黄怡媛, 马炯雄)》

文章目录 一、懂业务&#xff1a;业务背景与逻辑前提1.1 明确业务目标与问题定义1.2 培养批判性思维与高于业务视角 二、定指标&#xff1a;构建科学的指标体系2.1 指标拆解与维度分析2.2 典型指标体系案例&#xff1a;用户与业务视角 三、选方法&#xff1a;匹配业务需求的分析…...