STM32系列定时器

STM32 HAL库基于F103系列之高级定时器 HAL_TIM_PWM_MspInit() 配置NVIC、CLOCK、GPIO等。定时器1通道1映射在PE8引脚上,互补输出映射在PE9引脚上,刹车功能映射在PE15上。通过定时器1通道1输出频率为1KHz,占空比为70%的PWM,使用PWM模式1。将PWM输入到定时器8通道1(PC6),测量PWM的频率/周期、占空比等信息。1,确定PWM波的周期/频率 1KHz为例,PSC=71,ARR=999。2,以4.5.2小节的H桥为例,配置通道输出极性以及互补输出极性。通道输出极性为:高电平有效。 阅读详情

SysTick滴答定时器

  • 滴答定时器介绍
    SysTick滴答定时器是一个24 位的递减计数器,支持中断,SysTick 定时器被捆绑在 NVIC 中,用于产生 SYSTICK 异常(异常号:15)
  • 滴答定时器时钟源的选择函数
void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  /* Check the parameters */
  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }
}
  • 滴答定时器的配置
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
/* Reload value impossible */
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1);
SysTick->LOAD = ticks - 1; /* set reload register */
/* set Priority for Systick Interrupt */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);//优先级设置为15(系统最低优先级)
/* Load the SysTick Counter Value */
SysTick->VAL = 0;
/* Enable SysTick IRQ and SysTick Timer */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk;
/* Function successful */
return (0);
}
  • 配置SysTick中断,并初始化软件定时器变量
void bsp_InitTimer(void)
{
	uint8_t i;
	/*清零所有的软件定时器 */
	for (i = 0; i < TMR_COUNT; i++)
	{
		s_tTmr[i].Count = 0;
		s_tTmr[i].PreLoad = 0;
		s_tTmr[i].Flag = 0;
		s_tTmr[i].Mode = TMR_ONCE_MODE;	/* ȱʡÊÇ1´ÎÐÔ¹¤×÷ģʽ */
	}
		/*配置systick中断周期为1ms,并启动systick中断
    	SystemCoreClock 是固件库定义的系统内核时钟,对于STM32F4XX,一般为 168MHz
    	SysTick_Config()函数的形参表示内核时钟多少个周期后触发一次Systick定时中断
	  	-- SystemCoreClock / 1000  表示定时频率为1000HZ,定时周期为1ms
	    -- SystemCoreClock / 500   表示定时频率为500HZ,定时周期为2ms
	    -- SystemCoreClock / 2000  表示定时频率为2000HZ,定时周期为500us   */
	SysTick_Config(SystemCoreClock / 1000);
//	bsp_InitHardTimer();	/*开启硬件定时中断 */
}

软件定时器

  • 启动自动定时器
void bsp_StartAutoTimer(uint8_t _id, uint32_t _period)
{
	if (_id >= TMR_COUNT)
	{
		/* 打印出错的源代码文件名、函数名称 */
		BSP_Printf("Error: file %s, function %s()\r\n", __FILE__, __FUNCTION__);
		while(1); /* 参数异常,死机等待看门狗复位 */
	}
	DISABLE_INT(); /* 关中断 */
	s_tTmr[_id].Count = _period;  /* 实时计数器初值 */
	s_tTmr[_id].PreLoad = _period;  /* 计数器自动重装值,仅自动模式起作用 */
	s_tTmr[_id].Flag = 0; /* 定时时间到标志 */
	s_tTmr[_id].Mode = TMR_AUTO_MODE;  /* 自动工作模式 */
	ENABLE_INT(); /* 开中断 */
}
  • 函数递减计数器
/******************************************************************************
*  函 数 名: bsp_SoftTimerDec
*  功能说明: 每隔1ms对所有定时器变量减1。必须被SysTick_ISR周期性调用。
*  形 参: _tmr : 定时器变量指针
*  返 回 值: 无
******************************************************************************/
static void bsp_SoftTimerDec(SOFT_TMR *_tmr)
{
	if (_tmr->Count > 0)
	{
	/* 如果定时器变量减到1则设置定时器到达标志 */
		if (--_tmr->Count == 0)
		{
			_tmr->Flag = 1;
			/* 如果是自动模式,则自动重装计数器 */
			if(_tmr->Mode == TMR_AUTO_MODE)
			{
				_tmr->Count = _tmr->PreLoad;
			}
		}
	}
}
  • 超时检测函数
uint8_t bsp_CheckTimer(uint8_t _id)
	{
		if (_id >= TMR_COUNT)
		{
			return 0;
		}
		if (s_tTmr[_id].Flag == 1)
		{
			s_tTmr[_id].Flag = 0;
			return 1;
		}
		else
		{
			return 0;
	}
}
  • 停止软件定时器
void bsp_StopTimer(uint8_t _id)
{
	if (_id >= TMR_COUNT)
	{
	/* 打印出错的源代码文件名、函数名称 */
		BSP_Printf("Error: file %s, function %s()\r\n", __FILE__, 	__FUNCTION__);
		while(1); /* 参数异常,死机等待看门狗复位 */
	}
	DISABLE_INT(); /* 关中断 */
	s_tTmr[_id].Count = 0; /* 实时计数器初值 */
	s_tTmr[_id].Flag = 0; /* 定时时间到标志 */
	s_tTmr[_id].Mode = TMR_ONCE_MODE;  /* 自动工作模式 */
	ENABLE_INT(); /* 开中断 */
}

定时器中断

  • 控制寄存器1(TIMx_CR1)在这里插入图片描述

  • 自动重装载寄存器(TIMx_ARR)
    在这里插入图片描述
    该寄存器在物理上实际对应着 2 个寄存器:
    当TIMx_CR1中APRE=0 时,预装载寄存器的内容可以随时传送到影子寄存器,此时 2 个寄存器是连通的;
    当TIMx_CR1中APRE=1 时,在每一次更新事件(UEV)时,才把预装在寄存器的内容传送到影子寄存器。

  • DMA/中断使能寄存器(TIMx_DIER)
    在这里插入图片描述

  • 预分频寄存器(TIMx_PSC)—该寄存器用设置对时钟进行分频,然后提供给计数器,作为计数器的时钟。
    在这里插入图片描述

  • 状态寄存器(TIMx_SR)—该寄存器用来标记当前与定时器相关的各种事件/中断是否发生
    在这里插入图片描述

  • 初始化

void TIM3_Int_Init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<1;  //TIM3 时钟使能
	TIM3->ARR=arr; //设定计数器自动重装值//刚好 1ms
	TIM3->PSC=psc; //预分频器 7200,得到 10Khz 的计数时钟
	TIM3->DIER|=1<<0; //允许更新中断 
	TIM3->CR1|=0x01; //使能定时器 3
	MY_NVIC_Init(1,3,TIM3_IRQn,2);//抢占 1,子优先级 3,组 2 
} 
  • 定时器中断服务
void TIM3_IRQHandler(void)
{
	if(TIM3->SR&0X0001) //溢出中断
	{
	
	} 
	TIM3->SR&=~(1<<0); //清除中断标志位
}

PWM

  • 简介
    STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出。
  • 捕获/比较模式寄存器(TIMx_CCMR1/2)
    TIMx_CCMR1 控制 CH1(低八位) 和 2(高八位),而 TIMx_CCMR2 控制 CH3 和 4
    在这里插入图片描述
    位OCxM可配置成7种模式,PWM模式对应的设置为 110/111。
    位CCxS 用于设置通道的方向(输入/输出)。
  • 捕获/比较使能寄存器(TIMx_CCER)—控制着各个输入输出通道的开关
    在这里插入图片描述
  • TIMx_BDTR
    高级定时器要想输出 PWM,必须还要设置一个MOE 位(TIMx_BDTR 的第 15 位),以使能主输出,否则不会输出 PWM。
  • 初始化
void TIM3_PWM_Init(u16 arr,u16 psc)
{ 	
	//arr:自动重装值		psc:时钟预分频数
	RCC->APB1ENR|=1<<1; 	//TIM3 时钟使能
	RCC->APB2ENR|=1<<3; 	//使能 PORTB 时钟 
	GPIOB->CRL&=0XFF0FFFFF; //PB5 输出
	GPIOB->CRL|=0X00B00000; //复用功能输出
	RCC->APB2ENR|=1<<0; 	//开启辅助时钟 
	AFIO->MAPR&=0XFFFFF3FF; //清除 MAPR 的[11:10]
	AFIO->MAPR|=1<<11; 		//部分重映像,TIM3_CH2->PB5
	TIM3->ARR=arr; 			//设定计数器自动重装值
	TIM3->PSC=psc; 			//预分频器不分频
	TIM3->CCMR1|=7<<12;//CH2 PWM2 模式
	TIM3->CCMR1|=1<<11;//CH2 预装载使能
	TIM3->CCER|=1<<4;  //OC2 输出使能 
	TIM3->CR1=0x0080;  //ARPE 使能
	TIM3->CR1|=0x01;   //使能定时器 3
}

输入捕获

在这里插入图片描述
STM32F1 的定时器除了 TIM6 和 TIM7都具有输入捕获功能。
STM32F1 的输入捕获,简单的说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA 等。

  • TIMx_CCMR1 [7:0]位详细描述在这里插入图片描述
  • TIMx_CCER 最低 2 位描述
    在这里插入图片描述
  • 捕获/比较寄存器(TIMx_CCR1~4)。
    在这里插入图片描述
    该寄存器用来存储捕获发生时,TIMx_CNT的值,我们从 TIMx_CCR1 就可以读出通道 1 捕获发生时刻的 TIMx_CNT 值,通过两次捕获(一次上升沿捕获,一次下降沿捕获)的差值,就可以计算出高电平脉冲的宽度。
  • 捕获高电平脉宽的思路
    首先,设置 TIM5_CH1 捕获上升沿,这在TIM5_Cap_Init 函数执行的时候就设置好了,然后等待上升沿中断到来,当捕获到上升沿中断,此时如果 TIM5CH1_CAPTURE_STA 的第 6 位为 0,则表示还没有捕获到新的上升沿,就先把TIM5CH1_CAPTURE_STA、TIM5CH1_CAPTURE_VAL 和 TIM5->CNT 等清零,然后再设置IM5CH1_CAPTURE_STA 的第 6 位为 1,标记捕获到高平,最后设置为下降沿捕获,等待下降沿到来。如果等待下降沿到来期间,定时器发生了溢出,就在 TIM5CH1_CAPTURE_STA里面对溢出次数进行计数,当最大溢出次数来到的时候,就强制标记捕获完成(虽然此时还没有捕获到下降沿)。当下降沿到来的时候,先设置 TIM5CH1_CAPTURE_STA 的第 7 位为 1,标记成功捕获一次高电平,然后读取此时的定时器值到 TIM5CH1_CAPTURE_VAL 里面,最后设置为上升沿捕获,回到初始状态。这样就完成了一次高电平捕获。
  • 定时器 5 通道 1 输入捕获库函数配置
TIM_ICInitTypeDef TIM5_ICInitStructure;
void TIM5_Cap_Init(u16 arr,u16 psc)
{ 
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //①使能 TIM5 时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //①使能 GPIOA 时钟
	//初始化 GPIOA.0 ①
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //PA0 设置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PA0 输入
	GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化 GPIOA.0
	GPIO_ResetBits(GPIOA,GPIO_Pin_0);  //PA0 下拉
	//②初始化 TIM5 参数
	TIM_TimeBaseStructure.TIM_Period = arr; //设定计数器自动重装值
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //预分频器
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM 向上计数模式
	TIM_TimeBaseInit(TIM5, &TIM_TimeBaseStructure); //初始化 TIMx
	//③初始化 TIM5 输入捕获通道 1
	TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //选择输入端 IC1 映射到 TI1 上
	TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //上升沿捕获
	TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到 TI1 上
	TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //配置输入分频,不分频
	TIM5_ICInitStructure.TIM_ICFilter = 0x00; //IC1F=0000 配置输入滤波器 不滤波
	TIM_ICInit(TIM5, &TIM5_ICInitStructure); //初始化 TIM5 输入捕获通道 1
	//⑤初始化 NVIC 中断优先级分组
	NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn; //TIM3 中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //先占优先级 2 级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //从优先级 0 级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能
	NVIC_Init(&NVIC_InitStructure); //初始化 NVIC
	TIM_ITConfig( TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//④允许更新中断捕获中断
	TIM_Cmd(TIM5,ENABLE ); //⑥使能定时器 5
}

u8 TIM5CH1_CAPTURE_STA=0;  //自定义输入捕获状态
u16 TIM5CH1_CAPTURE_VAL; //输入捕获值
//⑤定时器 5 中断服务程序
void TIM5_IRQHandler(void)
{
	if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获
	{ 
		if (TIM_GetITStatus(TIM5, TIM_IT_Update) != RESET)
		{ 
			if(TIM5CH1_CAPTURE_STA&0X40) //已经捕获到高电平了
			{
				if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
				{
					TIM5CH1_CAPTURE_STA|=0X80; //标记成功捕获了一次
					TIM5CH1_CAPTURE_VAL=0XFFFF;
				}else TIM5CH1_CAPTURE_STA++;
			} 
		}
    if (TIM_GetITStatus(TIM5, TIM_IT_CC1) != RESET) //捕获 1 发生捕获事件
	{ 
		if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
		{ 
			TIM5CH1_CAPTURE_STA|=0X80;  //标记成功捕获到一次上升沿
			TIM5CH1_CAPTURE_VAL=TIM_GetCapture1(TIM5);
			TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Rising); //设置为上升沿捕获(修改输入捕获通道1的极性)
		}else //还未开始,第一次捕获上升沿
		{
			TIM5CH1_CAPTURE_STA=0;  //清空
			TIM5CH1_CAPTURE_VAL=0;
			TIM_SetCounter(TIM5,0); //设置计数器寄存器值
			TIM5CH1_CAPTURE_STA|=0X40;  //标记捕获到了上升沿
			TIM_OC1PolarityConfig(TIM5,TIM_ICPolarity_Falling); //设置为下降沿捕获
		} 
	 } 
 }
	TIM_ClearITPendingBit(TIM5, TIM_IT_CC1|TIM_IT_Update); //清除中断标志位
}

Note:TIM5CH1_CAPTURE_STA,是用来记录捕获状态,本身就是个变量,只是我们把它当成一个寄存器那样来使用)。TIM5CH1_CAPTURE_STA 各位描述如图所示:
在这里插入图片描述

  • 定时器 5 通道 1 输入捕获寄存器操作配置
void TIM5_Cap_Init(u16 arr,u16 psc)
{ 
	RCC->APB1ENR|=1<<3; //TIM5 时钟使能
	RCC->APB2ENR|=1<<2; //使能 PORTA 时钟
	GPIOA->CRL&=0XFFFFFFF0; //PA0 清除之前设置
	GPIOA->CRL|=0X00000008;  //PA0 输入
	GPIOA->ODR|=0<<0; //PA0 下拉 
	TIM5->ARR=arr; //设定计数器自动重装值
	TIM5->PSC=psc; //预分频器
	TIM5->CCMR1|=1<<0; //CC1S=01 选择输入端 IC1 映射到 TI1 上
	TIM5->CCMR1|=0<<4; //IC1F=0000 配置输入滤波器 不滤波
	TIM5->CCMR1|=0<<10; //IC2PS=00 配置输入分频,不分频
	TIM5->CCER|=0<<1; //CC1P=0  上升沿捕获
	TIM5->CCER|=1<<0; //CC1E=1 允许捕获计数器的值到捕获寄存器中
	TIM5->DIER|=1<<1; //允许捕获中断 
	TIM5->DIER|=1<<0; //允许更新中断 
	TIM5->CR1|=0x01; //使能定时器 2
	MY_NVIC_Init(2,0,TIM5_IRQn,2);//抢占 2,子优先级 0,组 2 
}
u8 TIM5CH1_CAPTURE_STA=0;  //输入捕获状态 
u16 TIM5CH1_CAPTURE_VAL; //输入捕获值
//定时器 5 中断服务程序 
void TIM5_IRQHandler(void)
{
	u16 tsr;
	tsr=TIM5->SR;
	if((TIM5CH1_CAPTURE_STA&0X80)==0)//还未成功捕获 
	{
		if(tsr&0X01)//溢出
		{ 
			if(TIM5CH1_CAPTURE_STA&0X40)//已经捕获到高电平了
			{
				if((TIM5CH1_CAPTURE_STA&0X3F)==0X3F)//高电平太长了
				{
					TIM5CH1_CAPTURE_STA|=0X80;//标记成功捕获了一次
					TIM5CH1_CAPTURE_VAL=0XFFFF;
				}else TIM5CH1_CAPTURE_STA++;
			} 
		 }
		if(tsr&0x02)//捕获 1 发生捕获事件
		{ 
			if(TIM5CH1_CAPTURE_STA&0X40) //捕获到一个下降沿
			{ 
				TIM5CH1_CAPTURE_STA|=0X80;  //标记成功捕获到一次高电平脉宽
				TIM5CH1_CAPTURE_VAL=TIM5->CCR1;//获取当前的捕获值.
				TIM5->CCER&=~(1<<1);  //CC1P=0 设置为上升沿捕获
			}else //还未开始,第一次捕获上升沿
			{
				TIM5CH1_CAPTURE_STA=0;  //清空
				TIM5CH1_CAPTURE_VAL=0;
				TIM5CH1_CAPTURE_STA|=0X40;  //标记捕获到了上升沿
				TIM5->CNT=0;  //计数器清空
				TIM5->CCER|=1<<1; //CC1P=1 设置为下降沿捕获
			} 
		} 
	}
	TIM5->SR=0;//清除中断标志位
}
  • 编码器转动速度
    定时器有些通道具有AB正交解码功能
static void Encoder_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_ICInitTypeDef TIM_ICInitStructure;   	
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO , ENABLE);
	GPIO_PinRemapConfig(GPIO_Remap_TIM4,ENABLE );//重映射
/*
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	// 正交编码器输入引脚  PB->6   PB->7 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;         
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);                           
*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);
	// 正交编码器映射引脚 PD->12   PD->13 
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;         
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOD, &GPIO_InitStructure);   
	
	/*- TIM4编码器模式配置 -*/
	TIM_DeInit(TIM4);
	TIM_TimeBaseStructure.TIM_Period = 60000;									//设定计数器重装载值
	TIM_TimeBaseStructure.TIM_Prescaler = 0;								//50Hz采样编码
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
  
	TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising ,TIM_ICPolarity_Rising);	//配置编码器模式触发源和极性
	TIM_ICStructInit(&TIM_ICInitStructure);																																//配置滤波器
	TIM_ICInitStructure.TIM_ICFilter = 6;
	TIM_ICInit(TIM4, &TIM_ICInitStructure);

	TIM4->CNT = 0;
	TIM_ClearFlag(TIM4, TIM_FLAG_Update);
	TIM_Cmd(TIM4, ENABLE);   //启动TIM4定时器
}
encoder_dcar = TIM4->CNT;
TIM4->CNT = 0;
SENSOR_DATA.encoder_delta_car += (encoder_dcar > 30000)?(encoder_dcar-60000):encoder_dcar;		//正交解码
STM32CubeMX系列教程3:基本定时器中断 文章目录摘要配置工程配置定时器参数使能定时器配置定时器参数开启定时器中断生成工程编写用户程序编写中断回调函数启动定时器编译下载程序 摘要   本章讲解STM32基本定时器中断的使用方法,实现通过定时器中断,定时500毫秒,让LED灯的状态每隔500ms改变一次。本章的工程可以从前一章节的工程中复制修改完成。 配置工程   复制 STM32CubeMX系列教程0:创建工程 创建的工程目录GPIO_test,修改文件目录名称为TIM,双击打开GPIO_test.ioc。 配置定时器参数 使能定时器 打开Stm3 阅读详情

相关推荐

STMicroelectronics 系列:STM32L5 系列_(8).STM32L5系列定时器应用

通过上述示例代码,我们可以看到STM32L5系列定时器在多种应用场景中的配置和使用方法。定时器的灵活性和强大的功能使其成为微控制器开发中不可或缺的外设之一。无论是简单的定时任务、PWM生成、输入捕获、输出比较,还是复杂的同步操作和低功耗应用,STM32L5系列定时器都能提供高效和可靠的解决方案。希望这些示例代码能帮助你更好地理解和使用STM32L5系列定时器。

2401_87715305的博客 1194

STM32L0系列之【LPTIM定时器】

上一章:STM32L0系列之【串口收发】

wang 恒 的博客 1万+

STMicroelectronics 系列:STM32L1 系列_(8).STM32L1系列定时器应用

STM32L1系列微控制器提供了多种定时器类型,每种定时器都有其特定的功能和应用场景。基本定时器(TIM6和TIM7)适用于简单的延时和定时中断功能;通用定时器(如TIM2、TIM3等)可以用于生成PWM信号、捕获外部信号等;高级定时器(如TIM1、TIM8)则提供了更复杂的功能,如互补输出、死区时间控制等,适用于高级应用,如电机控制和同步控制。通过合理配置定时器,可以实现各种时间相关的功能,提高系统的效率和可靠性。希望本文档对理解和使用STM32L1系列定时器有所帮助。

2401_87715305的博客 924

stm32学习笔记 F1系列通用定时器

*****定时器种类***********位数*******计数器模式*******产生DMA请求**捕获/比较通道**互补输出***特殊应用场景 高级定时器(TIM1,TIM8)***16***向上,向下,向上/下******可以************4***************有*****带死区控制盒紧急刹车,可应用于PWM电机控制 通用定时器(TIM2~TIM5)**16***向上

Wu_Yimin的博客 2669

STMicroelectronics 系列:STM32G0 系列_(10).STM32G0系列的定时器功能

STM32G0系列单片机提供了多种类型的定时器,包括基本定时器、通用定时器和高级定时器。每种定时器都有其特定的应用场景和功能特性。通过合理配置定时器,可以实现定时中断、PWM信号生成、外部事件捕捉和定时器同步等多种功能。希望本节的内容对理解和使用STM32G0系列单片机的定时器有所帮助。

2401_87715305的博客 1239

STMicroelectronics 系列:STM32G4 系列_(4).STM32G4系列定时器详解

STM32G4 系列微控制器提供了多种定时器,每种定时器都有其独特的特点和应用场景。基本定时器适用于简单的时间延迟和周期性任务控制,通用定时器功能丰富,适用于 PWM 生成、输入捕获和死区时间控制等复杂应用,高级定时器专为电机控制设计,支持互补 PWM 和死区时间设置,低功耗定时器在低功耗模式下仍能保持运行,适合需要节能的应用。通过合理配置这些定时器,可以实现高效、精准的时间控制功能。希望本篇文章对理解和使用 STM32G4 系列定时器有所帮助。

2401_87715305的博客 1183

STM32定时器详解(一)系统滴答定时器做延时函数(STM32U5系列为例)(配合cubeMX)

秋招找工作终于告一段落了,看着拖延大半时间的毕设,觉得有必要加班加点赶一赶进度了,苦于毕设用到的STM32U5系列芯片资料还比较少,这里趁着毕设有用到此芯片为主控单元,也记录一下芯片的各个模块开发历程,作为经验备份及分享~STM32U5系列MCU中定时器的概述及详解一份STM32U575包括2个高级控制定时器、多达7个通用定时器、2个基本定时器、4个低功耗定时器、2个看门狗定时器和2个SysTick定时器。下面的表格比较了高级控制、通用定时器和基本定时器的特点:图1。

duanduanduancsdn的博客 2083

STMicroelectronics 系列:STM32F7 系列_(10).STM32F7系列定时器详解

基本定时器TIM6和TIM7主要用于产生定时中断,不支持输入捕获和输出比较功能。它们的工作原理相对简单,适用于简单的定时任务。通用定时器TIM2、TIM3、TIM4和TIM5支持多种功能,包括定时中断、输入捕获、输出比较和PWM生成。这些定时器具有更高的灵活性,适用于需要精确控制时间的应用场景。高级定时器TIM1和TIM8支持更多的功能,包括死区控制、互补输出、同步功能等。这些定时器适用于复杂的控制任务,如逆变器控制、电机驱动等。它们的工作原理和配置过程相对复杂,但提供了更高的灵活性和控制能力。

2401_87715305的博客 975

STM32定时器系列 - STM32定时器输出比较

STM32 定时器除了基本计数定时功能外,还对外扩展了输入、输出通道,从而可以实现输入捕获、比较输出功能。 比较输出[Compare Output]功能:定时器通过对预设的比较值与定时器的值做匹配比较之后,并依据相应的输出模式从而实现各类输出。如PWM输出、电平翻转、单脉冲模式、强制输出等。一般来说,STM32的通用定时器和高级定时器都具有比较输出功能,不同的定时器可能通道数量上有差异。 或者,我们可以使用比较输出功能来感知或提示某个时间段已经过去了。因为比较输出的基本特征是计数器CNT的值与比较寄存器CC

暖暖_的_纠结的博客 1万+

STMicroelectronics 系列:STM32H7 系列_(8).STM32H7系列定时器与计数器

STM32H7系列单片机提供了多种定时器,每种定时器都有其特定的应用场景和功能。基本定时器适用于简单的定时任务,通用定时器支持更复杂的输入输出操作,而高级定时器则用于需要多通道PWM、死区插入等复杂功能的应用。通过合理配置定时器和GPIO,可以实现各种实时控制和测量任务。

2401_87715305的博客 807

STMicroelectronics 系列:STM32L4 系列_(16).STM32L4系列的定时器和计数器

定时器是嵌入式系统中非常重要的组件之一,用于生成时间间隔、测量时间、产生波形等。STM32L4系列微控制器提供了多种定时器,包括基本定时器、通用定时器和高级定时器。这些定时器具有丰富的功能和灵活的配置选项,能够满足各种应用需求。

2401_87715305的博客 1104

stm32无源蜂鸣器定时器_STM32入门系列教程之定时器与蜂鸣器的详细说明

前一期教程已经详细讲述了STM32 中断编程,本来不想再讲述定时器。因为定时器自然也是用到中断处理。但一想,既然作为入门系列教程,就应该具备完整性。实际上,笔者在网上搜了一下,发现仍然有许多网友卡在定时器这里,因此有必要专门列出一期教程讲述定时器。一、STM32通用定时器原理STM32 系列的CPU,有多达8 个定时器,其中TIM1 和TIM8 是能够产生三对PWM 互补输出的高级定时器,常用于三...

weixin_33952775的博客 869

MATLAB仿真耗散孤子共振与金兹堡-朗道方程解析

耗散孤子共振(DSR)是非线性光学中的特殊脉冲现象,通过平衡非线性效应、色散与能量耗散实现稳定传输。其核心数学模型金兹堡-朗道方程(GLE)描述了光脉冲在增益介质中的演化规律,采用分步傅里叶方法(SSFM)可高效求解这类非线性偏微分方程。该技术在光纤激光器设计、高速光通信系统优化等领域具有重要价值,特别是在需要高能量脉冲保持稳定传输的场景。MATLAB数值仿真为理解DSR物理机制提供了直观工具,通过参数扫描可验证脉冲能量与宽度的线性关系特征,并为实际器件设计提供预测依据。

weixin_31240035的博客 257

stm32中断源有哪些_【话说定时器系列】:STM32定时器有哪些?

STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍。去年,电堂推出了《STM32 TIMER基础及常规应用介绍》,为大家梳理了 STM32 TIMER 的庞大内容,涵盖 TIMER 的基本应用原理、常规应用等。现在将课程内容整理为文章,针对STM32定时器有基本了解的用户,分享具体的应用实现环节及常见问题解决。STM32 定时器有哪些?STM32家族的定时器众多,可大致分为...

weixin_39710249的博客 1133

PyTorch多机训练Loss不一致问题排查指南:基于算子级一致性验证

比较二次训练过程中所有算子的误差,定位存在一致性问题的pytorch算子

Hi20240217的博客 1158

Chapter2、HDR流水线

HDR内容的获取(不同曝光时间的图片合成) 相机响应函数 HDR视频

qq_55621259的博客 2597

stm32单片机实现多个闹钟_基于STM32F103系列单片机的11个定时器解析

STM32F103系列的单片机一共有11个定时器,其中:2个高级定时器4个普通定时器2个基本定时器2个看门狗定时器1个系统嘀嗒定时器除去看门狗定时器和系统滴答定时器的八个定时器列表;8个定时器分成3个组;TIM1和TIM8是高级定时器TIM2-TIM5是通用定时器TIM6和TIM7是基本的定时器这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下...

weixin_33886150的博客 1663

最优化方法 25:PDHG

前面的章节要么从原始问题出发,要么从对偶问题出发,通过求解近似点或者一个子优化问题进行迭代,而且推导过程中我们发现根据问题的参数特征,比如矩阵 AAA 是瘦高型的还是矮胖型的,采用对偶和原始问题的复杂度会不一样,可以选择一个更简单的。而这一节,我们将要从原始对偶问题出发来优化,什么是原始对偶问题呢?就是原始优化变量和对偶优化变量(原始函数和共轭函数)混合在一块,看下面的原理就知道了。 1. 原始对偶问题 现在考虑原始优化问题,其中 f,gf,gf,g 为闭凸函数 min⁡f(x)+g(Ax) \min \q

Glooow的博客 4601

proteus里面没有stm32怎么办_「话说定时器系列」之一:STM32定时器有哪些?

STM32定时器是 ST MCU 内部最基础且常用的外设,实际应用尤为普遍。去年,电堂推出了《STM32 TIMER基础及常规应用介绍》,为大家梳理了 STM32 TIMER 的庞大内容,涵盖 TIMER 的基本应用原理、常规应用等。现在将课程内容整理为文章,针对STM32定时器有基本了解的用户,分享具体的应用实现环节及常见问题解决。STM32 定时器有哪些?STM32家族的定时器众多,可大致分为...

weixin_39788451的博客 977

保姆级教程:在Ubuntu 21.04上搞定USRP X410的UHD 4.1驱动与Gnuradio 3.9安装(含虚拟机网络避坑指南)

本文提供在Ubuntu 21.04上配置USRP X410的UHD 4.1驱动与Gnuradio 3.9的详细教程,涵盖虚拟机网络设置、依赖安装、源码编译及常见问题解决方案,帮助开发者高效搭建SDR开发环境。

weixin_27869497的博客 272

基于Simulink开发一个完整的直驱式永磁同步发电机DDPMSG仿真模型

需求分析直驱式永磁同步发电机(Direct-Drive Permanent Magnet Synchronous Generator, DDPMSG)广泛应用于风力发电、海洋能发电等可再生能源领域。与传统的齿轮箱驱动系统相比,DDPMSG具有结构简单、效率高、可靠性好等优点,能够直接将机械能转换为电能,减少了中间传动环节,降低了维护成本。本项目将基于Simulink平台,开发一个完整的DDPMSG仿真模型,模拟其在风力发电场景中的应用。我们将详细讲解如何设计和实现该系统,并结合实际应用案例进行说明。

MHD0815的博客 465

STM32定时器系列 - STM32常规定时器时基与时钟源

常规定时器包括:基本定时器、通用定时器和高级定时器。 基本定时器 没有任何对外输入/输出,主要用作时基计数、定时。 通用定时器: 除了基本定时器的时基功能外,还可对外做输入捕捉、输出比较以及连接其它传感器接口【编码器和霍尔传感器】。 高级定时器: 此类定时器的功能最为强大,除了具备通用定时器的功能外,还包含一些与电机控制和数字电源应用相关的功能,比方带死区控制的互补信号输出、紧急刹车关断输入。...

暖暖_的_纠结的博客 7030

从“能跑”到“好用”:一名 Python 开发者的工程化进阶之路【Python心得篇】

Python 早已不只是写脚本、跑数据的工具。后端服务AI Agent 编排层自动化平台核心语言数据与业务之间的“中枢层”区别只在于:你是用脚本方式,还是工程方式在写。如果你已经能写“能跑的 Python”,下一步,就是让它长期可跑、稳定可演进。Python 的真正价值不在于“写得快”,而在于能否支撑持续演进的工程实践。当代码从一次性脚本走向长期运行的系统,开发者必须从结构设计、职责拆分、性能意识和类型约束等方面进行系统性思考。

博客 1546

PWM定时器同步问题--STM32F系列高级定时器同步输出PWM

PWM定时器同步问题–STM32F系列高级定时器同步输出PWM。双极性倍频调制波形:上管-上管-下管-下管。死区时间50ns,设置值为4;

503

Centos 7 Linux 安装单机 Hadoop(HDFS):下载、安装、配置、测试

本文详细介绍了在 CentOS 7 系统上安装与配置单机 Hadoop(HDFS)的完整流程,涵盖 JDK 环境准备、Hadoop 安装包下载与部署、核心配置文件(core-site.xml、hdfs-site.xml 等)修改、SSH 免密登录设置、HDFS 格式化及服务启动,并通过命令行与 Web 界面验证 HDFS 和 YARN 功能,适合 Hadoop 初学者快速搭建本地测试环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 3235

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: GPIO的通用IO
下一篇: LCD_1602时序及应用
programmer-guan
博客等级 码龄8年 76粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值