timer3.c 1.82 KB
#include "timer3.h"
Uart_Timer timer3;
static void TIM3_Init(uint16_t arr,uint16_t psc)//定时器2中断初始化
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//TIM3时钟使能

	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
	TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision	= TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

	TIM_ClearFlag(TIM3, TIM_FLAG_Update);//解决了定时器初始化后立即进入中断的bug(无论是否定时器启动)!!!!!!!!!!!!!!!!!!!!

	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级2
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);

	TIM_Cmd(TIM3, DISABLE);		//关闭TIM3	
}
static void TIM3_Start(void)
{
	TIM_Cmd(TIM3, ENABLE);		//关闭TIM3		
}
static void TIM3_Stop(void)
{
	TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//清除TIM3更新中断标志	
	TIM_Cmd(TIM3, DISABLE);		//关闭TIM3	
}
static void TIM3_Clear(void)
{
	TIM_SetCounter(TIM3,0);//计数器清空
}
void timer3_init(void (*callback)())
{
	timer3.callback =callback;
	timer3.start=TIM3_Start;
	timer3.stop=TIM3_Stop;
	timer3.timeclear=TIM3_Clear;

	TIM3_Init(10*20-1,7200-1);	//设置最大超时时间为40ms
}
void TIM3_IRQHandler(void)//定时器4中断服务程序
{
	if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//是更新中断
	{
		timer3.stop();	
		timer3.callback();			
	}
	else
	{	
	}
}