STM32G474的HRTIM用作时基定时器

news2024/11/28 15:58:02

STM32G474的HRTIM由7个定时器组成,分别是主定时器,定时器A,定时器B,定时器C,定时器D,定时器E和定时器F,每个定时器均可单独配置,独立工作。每个定时器都有1个独立的计数器和4个独立的比较器

STM32G474的HRTIM用作定时器,通过对输入时钟计数,验证每个定时器是不是独立工作。理论再好,不如使用程序说明。搜索网络,少有人用。

1、HRTIM计数器的输入时钟频率

当系统时钟为170MHz时,则HRTIM的计数器的输入时钟频率为170*32=5,440MHz

pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
//HRTIM主定时器配置:HRTIM_MCR寄存器bit2:0(CKPSC[2:0])
//HRTIM定时器A控制寄存器配置:HRTIM_TIMxCR寄存器bit2:0(CKPSC[2:0])
//CKPSC[2:0]=000b,则“主定时器和定时器A”的输入时钟的分频值为1
//“主定时器和定时器A”分频后的输入时钟频率为:fHRCK=170 x 32 MHz = 5.44 GHz

2、测试程序

1)、HRTIM.c如下:

#include "HRTIM.h"
#include "delay.h"
#include "LED.h"

/*
STM32G474的HRTIM由7个定时器组成,分别是主定时器,定时器A,定时器B,定时器C,定时器D,定时器E和定时器F;
每个定时器都有1个独立的计数器和4个独立的比较器;
PA8映射到HRTIM1_CHA1,PA9映射到HRTIM1_CHA2,由定时器A控制,可用作输入捕获引脚,或者用作比较器输出引脚;
PA10映射到HRTIM1_CHB1,PA11映射到HRTIM1_CHB2,由定时器B控制,可用作输入捕获引脚,或者用作比较器输出引脚;
PB12映射到HRTIM1_CHC1,PB13映射到HRTIM1_CHC2,由定时器C控制,可用作输入捕获引脚,或者用作比较器输出引脚;
PB14映射到HRTIM1_CHD1,PB15映射到HRTIM1_CHD2,由定时器D控制,可用作输入捕获引脚,或者用作比较器输出引脚;
PC8映射到HRTIM1_CHE1,PC9映射到HRTIM1_CHE2,由定时器E控制,可用作输入捕获引脚,或者用作比较器输出引脚;
PC6映射到HRTIM1_CHF1,PC7映射到HRTIM1_CHF2,由定时器A控制,可用作输入捕获引脚,或者用作比较器输出引脚;
时基定时器中断
*/

uint32_t HRTIM_MASTER_cnt;
uint32_t HRTIM_A_cnt;
uint32_t HRTIM_B_cnt;

void HRTIM_Init(void);


void HRTIM_Init(void)
{
	HRTIM_HandleTypeDef  HRTIM1_structure;
	HRTIM_TimeBaseCfgTypeDef   pTimeBaseCfg  = {0};//HRTIM定时器基本参数描述结构体
	
	__HAL_RCC_HRTIM1_CLK_ENABLE();
	//设置RCC->APB2ENR寄存器bit16(HRTIM1EN),令HRTIM1EN=1,HRTIM1时钟使能,开启HRTIM1时钟

主定时器,定时器A,定时器B,定时器C,定时器D,定时器E和定时器F初始化开始///	
  HRTIM1_structure.Instance = HRTIM1;                            //调用HRTIM1
  HRTIM1_structure.Init.HRTIMInterruptResquests = HRTIM_IT_NONE; //No interrupt enabled
  HRTIM1_structure.Init.SyncOptions = HRTIM_SYNCOPTION_NONE;     //HRTIM是否和外部定时器同步
  HAL_HRTIM_Init(&HRTIM1_structure);
	//初始化HRTIM1
	//HRTIM1_structure.TimerParam[0].CaptureTrigger1=HRTIM_CAPTURETRIGGER_NONE
	//HRTIM1_structure.TimerParam[0].CaptureTrigger2=HRTIM_CAPTURETRIGGER_NONE
	//HRTIM1_structure.TimerParam[0].InterruptRequests=HRTIM_IT_NONE
	//HRTIM1_structure.TimerParam[0].DMARequests=HRTIM_IT_NONE
	//HRTIM1_structure.TimerParam[0].DMASrcAddress=0
	//HRTIM1_structure.TimerParam[0].DMADstAddress
	//HRTIM1_structure.TimerParam[0].DMASize=0
	//直到HRTIM1_structure.TimerParam[6]
	//HRTIM1_structure.State=HAL_HRTIM_STATE_READY
主定时器,定时器A,定时器B,定时器C,定时器D,定时器E和定时器F初始化开始///

	pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
	//HRTIM主定时器配置:HRTIM_MCR寄存器bit2:0(CKPSC[2:0])
	//HRTIM定时器A控制寄存器配置:HRTIM_TIMxCR寄存器bit2:0(CKPSC[2:0])
	//CKPSC[2:0]=000b,则“主定时器和定时器A”的输入时钟的分频值为1
	//“主定时器和定时器A”分频后的输入时钟频率为:fHRCK=170 x 32 MHz = 5.44 GHz

  pTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;//连续计数,周而复始
	//HRTIM主定时器配置:HRTIM_MCR寄存器bit4:3(RETRIG:CONT)
	//HRTIM定时器A控制寄存器配置:HRTIM_TIMxCR寄存器bit2:0(CKPSC[2:0])
	//RETRIG=0,计时器不能重复触发:只有当计数器停止(周期已过去)时,才能进行计数器重置 
	//CONT=1,计时器在连续(自由运行)模式下运行,当它达到MPER值时滚转为零

  pTimeBaseCfg.Period = MASTER_PERIOD;
	//主定时器溢出周期为5us
	//HRTIM主定时器周期配置:HRTIM_MPER寄存器bit15:0(MPER[15:0])
	//HRTIM定时器A周期寄存器配置;HRTIM_PERxR寄存器bit15:0(PERx[15:0])

  pTimeBaseCfg.RepetitionCounter = 9;//重复(9+1)个周期,发生1次中断
	//HRTIM主定时器重复周期值配置:HRTIM_MREP寄存器bit7:0(MREP[7:0]),MREP[7:0]=0x00
	//HRTIM定时器A重复周期值配置:HRTIM_REPxR寄存器bit7:0(MREP[7:0]),MREP[7:0]=0x00

  HAL_HRTIM_TimeBaseConfig(&HRTIM1_structure, HRTIM_TIMERINDEX_MASTER, &pTimeBaseCfg);
	//初始化HRTIM主定时器

	HAL_NVIC_SetPriority(HRTIM1_Master_IRQn,3,0);
	//“主定时器”抢占优先级为3,响应优先级为0
	//设置NVIC中断分组4:4位抢占优先级,0位响应优先级
	//选择中断优先级组4,即抢占优先级为4位,取值为0~15,响应优先级组为0位,取值为0
  HAL_NVIC_EnableIRQ(HRTIM1_Master_IRQn);      //使能“主定时器”中断
	HAL_HRTIM_SimpleBaseStart_IT(&HRTIM1_structure,HRTIM_TIMERINDEX_MASTER);
	//启动主定时器

  HRTIM_MASTER_cnt=0;

/定时器A初始化开始//
	pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
	//HRTIM定时器A配置:HRTIM_MCR寄存器bit2:0(CKPSC[2:0])
	//HRTIM定时器A控制寄存器配置:HRTIM_TIMxCR寄存器bit2:0(CKPSC[2:0])
	//CKPSC[2:0]=000b,则“定时器A”的输入时钟的分频值为1
	//“定时器A”分频后的输入时钟频率为:fHRCK=170 x 32 MHz = 5.44 GHz

  pTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;//连续计数,周而复始
	//HRTIM定时器A配置:HRTIM_MCR寄存器bit4:3(RETRIG:CONT)
	//HRTIM定时器A控制寄存器配置:HRTIM_TIMxCR寄存器bit2:0(CKPSC[2:0])
	//RETRIG=0,计时器不能重复触发:只有当计数器停止(周期已过去)时,才能进行计数器重置 
	//CONT=1,计时器在连续(自由运行)模式下运行,当它达到MPER值时滚转为零

  pTimeBaseCfg.Period = TIM_A_PERIOD;
	//HRTIM定时器A溢出周期为10us
	//HRTIM定时器A周期配置:HRTIM_MPER寄存器bit15:0(MPER[15:0])
	//HRTIM定时器A周期寄存器配置;HRTIM_PERxR寄存器bit15:0(PERx[15:0])

  pTimeBaseCfg.RepetitionCounter = 9;//重复(9+1)个周期,发生1次中断
	//HRTIM定时器A重复周期值配置:HRTIM_MREP寄存器bit7:0(MREP[7:0]),MREP[7:0]=0x00
	//HRTIM定时器A重复周期值配置:HRTIM_REPxR寄存器bit7:0(MREP[7:0]),MREP[7:0]=0x00

  HAL_HRTIM_TimeBaseConfig(&HRTIM1_structure, HRTIM_TIMERINDEX_TIMER_A, &pTimeBaseCfg);
	//初始化HRTIM定时器A

	__HAL_HRTIM_TIMER_ENABLE_IT(&HRTIM1_structure,HRTIM_TIMERINDEX_TIMER_A,HRTIM_TIM_IT_REP);
	//使能“定时器A”重复中断
	HAL_NVIC_SetPriority(HRTIM1_TIMA_IRQn,3,0);
	//“定时器A”抢占优先级为3,响应优先级为0
	//设置NVIC中断分组4:4位抢占优先级,0位响应优先级
	//选择中断优先级组4,即抢占优先级为4位,取值为0~15,响应优先级组为0位,取值为0
  HAL_NVIC_EnableIRQ(HRTIM1_TIMA_IRQn);      //使能“定时器A”中断
	HAL_HRTIM_SimpleBaseStart_IT(&HRTIM1_structure,HRTIM_TIMERINDEX_TIMER_A);
	//启动主定时器

	HRTIM_A_cnt=0;

/定时器B初始化开始//
	pTimeBaseCfg.PrescalerRatio = HRTIM_PRESCALERRATIO_MUL32;
	//HRTIM定时器B配置:HRTIM_MCR寄存器bit2:0(CKPSC[2:0])
	//HRTIM定时器B控制寄存器配置:HRTIM_TIMxCR寄存器bit2:0(CKPSC[2:0])
	//CKPSC[2:0]=000b,则“定时器B”的输入时钟的分频值为1
	//“定时器B”分频后的输入时钟频率为:fHRCK=170 x 32 MHz = 5.44 GHz

  pTimeBaseCfg.Mode = HRTIM_MODE_CONTINUOUS;//连续计数,周而复始
	//HRTIM定时器B配置:HRTIM_MCR寄存器bit4:3(RETRIG:CONT)
	//HRTIM定时器B控制寄存器配置:HRTIM_TIMxCR寄存器bit2:0(CKPSC[2:0])
	//RETRIG=0,计时器不能重复触发:只有当计数器停止(周期已过去)时,才能进行计数器重置 
	//CONT=1,计时器在连续(自由运行)模式下运行,当它达到MPER值时滚转为零

  pTimeBaseCfg.Period = TIM_B_PERIOD;
	//HRTIM定时器B溢出周期为2us
	//HRTIM定时器B周期配置:HRTIM_MPER寄存器bit15:0(MPER[15:0])
	//HRTIM定时器B周期寄存器配置;HRTIM_PERxR寄存器bit15:0(PERx[15:0])

  pTimeBaseCfg.RepetitionCounter = 9;//重复(9+1)个周期,发生1次中断
	//HRTIM定时器B重复周期值配置:HRTIM_MREP寄存器bit7:0(MREP[7:0]),MREP[7:0]=0x00
	//HRTIM定时器B重复周期值配置:HRTIM_REPxR寄存器bit7:0(MREP[7:0]),MREP[7:0]=0x00

  HAL_HRTIM_TimeBaseConfig(&HRTIM1_structure, HRTIM_TIMERINDEX_TIMER_B, &pTimeBaseCfg);
	//初始化HRTIM定时器B

	__HAL_HRTIM_TIMER_ENABLE_IT(&HRTIM1_structure,HRTIM_TIMERINDEX_TIMER_B,HRTIM_TIM_IT_REP);
	//使能“定时器B”重复中断
	HAL_NVIC_SetPriority(HRTIM1_TIMB_IRQn,2,0);
	//“定时器B”抢占优先级为3,响应优先级为0
	//设置NVIC中断分组4:4位抢占优先级,0位响应优先级
	//选择中断优先级组4,即抢占优先级为4位,取值为0~15,响应优先级组为0位,取值为0
  HAL_NVIC_EnableIRQ(HRTIM1_TIMB_IRQn);      //使能“定时器B”中断
	HAL_HRTIM_SimpleBaseStart_IT(&HRTIM1_structure,HRTIM_TIMERINDEX_TIMER_B);
	//启动主定时器

	HRTIM_B_cnt=0;

}

//函数功能:HRTIM的主定时器50us中断一次
void HRTIM1_Master_IRQHandler(void)
{
	if((HRTIM1->sMasterRegs.MDIER & HRTIM_MASTER_IT_MREP) == HRTIM_MASTER_IT_MREP)
	{//Timer repetition interrupt enable
		HRTIM1->sMasterRegs.MICR = HRTIM_MASTER_IT_MREP;
		//HRTIM_TIMxICR为TIMx中断清除寄存器
		//这里是将“定时器A”的HRTIM_TIMAICR的bit4(REPC),令REPC=1,清除重复中断标志位
		HRTIM_MASTER_cnt++;
		if(HRTIM_MASTER_cnt>20)//t=20*50us=1ms
		{
			HRTIM_MASTER_cnt=0;
		  LED1_Toggle(); //LED1引脚输出电平翻转
		}
	}
}

//函数功能:HRTIM的定时器A为100us中断一次
void HRTIM1_TIMA_IRQHandler(void)
{
	if((HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].TIMxDIER & HRTIM_TIM_IT_REP) == HRTIM_TIM_IT_REP)
	{//Timer repetition interrupt enable
		HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_A].TIMxICR = HRTIM_TIM_IT_REP;
		//HRTIM_TIMxICR为TIMx中断清除寄存器
		//这里是将“定时器A”的HRTIM_TIMAICR的bit4(REPC),令REPC=1,清除重复中断标志位
	  HRTIM_A_cnt++;
	  if(HRTIM_A_cnt>20)//t=20*100us=2ms
	  {
		  HRTIM_A_cnt=0;
		  LED2_Toggle(); //LED2引脚输出电平翻转
	  }
	}
}

//函数功能:HRTIM的定时器B为20us中断一次
void HRTIM1_TIMB_IRQHandler(void)
{
	if((HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_B].TIMxDIER & HRTIM_TIM_IT_REP) == HRTIM_TIM_IT_REP)
	{//Timer repetition interrupt enable
		HRTIM1->sTimerxRegs[HRTIM_TIMERINDEX_TIMER_B].TIMxICR = HRTIM_TIM_IT_REP;
		//HRTIM_TIMxICR为TIMx中断清除寄存器
		//这里是将“定时器B”的HRTIM_TIMAICR的bit4(REPC),令REPC=1,清除重复中断标志位
	  HRTIM_B_cnt++;
	  if(HRTIM_B_cnt>20)//t=20*20us=0.4ms
	  {
		  HRTIM_B_cnt=0;
		  LED3_Toggle(); //LED3引脚输出电平翻转
	  }
	}
}

2)、HRTIM.h如下:

#ifndef __HRTIM_H__
#define __HRTIM_H__

#include "stm32g4xx_hal.h"
//#include "main.h"

#define HRTIM_INPUT_CLOCK   170000000  //HRTIM的输入时钟频率为170MHz

#define TIM_MASTER_FREQ     200000     //HRTIM主定时器中断频率为200KHz,周期为5us
#define MASTER_PERIOD ((uint16_t)(((uint64_t)HRTIM_INPUT_CLOCK * 32) / TIM_MASTER_FREQ))
//HRTIM主定时器周期:170000000*32/200000=27200,配置HRTIM主定时器中断频率为200KHz
//HRTIM主定时器计数器输入时钟频率:170000000*32=5440000000Hz=5.440GHz
//HRTIM主定时器计数器输入时钟周期:1/(170000000*32)=0.1838235294117647纳秒=183.8235294117647皮秒

#define TIM_A_FREQ     100000     //HRTIM定时器A中断频率为100KHz,周期为10us
#define TIM_A_PERIOD ((uint16_t)(((uint64_t)HRTIM_INPUT_CLOCK * 32) / TIM_A_FREQ))
//HRTIM主定时器周期:170000000*32/200000=54400,配置HRTIM主定时器中断频率为100KHz

#define TIM_B_FREQ     500000     //HRTIM定时器B中断频率为500KHz,周期为2us
#define TIM_B_PERIOD ((uint16_t)(((uint64_t)HRTIM_INPUT_CLOCK * 32) / TIM_B_FREQ))
//HRTIM主定时器周期:170000000*32/500000=1088,配置HRTIM主定时器中断频率为100KHz

extern void HRTIM_Init(void);

#endif /* __HRTIM_H */

3)、LED.c如下

#include "LED.h"

void LED_Init(void);

//函数功能:配置PC13为输出,无上拉或下拉,输出速度为5MHz
void LED_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  __HAL_RCC_GPIOC_CLK_ENABLE();                   //GPIOC时钟使能

  GPIO_InitStruct.Pin = GPIO_PIN_13;              //选择引脚号码
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;     //推挽输出模式
	GPIO_InitStruct.Pull = GPIO_NOPULL;             //引脚上拉和下拉都没有被激活
//	GPIO_InitStruct.Pull = GPIO_PULLUP;           //设置上拉
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;    //引脚的输出速度为5MHz
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
	//根据GPIO_InitStruct结构变量指定的参数初始化GPIOC的外设寄存器

	LED1_Off();

  __HAL_RCC_GPIOB_CLK_ENABLE(); //使能PB端口的时钟
  GPIO_InitStruct.Pin = GPIO_PIN_15;              //选择引脚号码
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;     //推挽输出模式
  GPIO_InitStruct.Pull = GPIO_PULLUP;             //设置上拉
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;    //引脚的输出速度为5MHz
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
	LED2_Off();

  __HAL_RCC_GPIOA_CLK_ENABLE(); //使能PA端口的时钟
  GPIO_InitStruct.Pin = GPIO_PIN_0;              //选择引脚号码
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;     //推挽输出模式
  GPIO_InitStruct.Pull = GPIO_PULLUP;             //设置上拉
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;    //引脚的输出速度为5MHz
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	LED3_Off();
}

4)、LED.h如下

#ifndef __LED_H__
#define __LED_H__

#include "stm32g4xx_hal.h"

#define LED1_On()      HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET)  //输出低电平开灯
#define LED1_Off()     HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET)    //输出高电平关灯
#define LED1_Toggle()  HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13)                //LED1引脚输出电平翻转

#define LED2_On()      HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_RESET)  //输出低电平开灯
#define LED2_Off()     HAL_GPIO_WritePin(GPIOB,GPIO_PIN_15,GPIO_PIN_SET)    //输出高电平关灯
#define LED2_Toggle()  HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_15)                //LED2引脚输出电平翻转

#define LED3_On()      HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_RESET)  //输出低电平开灯
#define LED3_Off()     HAL_GPIO_WritePin(GPIOA,GPIO_PIN_0,GPIO_PIN_SET)    //输出高电平关灯
#define LED3_Toggle()  HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_0)                //LED3引脚输出电平翻转
extern void LED_Init(void);

#endif /*__ GPIO_H__ */

3、测试结果

经过测试, 发现主定时器,定时器A和定时器B,在用作时基定时器时,它们是独立工作的,由此可知,定时器C,定时器D,定时器E和定时器F也是可以独立工作的。

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

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

相关文章

九泰智库 | 医械周刊- Vol.51

⚖️ 法规动态 白内障人工晶体类医用耗材集采落地,平均降幅60% 湖北省自7月10日起实施人工晶体类医用耗材集中带量采购政策,中选产品平均降幅达60%,显著减轻了患者经济负担。此举是国家组织医用耗材采购的一部分,旨在通过集中采购…

MES软件实施:解锁企业数字化转型的无限潜能

MES(制造执行系统)软件实施是企业数字化转型的重要一环,它确实能够解锁企业数字化转型的无限潜能。以下是对这一主题的详细分析: 一、MES软件的核心价值 集成与协同: MES软件能够集成企业内的各种生产数据和设备&…

企业市值排名3D可视化,重塑商业版图新维度

在这个数据驱动的时代,每一个数字背后都蕴藏着无限的可能与机遇。企业市值,作为衡量企业综合实力与市场认可度的关键指标,其动态变化不仅是投资者关注的焦点,也是全球商业竞争格局的晴雨表。 当枯燥的数据表格被转化为生动的3D场景…

如何选择需求跟踪管理软件?8款优质推荐

本文将介绍8款需求跟踪管理软件:PingCode、Worktile、得帆、协作云、火山引擎、Jira、VersionOne、YouTrack。 在面对众多需求跟踪管理软件时,每款软件都声称能提升效率、简化流程,但到底哪一款才真正适合你的团队?为了选择合适的…

Hadoop的概念

1.什么是大数据 数据体量巨大:数据量规模庞大,通常以PB(拍字节)或EB(艾字节)来衡量,远远超出了传统数据库和数据处理工具的处理能力。数据类型多样:大数据包括结构化数据、半结构化…

在控件graphicsView中实现绘图功能(二)

目录 前言:基础夯实:1.创建 QGraphicsScene 和 QGraphicsView2. 在 QGraphicsScene 中添加椭圆3. 渲染和显示4. 推荐学习本文之前查看的链接: 效果展示:实现功能:遇到问题:核心代码:仓库源码&am…

windows环境基于python 实现微信公众号文章推送

材料: 1、python 2.7 或者 python3.x 2、windows 可以通过 “python -m pip --version” 查看当前的pip 版本 E:\Downloads\newsInfo>python -m pip --version pip 20.3.4 from C:\Python27\lib\site-packages\pip (python 2.7) 3、windows 系统 制作&#xf…

基于STM32开发的智能家居安防系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化传感器数据采集与处理安防控制与报警机制Wi-Fi通信与远程监控应用场景 家庭安防系统办公室与商铺的安全监控常见问题及解决方案 常见问题解决方案结论 1. 引言 随着智能家居技术的…

【Hot100】LeetCode—226. 翻转二叉树

目录 1- 思路Queue 队列实现层序遍历 交换左右 2- 实现⭐226. 翻转二叉树——题解思路 3- ACM 实现 原题连接:226. 翻转二叉树 1- 思路 Queue 队列实现层序遍历 交换左右 1- 借助 Queue 实现层序遍历2- 实现左右交换方式 2- 实现 ⭐226. 翻转二叉树——题解思…

带你玩转小程序推广,实现短链接一键跳转

不知道各位有没有想过,短链接直接跳转到微信小程序到底该怎么操作呢?掌握这个小技能,能让你的推广效率大幅提升哦。今天就给大家分享一个全新方法,教你如何从短链接直接跳转到微信小程序,实现高效的一键式跨越。 一、…

源代码怎么进行加密?2024年10款源代码加密软件推荐

在软件开发中,源代码是企业的核心资产,其安全性直接关系到企业的竞争力和商业机密。为了防止源代码被未授权访问、复制或篡改,源代码加密成为了一种常见的安全措施。2024年,随着技术的发展,市场上出现了多种源代码加密…

笔记-系统规划与管理师-案例题-2023年-服务运营管理

【说明】 小李是跨国公司新任命的IT服务经理,帮助提升中国区总部的IT服务管理水平。中国区总部的运维管理体系运营了近三年,内外部环境发生了很多变化,其中: (1)内部变化包括团队组织结构调整、部分团队精简改为外包支…

纯前端导出excel插件pikaz-excel-js使用小结

最近项目有多个报表开发并前端导出为excel的需求,第一张报表用的是pikaz-excel-js插件,git地址为https://github.com/pikaz-18/pikaz-excel-js,网上文档虽然多,但很多都很基础,官方文档介绍也很简单,没有很…

搜维尔科技:‌Manus VR手套通过触觉反馈技术与机器人进行互动

‌Manus VR手套通过触觉反馈技术与机器人进行互动。‌这种技术允许用户通过手套与机器人进行复杂的动作遥操作和训练,使得用户能够通过手套的动作来控制机器人的运动,同时机器人执行的动作也可以通过手套的触觉反馈功能传达给用户,使用户能够…

线索分析2个要点分析:营销归因与市场ROI转化效果评估

1、营销归因 在复杂的大数据时代,消费者能接触的渠道、设备越来越多,营销活动分析也变得越来越复杂。 在当前的营销环境中,了解并优化营销策略是至关重要的。一个关键的部分是通过分析不同营销活动如何促成商机并赢得订单。而要实现这一目标…

秸秆焚烧自动监测摄像机

秸秆焚烧是一种常见的农业废弃物处理方式,但同时也会产生大量的空气污染物,对环境和人类健康造成威胁。为了监测和控制秸秆焚烧的情况,可以使用秸秆焚烧自动监测摄像机。秸秆焚烧自动监测摄像机 是一种结合了人工智能和机器视觉技术的智能设备…

Linux入门——04 gbd git

gbd命令行调试 默认情况下,GDB无法对现在发布的程序进行调试 debug(能调试)&&release(不能调试) linux下GCC或G生成软件默认是release的! 1.debug模式 gcc -o mytest mytest.c -g 文件的体积不…

STM32学习记录-04-EXTI外部中断

1 中断系统 (1)中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续…

在尝试了市面上90%的报表工具后,终于找到了这款免费万能的报表工具!

经常有朋友私信问我有“哪个报表工具好用易上手?”或者是“有哪些适合绝大多数普通职场人的万能报表工具?”等问题。 在这里我总结出大家在报表选择时最在意的三个要点。 一、挑选报表工具的重点 1)低门槛上手难度:理想中的报表…

解密《黑神话:悟空》脚本

本文部分参考来自于:john 《黑神话:悟空》这游戏昨天上线了,我第一时间就下载玩了。玩的时候我就挺好奇他们是怎么写的程序,毕竟这么大的游戏项目肯定不会只用C一种语言来写。所以我解压了游戏文件,看看里面有…