STM32F407ZGT6定时器(学习笔记一)

news2025/4/25 0:39:34

        定时器STM32非常重要的外设,也是比较复杂的外设,下面以STM32F407ZGT6为例记录学习内容:(1)基本定时功能(2)PWM输出功能(3)PWM互补死区、多通道移相输出、刹车(4)输入捕获之计算方波时长(5)输入捕获之编码器。分别使用通用定时器高级定时器进行外设配置,使用库函数寄存器的配置方式。

一、STM32F407ZGT6的定时器基本知识

        STM32F407ZG共有14个定时器。2个高级定时器(TIM1和TIM8),10个通用定时器(TIM2、TIM3、TIM4、TIM5、TIM9、TIM10、TIM11、TIM12、TIM13、TIM14),2个基本定时器(TIM6、TIM7);

        如上图所示,STM32F407ZGT6的定时器分为三种:高级定时器(TIM1和TIM8)、通用定时器(TIME2~TIME5TIM9~TIM14 基本定时器(TIM6和TIM7)。这几种定时器在功能上是有区分的,总体的性能排序:高级定时器>>通用定时器>>基本定时器

APB2总线:TIM1、TIM8~TIM11

APB1总线:TIM2~TIM7、TIM12~TIM14

        STM32F407ZGT6的系统时钟频率配置为168MHz的时候,基本的时钟树如下图所示,从下图中可以观察出APB1和APB2总线上的时钟是不一样的。

APB2总线时钟:168MHz

APB1总线时钟:84MHz

        对于定时器来讲,挂载的时钟总线的时钟频率是非常重要的。进行定时器配置的时候,定时的时间是需要根据总线时钟进行配置的。

STM32内部重要总线地址:

        APB1:0x40000000(Peripheral memory map)

        APB2:0x40010000(Peripheral memory map)

        AHB1:0x40020000(Peripheral memory map)

        AHB2:0x50000000(Peripheral memory map)

二、基本定时器功能

        定时器的基本定时功能是比较简单的。所有类的TIMx定时器都可以实现。下面以通用定时器3为例进行讲解。

2.1、通用定时器基本知识点介绍

通用 TIMx 定时器具有以下特性:
● 16 位( TIM3 TIM4 )或 32 位( TIM2 TIM5 ) 递增、递减和递增 / 递减自动重载计
数器。
● 16 位可编程预分频器,用于对计数器时钟频率进行分频 (即运行时修改),分频系数介
1 65536 之间。
● 多达 4 个独立通道 ,可用于:
         — 输入捕获
        — 输出比较
        — PWM 生成(边沿和中心对齐模式)
        — 单脉冲模式输出
● 使用外部信号控制定时器且可实现多个定时器互连的同步电路。
● 发生如下事件时生成中断/DMA 请求:
         — 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
        — 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
        — 输入捕获
        — 输出比较
● 支持定位用 增量(正交)编码器和霍尔传感器电路
外部时钟触发输入或逐周期电流管理

        下图所示的是通用定时器的内部连接图,本章通用定时的基本定时功能基本没有使用到下面的内部连接图,后面其他的配置需要使用到,所以下图是非常重要的。

时基单元
        可编程定时器的主要模块由一个 16 位/32 位计数器 及其相关的自动重装寄存器组成。此计数
器可采用递增方式计数。计数器的时钟可通过预分频器进行分频。
计数器、自动重载寄存器和预分频器寄存器可通过软件进行读写。即使在计数器运行时也可
执行读写操作。
时基单元包括:
        ● 计数器寄存器 (TIMx_CNT)
        ● 预分频器寄存器 (TIMx_PSC)
        ● 自动重载寄存器 (TIMx_ARR)
时钟选择
计数器时钟可由下列时钟源提供:
        ● 内部时钟 (CK_INT)
        ● 外部时钟模式 1 :外部输入引脚 (TIx)
        ● 外部时钟模式 2 :外部触发输入 (ETR) ,仅适用于 TIM2 TIM3 TIM4
        ● 内部触发输入 (ITRx) :使用一个定时器作为另一个定时器的预分频器,例如可以将定时
器配置为定时器 2 的预分频器。

2.1、通用定时器的寄存器介绍

        基本定时器的寄存器如下图所示,不同的模式配置使用到的寄存器不一样,本次通用定时器的基本定时功能只需要使用到:(1)控制寄存器 1 [TIMx_CR1],(2)TIMx 预分频器 [TIMx_PSC],(3)自动重载寄存器 [TIMx_ARR],(4)DMA/中断使能寄存器 [TIMx_DIER]

2.1.1、控制寄存器 1 [TIMx_CR1]

          

        控制寄存器TIMx_CR1的相关配置主要是定时器的基本配置。

2.1.2、TIMx 预分频器 [TIMx_PSC]

        本寄存器主要是是对定时器的计数频率进行分频之后,在将其放进定时器的计数器的寄存器CNT中。

2.1.3、自动重载寄存器 [TIMx_ARR]

        定时器的计数值配置,计数值超过这个值之后就会从新装载寄存器从新开始计数。

2.1.4、DMA/中断使能寄存器 [TIMx_DIER]

        

        此寄存器的配置,主要是中断和DMA的配置。

2.2、通用定时器的寄存器配置

        (1)使能TIM3时钟。

        (2)设置计数值。

        (3)设置预分频值。

        (4)使能更新中断。

        (5)定时器的CR1寄存器配置(可以直接使用默认值)。

        (6)定时器使能。

        (7)中断的优先级配置、内核中断使能、中断分组配置等。

下面是配置代码,高级定时器、通用定时器、基本定时器的配置都是一样的。

        但是STM32内部的基本定时器只能完成基本定时的功能,以及某些事件的触发,所以只使用定时器功能时候,最好使用基本定时器(TIM6、TIM7).

//定时器3中断服务程序	 
void TIM3_IRQHandler(void)
{ 		    		  			    
	if(TIM3->SR&0X0001)  //溢出中断
	{
		LED1=!LED1;			    				   				     	    	
	}				   
	TIM3->SR&=~(1<<0);  //清除中断标志位 	    
}

//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为42M
//arr:自动重装值。
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us.
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<1;	 //TIM3时钟使能    
 	TIM3->ARR=arr;  	   //设定计数器自动重装值 
	TIM3->PSC=psc;  	   //预分频器	  
    TIM3->CR1 |= 1<<7;   //ARPE使能,自动重装载使能(可以不设置也会自动重装载,应该是ARR设置了就使能了)
	TIM3->DIER|=1<<0;    //允许更新中断	  
	TIM3->CR1|=0x01;     //使能定时器3
  MY_NVIC_Init(1,3,TIM3_IRQn,2);	//抢占1,子优先级3,组2									 
}

2.3、基础定时器

        基本定时器 TIM6 TIM7 包含一个 16 位自动重载计数器,该计数器由可编程预分频器驱动。 此类定时器不仅可用作通用定时器以生成时基,还可以专门用于驱动数模转换器 (DAC) 。实
际上,此类定时器内部连接到 DAC 并能够通过其触发输出驱动 DAC 。 这些定时器彼此完全独立,不共享任何资源。
基础定时器(TIM6 TIM7)的特性包括:
● 16 位自动重载递增计数器
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数
介于 1 65536 之间
● 用于触发 DAC 的同步电路
● 发生如下更新事件时会生成中断/DMA 请求:计数器上溢

下图是基础定时器的内部连接图:

下面是基础定时器的寄存器:

        基础定时使用代码的配置与上面介绍的定时器3的配置是一样的。

2.4、定时器的定时时间分析

 2.4.1、APB1总线上定时器的定时时间分析

        根据上面STM32Cubemx的配置图可知APB1总线的时钟频率为84MHz,TIM2~TIM7、TIM12~TIM14等非高级定时器挂载在APB1总线上。

        如上图所示的,定时器的定时和计数的配置,主要有预分频器的分频值、预装载计数器的装载值。

        (1)预分频器的分频值PSC:84MHz / PSC = A1(Hz)

        (2)预装载计数器的装载值ARR:ARR * (1 / A1) = tim(s)

        上面的A1就是“CNT计数器”的计数的时钟频率,也即是A1频率的脉冲跳动一次,就计数一次,此时计数一次的时间就是频率的倒数(1/A1)单位秒s,预装载计数器的装载值ARR就是记录的次数,乘以前面计数一次的时间,就是tim计时总时间,单位秒s。

 2.4.2、APB2总线上定时器的定时时间分析

         根据上面STM32Cubemx的配置图可知APB2总线的时钟频率为168MHz,TIM1、TIM8~TIM11等定时器挂载在APB2总线上。

        定时的时间和上面分析的一样,就是将“84MHz”换成“168MHz”就可以了。

        (1)预分频器的分频值PSC:168MHz / PSC = A1(Hz)

        (2)预装载计数器的装载值ARR:ARR * (1 / A1) = tim(s)

三、PWM输出功能

        STM32的PWM输出是外部调节的一个重要方式,STM32F407ZGT6的高级定时器和通用定时器是可以产生PWM输出,基础定时是不可以产生PWM输出的,下面最基础的PWM输出采用通用定时器实现介绍。

        通用寄存器的基础知识在第二章中已经介绍过一些,这里不重复。下面只介绍与PWM相关的知识。

3.1、通用定时器TIM2到TIM5的PWM知识

        下图是STM32内部连接图,比较重要,从图中可以看出通用定时器TIM2到TIM5的外部输出的PWM通道有四个,可以同时产生4路PWM脉冲。下面将根据下图展开叙述定时器的PWM输出。

       TIM2到TIM5的PWM输出的配置也是需要定时的定时的基础配置,然后是PWM模式和通道的配置。定时器的计数模式的配置前面已经描述。

        注意:这里计数器的内部自动计数模式还是外部触发的计数模式的配置的选择。如上图所示,如果对“捕获/比较x寄存器”进行配置了之后,定时器的模式就会有下面三种。

【1】捕获/比较x寄存器未配置

        (1)定时器内部自动计数。

【2】捕获/比较x寄存器配置(需要各自配置)

        (1)定时器的计数由外部脉冲触发计数,对外部脉冲计数。

        (2)定时器内部自己进行计数,然后外部触发产生中断进行标记。

           TIM2到TIM5的PWM输出需要配置的寄存器有:(1)捕获/比较模式寄存器 1 (TIMx_CCMR1)(2)捕获/比较使能寄存器 (TIMx_CCER)(3)捕获/比较寄存器 1 (TIMx_CCR1)

3.1.1、TIMx定时的配置

        配置与前面相同,最简单的配置就是只配置预分频值与计数值就可以,其他的都使用默认配置。

3.1.2、捕获/比较模式寄存器 1 (TIMx_CCMR1)

        定时器的“CCMR1”寄存器是配置PWM模型输出通道的,如下图所示的,将对应的GPIO复用到这个CHx接口上之后,就可以对这个通道OCx进行配置。

该寄存器配置的主要有以下部分:

(1)配置通道OCx为输出模式,也就是PWM比较模式,PWM 模式 1和PWM 模式 2(B1)

(2)使能通道OCx(A1)

(3)配置通道OCx预装载使能(A1)

3.1.3、捕获/比较使能寄存器 (TIMx_CCER)

        上面是“CCER”寄存器的“捕获/比较寄存器”的配置,三个为一组“CC1E”、“CC1P”、“CC1NP”,在PWM输出配置的时候只需要用到“CC1E”、“CC1P”两个位就可以了。

(1)“CC1E”:使能CCxL输出到OCx

(2)“CC1P”:设置输出的有效电平

        定时器的“CCER”寄存器是对“捕获/比较x寄存器”的配置,也就是上图中的“CCxL”输出到“OCx”的配置

3.1.4、捕获/比较寄存器 1 (TIMx_CCR1)

        “CCR1”是PWM波占空比设置的寄存器,只需要改变定时器中的“CCR1”的值就可以改变PWM波的占空比,下面会详细介绍。

3.1.4、PWM波形占空比的配置

        影响PWM波形的输出的主要有下面的三个因素:

(1)定时器的预分频值和重装载值。

        定时器的预分频值与重装载值是定时器产生的波形。

(2)定时的计数模式,上升、下降、双边沿。

        这里设置的也是定时器产生的波形。

(3)捕获比较寄存器CCR1的值的设置。

        占空比 = CCR1 / arr

(4)CHx通道的PWM模式

        PWM模式1:在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为有

效状态,否则为无效状态。在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1 ,通道 1 便为
无效状态 (OC1REF=0) ,否则为有效状态 (OC1REF=1)

        PWM模式2:在递增计数模式下,只要 TIMx_CNT<TIMx_CCR1,通道 1 便为无

效状态,否则为有效状态。在递减计数模式下,只要 TIMx_CNT>TIMx_CCR1 ,通道 1 便为
有效状态,否则为无效状态。

        这里通过CCR1的值与定时器的CNT(定时器的计数值)值进行比较之后,比CNT值小的时候输出有效值,比CNT值大的时候输出无效值。

        下面是针对上面三种配置的不同波形展示:

(1)定时器为上升沿,重装载值为arr,输出比较值为CCR1,高电平有效。

(2)定时器为下降沿,重装载值为arr,输出比较值为CCR1,高电平有效。

(3)定时器为双边沿,重装载值为arr,输出比较值为CCR1,高电平有效。

3.2、TIM2到TIM5的配置流程和代码

3.2.1、PWM输出配置流程

        (1)使能定时器时钟

        (2)使能对应GPIO时钟

        (3)配置GPIO为复用推挽输出,上拉输出

        (4)配置GPIO的复用模式寄存器

        (5)设置定时器的自动重装载值

        (6)设置定时器预分频器不分频

        (7)定时器其他配置可以直接使用默认值CR1寄存器的配置

        (8)设置CHx通道的PWM模式

        (9)设置CHx通道的预装载使能,CCR1寄存器的值预装载

        (10)输出比较寄存器OCx的输出使能

        (11)定时器的ARPE,自动重装载值使能

        (12)使能定时器。

3.2.2、PWM输出配置代码

void TIM2_PWM_Init(u32 arr,u32 psc)
{		 					 
	//此部分需手动修改IO口设置
	RCC->APB1ENR|=1<<0; 	//TIM2时钟使能    
	RCC->AHB1ENR|=1<<0;   	//使能PORTA时钟	
	GPIO_Set(GPIOA,PIN0,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
	GPIO_AF_Set(GPIOA,0,1);	//PF9,AF9 
	
	TIM2->ARR=arr;			//设定计数器自动重装值 
	TIM2->PSC=psc;			//预分频器不分频 
	TIM2->CCMR1&=~(uint16_t)(3<<0);  	//CH1 PWM1模式		 
	TIM2->CCMR1 |= 1<<3; 	//CH1 预装载使能
	TIM2->CCMR1 |= 7<<4;   //PWM2模式
	TIM2->CCER |= 1<<0;   	//OC1 输出使能	
	TIM2->CCER |= 1<<1;   	//OC1 低电平有效	   
	TIM2->CCR1 |= 100;   //比较寄存器值
	TIM2->CR1 |= 1<<7;   	//ARPE使能 
	TIM2->CR1 |= 1<<0;    	//使能定时器14 											  
}  

        下面是GPIOA0口输出的PWM波形。

3.2、通用定时器TIM9到TIM14的PWM知识

        通用定时器TIM9到TIM14定时器与通用定时器TIM2到TIM5的配置几乎相同,不同的就是通道的数量不同,TIM9到TIM14定时器的输入和输出通道只有两个,所以在配置“通道”和“捕捉/比较x寄存器”的时候就需要注意

3.3、通用定时器TIM9到TIM14的代码配置

        下面是TIM14的配置代码,与上面的TIM2配置完全一样。

//TIM14 PWM部分初始化 
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM14_PWM_Init(u32 arr,u32 psc)
{		 					 
	//此部分需手动修改IO口设置
	RCC->APB1ENR|=1<<8; 	//TIM14时钟使能    
	RCC->AHB1ENR|=1<<5;   	//使能PORTF时钟	
	GPIO_Set(GPIOF,PIN9,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
	GPIO_AF_Set(GPIOF,9,9);	//PF9,AF9 
	
	TIM14->ARR=arr;			//设定计数器自动重装值 
	TIM14->PSC=psc;			//预分频器不分频 
	TIM14->CCMR1|=6<<4;  	//CH1 PWM1模式		 
	TIM14->CCMR1|=1<<3; 	//CH1 预装载使能	   
	TIM14->CCER|=1<<0;   	//OC1 输出使能	
	TIM14->CCER|=1<<1;   	//OC1 低电平有效	   
	TIM14->CCR1 = 100;  //比较寄存器值
	TIM14->CR1|=1<<7;   	//ARPE使能 
	TIM14->CR1|=1<<0;    	//使能定时器14 											  
}  

四、PWM死区互补输出、移相输出、刹车

        多通道的移相输出是高级定时器和通用定时器都可以实现的;PWM的死区互补输出只有高级定时器可以实现。下面以高级定时器1对移相输出、死区互补输出的配置进行讲解。

4.1、高级定时器的基础知识(STM32F407ZGT6)

TIM1 TIM8 定时器具有以下特性:
● 16 位递增、递减、递增 / 递减自动重载计数器。
● 16 位可编程预分频器,用于对计数器时钟频率进行分频(即运行时修改),分频系数
介于 1 65536 之间。
● 多达 4 个独立通道,可用于:
        — 输入捕获
        — 输出比较
        — PWM 生成(边沿和中心对齐模式)
        — 单脉冲模式输出
● 带 可编程死区的互补输出
● 使用外部信号控制定时器且可实现 多个定时器互连的同步电路
● 重复计数器,用于仅在给定数目的计数器周期后更新定时器寄存器。
● 用于将定时器的输出信号置于复位状态或已知状态的断路输入。
● 发生如下事件时生成中断/DMA 请求:
        — 更新:计数器上溢/下溢、计数器初始化(通过软件或内部/外部触发)
        — 触发事件(计数器启动、停止、初始化或通过内部/外部触发计数)
        — 输入捕获
        — 输出比较
        — 断路输入
● 支持定位用 增量(正交)编码器和霍尔传感器电路。
● 外部时钟触发输入或逐周期电流管理。
        下图是高级定时器的内部连接图,这个图是非常重要的,后面也将以此图展开阐述寄存器的配置。图中输入端口有5个,输出端口有7个。也就可以有4路输入检测,7路PWM波输出,一路PWM输出刹车检测。

时基单元
        可编程高级控制定时器的主要模块是一个 16 位计数器及其相关的自动重载寄存器。计数
器可递增计数、递减计数或交替进行递增和递减计数。计数器的时钟可通过预分频器进行
分频。
        计数器、自动重载寄存器和预分频器寄存器可通过软件进行读写。即使在计数器运行时也可
执行读写操作。
时基单元包括:
        ● 计数器寄存器 (TIMx_CNT)
        ● 预分频器寄存器 (TIMx_PSC)
        ● 自动重载寄存器 (TIMx_ARR)
        ● 重复计数器寄存器 (TIMx_RCR)

        注意:这里的重复计数器寄存器是为了弥补自动重载寄存器的值不够大的问题。当定时计数器计数值达到自动重载寄存器值得时候,会产生溢出,这时候重复计数器寄存器中得值减一,直到技术到重复计数器寄存器中的值减为零的时候,计数器计数才算结束。

时钟选择
计数器时钟可由下列时钟源提供:
        ● 内部时钟 (CK_INT)
        ● 外部时钟模式 1:外部输入引脚
        ● 外部时钟模式 2:外部触发输入 ETR
        ● 外部触发输入 (ITRx):使用一个定时器作为另一定时器的预分频器,例如,可将定时器
1 配置为定时器 2 的预分频器。
内部时钟源 (CK_INT)
        如果禁止从模式控制器 (SMS=000) ,则 CEN 位、 DIR 位( TIMx_CR1 寄存器中)和 UG
TIMx_EGR 寄存器中)为实际控制位,并且只能通过软件进行更改( UG 除外,仍保持自
动清零)。当对 CEN 位写入 1 时,预分频器的时钟就由内部时钟 CK_INT 提供。

4.1.2、死区、移相、刹车介绍

        

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

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

相关文章

分类模型评估方法

1.数据集划分 1.1 为什么要划分数据集? 思考&#xff1a;我们有以下场景&#xff1a; 将所有的数据都作为训练数据&#xff0c;训练出一个模型直接上线预测 每当得到一个新的数据&#xff0c;则计算新数据到训练数据的距离&#xff0c;预测得到新数据的类别 存在问题&…

#前后端分离# 头条发布系统

头条业务简介 用户功能 注册功能登录功能jwt实现 新闻 新闻的分页浏览通过标题关键字搜索新闻查看新闻详情新闻的修改和删除 预览界面 开源上线 https://gitcode.net/NVG_Haru/NodeJS_5161447 数据库设计 数据库脚本 CREATE DATABASE sm_db;USE sm_db;SET NAMES utf8mb4…

Abstract Factory抽象工厂模式(对象创建)

抽象工厂模式&#xff1a;Abstract Factory 链接&#xff1a;抽象工厂模式实例代码 解析 目的 在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象工作”&#xff1b;同时&#xff0c;由于需求的变化&#xff0c;往往存在更多系列对象的创建工作。 如何应对这种变化…

基于Javaee的影视创作论坛的设计与实现+vue论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装影视创作论坛软件来发挥其高效地信息处理的作用&#xff0c…

Typora快捷键设置详细教程

文章目录 一、快捷键设置步骤二、设置快捷键简单案例参考资料 一、快捷键设置步骤 在typora软件中&#xff0c;快捷键的设置步骤主要为&#xff1a; 打开【文件】–>【偏好设置】&#xff0c;找到【通用】–>【打开高级设置】&#xff0c;找到 conf.user.json 文件。 然…

c++哈希表——超实用的数据结构

文章目录 1. 概念引入1.1 整数哈希1.1.1 直接取余法。1.1.2 哈希冲突1.1.2.1 开放寻址法1.1.2.2 拉链法 1.2 字符串哈希 3.结语 1. 概念引入 哈希表是一种高效的数据结构 。 H a s h Hash Hash表又称为散列表&#xff0c;一般由 H a s h Hash Hash函数(散列函数)与链表结构共同…

安全生产知识竞赛活动方案

为进一步普及安全生产法律法规知识&#xff0c;增强安全意识&#xff0c;提高安全技能&#xff0c;经研究&#xff0c;决定举办以“加强安全法治、保障安全生产”为主题的新修订《安全生产法》知识竞赛活动&#xff0c;现将有关事项通知如下&#xff1a; 一、活动时间&#xf…

【网络安全】网络隔离设备

一、网络和终端隔离产品 网络和终端隔离产品分为终端隔离产品和网络隔离产品两大类。终端隔离产品一般指隔离卡或者隔离计算机。网络隔离产品根据产品形态和功能上的不同&#xff0c;该类产品可以分为协议转换产品、网闸和网络单向导入产品三种。 图1为终端隔离产品的一个典型…

HTML5+CSS3②——图像、超链接、音频、视频

目录 图像 超链接 音频 视频 图像 作用&#xff1a;在网页中插入图片 单标签&#xff1a; 标签名&#xff1a;<img src"图片的URL"> <img src"图片的URL" alt"替换文本" title"提示文本"> 属性写在尖括号里面&#xff0c;…

WPF+Halcon 培训项目实战(12):WPF导出匹配模板

文章目录 前言相关链接项目专栏运行环境匹配图片WPF导出匹配模板如何了解Halcon和C#代码的对应关系逻辑分析&#xff1a;添加截取ROI功能基类矩形圆形 生成导出模板运行结果&#xff1a;可能的报错你的文件路径不存在你选择的区域的内容有效信息过少 前言 为了更好地去学习WPF…

YOLOv8改进 添加可变形注意力机制DAttention

一、Deformable Attention Transformer论文 论文地址&#xff1a;arxiv.org/pdf/2201.00520.pdf 二、Deformable Attention Transformer注意力结构 Deformable Attention Transformer包含可变形注意力机制&#xff0c;允许模型根据输入的内容动态调整注意力权重。在传统的Tra…

模型 安索夫矩阵

本系列文章 主要是 分享模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。产品市场战略。 1 安索夫矩阵的应用 1.1 江小白的多样化经营策略 使用安索夫矩阵来分析江小白市场战略。具体如下&#xff1a; 根据安索夫矩阵&#xff0c;江小白的现有产品是其白酒产品&…

西北工业大学计算机组成原理实验报告——verilog前两次

说明 为了有较好的可读性&#xff0c;报告仅仅粘贴关键代码。该PDF带有大纲功能&#xff0c;点击大纲中的对应标题&#xff0c;可以快速跳转。 实验目标 掌握单周期CPU执行指令的流程和原理&#xff1b;学习使用verilog HDL语言实现单周期CPU, 并通过功能仿真&#xff1b;提…

leetcode 315. 计算右侧小于当前元素的个数(hard)【小林优质解法】

链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 代码&#xff1a; class Solution {int[]counts; //用来存储结果int[]index; //用来绑定数据和原下标int[]helpNums; //用于辅助排序 nums 数组int[]helpIndex; //用于辅助排序 i…

Javaweb之Mybatis入门的详细解析

Mybatis入门 前言 在前面我们学习MySQL数据库时&#xff0c;都是利用图形化客户端工具(如&#xff1a;idea、datagrip)&#xff0c;来操作数据库的。 在客户端工具中&#xff0c;编写增删改查的SQL语句&#xff0c;发给MySQL数据库管理系统&#xff0c;由数据库管理系统执行S…

分享好用稳定快递查询api接口(对接简单)

提供实时查询和自动识别单号信息。稳定高效&#xff0c;调用简单方便&#xff0c;性价比高&#xff0c;一条链接即可对接成功。 使用数据平台该API接口需要先注册后申请此API接口。申请成功后赠送免费次数&#xff0c;可直接在线请求接口数据。 接口地址&#xff1a;https://…

迭代归并:归并排序非递归实现解析

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《数据结构&算法》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! &#x1f4cb; 前言 归并排序的思想上我们已经全部介绍完了&#xff0c;但是同时也面临和快速排序一样的问题那就是递…

『亚马逊云科技产品测评』活动征文|云服务器如何快速搭建个人博客(图文详解)

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 文章目录 引言一、前期准备步骤1.1 准备一个亚马逊 EC2 服务器1.2 进入控…

Stimulsoft BI Designer 2024.1.2 Crack

Stimulsoft BI Designer Do you want to create reports and dashboards, but you do not need to create your application? We want to offer you a great solution – Stimulsoft Designer! All you need is to connect your data, drag it onto the template page, config…

uniapp打包Android、Ios、微信小程序

首先我们需要在我们的代码中&#xff0c;把我们所要用到的配置信息配置好&#xff0c;在检查一下我们测试的内容是否有打开&#xff08;取消注释&#xff09;&#xff0c;在检查一下我们的版本信息是否正确&#xff0c;查看一下接口ip是否是正式线 这里的配置信息一定要配置好…