Bootstrap

STM32定时器计时

STM32定时器计时

最近用STM32标准库做了个定时器计时的方法,挺简单的,分享给大家,若有不足之处请多多指教。

MCU:STM32F407VG
IDE: Keil5

1.配置定时器初始化,我使用的是TIM3,配置中断

note:①TIM_TimeBaseInitStructure.TIM_Period = arr; 此处参数若为1000-1就是0.1秒进入一次中断,10000-1就是1秒
②`TIM_TimeBaseInitStructure.TIM_Prescaler=8400-1; ``定时器分频根据芯片来定,可以搜索一下,你能懂的。


```void TIM3_Int_Init(u16 arr)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);  //使能TIM3时钟
	
  	TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler=8400-1;  //定时器分频
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
	//TIM_TimeBaseInitStructure.TIM_RepetitionCounter=5;
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//初始化TIM3
	TIM_ClearFlag(TIM3,TIM_FLAG_Update);										
	TIM_ITConfig(TIM3,TIM_IT_Update|TIM_IT_Trigger,ENABLE); //允许定时器3更新中断
	TIM_Cmd(TIM3,ENABLE); //使能定时器3
	
	NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQn; //定时器3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; 	//抢占优先级1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; 	//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
	}

2.编写定时器中断处理函数

int count=0;	//中断计数
int timer_count=0;//定时器计时
void TIM3_IRQHandler(void)
{
	if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET) //溢出中断
	{
		count++;	//每中断一次计数+1
		if(count==10)
		{
			timer_count++;//当计数=10给另一个变量+1
			count=0;	//将中断计数变量清零
		}	//若是0.1秒中断一次,那此时timer_count为1秒了
	}
	TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  //清除中断标志位
}

3.写一个函数封装定时的功能

void Timer_Count(u8 second) //参数为你要定时的时间
{
	if(timer_count==second)
	{
		LED_TOGGLE_PD;//在其他文件宏定义了一个LED灯翻转功能
		timer_count=0;//计时清零
	}
}
然后在主函数调用void Timer_Count(u8 second) ;就可以实现定时了。
;