嗯~~~ 在stm32中经常使用定时器,但是一直没有学会怎样计算定时器的时间,近期简单学习了一下做一下总结记录

首先我们会在主函数里边定义时钟的最高频率为72Mhz(使用SysTick_Init(72);定义)如下方代码所示

int main()
{
	u8 i;
	SysTick_Init(72);
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
	LED_Init();
	TIM4_Init(1000,36000-1);  //定时500ms
	
	while(1)
	{
		i++;
		if(i%20==0)
		{
			led1=!led1;
		}
		delay_ms(10);	
	}
}

在定义了时钟的最高频率 ,我们就要去设置定时器的震荡频率,然后计算出每秒多少HZ,进而计算出每一HZ 所需要花费的时间,最后根据自动重装载的次数计算定时器的时间

如计算  500ms的定时器

TIM4_Init(1000-1,36000-1);  //定时500ms

最大频率72Mhz   分频系数 36000-1  自动重装载数 1000

计算1秒多少HZ 就是最大频率除以分频系数

72000000/(36000-1+1)=2000hz        (3600-1+1)   计数是从零开始所以需要加一

1/2000=0.0005秒/HZ=0.5毫秒/HZ

自动重装载数 为(1000-1+1)               (1000-1+1)计数是从零开始所以需要加一

定时器时间就是  0.5*1000=500毫秒  因此 就计算出了我们设置的定时器时间就是500ms进入一次定时器中断。

/*******************************************************************************
* 函 数 名         : TIM4_Init
* 函数功能		   : TIM4初始化函数
* 输    入         : per:重装载值
					 psc:分频系数
* 输    出         : 无
*******************************************************************************/
void TIM4_Init(u16 per,u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//使能TIM4时钟
	
	TIM_TimeBaseInitStructure.TIM_Period=per;   //自动装载值    1hz所需要的时间乘以per  就是定时器设置的时间
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc; //分频系数     计算赫兹=系统最大频率分频之后 72000000/psc 的倒数  为时间单位为秒     
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //设置向上计数模式
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStructure);
	
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); //开启定时器中断
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;//定时器中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;		//子优先级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	
	
	TIM_Cmd(TIM4,ENABLE); //使能定时器	
}

/*******************************************************************************
* 函 数 名         : TIM4_IRQHandler
* 函数功能		   : TIM4中断函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void TIM4_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM4,TIM_IT_Update))
	{
		led2=!led2;
	}
	TIM_ClearITPendingBit(TIM4,TIM_IT_Update);	
}

 

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐