366 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			366 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "base/define.h"
 | ||
| #include "timer_cfg.h"
 | ||
| #include "base/delay.h"
 | ||
| volatile Timerupdatefunc p_timer4update_func = NULL;
 | ||
| 
 | ||
| 
 | ||
| /*
 | ||
| @brief 发送时钟校准波形
 | ||
| @param pre_us 发送的周期
 | ||
| @param count 发送周期的个数
 | ||
| */
 | ||
| static volatile uint16_t amend_plus_count = 0;
 | ||
| 
 | ||
| volatile TimerTriger p_timertriger = NULL;
 | ||
| void FireBus_ClkAmend(uint16_t pre_us,uint16_t trigger_us,uint16_t count,void *p_fun)
 | ||
| {
 | ||
| 	
 | ||
| 	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定时器初始化结构
 | ||
| 	TIM_OCInitTypeDef  TIM_OCInitStructure;//通道输出初始化结构
 | ||
| 	NVIC_InitTypeDef NVIC_InitStructure;  
 | ||
| 	
 | ||
| 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE ); 
 | ||
| 	p_timertriger = (TimerTriger)p_fun;
 | ||
| 	amend_plus_count = count;
 | ||
| 	NVIC_DisableIRQ(TIM3_IRQn);
 | ||
| 		//TIM初始化
 | ||
| 	TIM_TimeBaseStructure.TIM_Period = pre_us-1;        //周期0~FFFF
 | ||
| 	TIM_TimeBaseStructure.TIM_Prescaler = 71 ;          //时钟分频
 | ||
| 	TIM_TimeBaseStructure.TIM_ClockDivision = 0;          //时钟分 1us
 | ||
| 	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//模式	
 | ||
| 	TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
 | ||
| 	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);   //基本初始化	
 | ||
| 
 | ||
| 	//TIM3通道初始化
 | ||
| 	TIM_OCStructInit(& TIM_OCInitStructure);                                                //默认参数
 | ||
| 	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;                    //工作状态
 | ||
| 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;         //设定为输出,需要PWM输出才需要这行代码
 | ||
| 	TIM_OCInitStructure.TIM_Pulse = pre_us-trigger_us - 1;                   //占空长度
 | ||
| 	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                 //高电平
 | ||
| 
 | ||
| 	TIM_OC1Init(TIM3, &TIM_OCInitStructure);  
 | ||
| 	TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
 | ||
| 	TIM_ClearFlag(TIM3,TIM_IT_CC1);
 | ||
| 	TIM_ITConfig(TIM3, TIM_IT_CC1 , ENABLE);//使能CC1中断
 | ||
| 	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
 | ||
| 	TIM_ARRPreloadConfig(TIM3, ENABLE); 
 | ||
| 	TIM_SetCompare3(TIM3,0);
 | ||
| 	TIM_Cmd(TIM3, ENABLE); //开启定时器
 | ||
| 	
 | ||
| 	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;         
 | ||
|   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 | ||
|   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 9;     
 | ||
|   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //TIM2全局中断使能   
 | ||
|   NVIC_ClearPendingIRQ(TIM3_IRQn);
 | ||
|   NVIC_Init(&NVIC_InitStructure);     
 | ||
| 	
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| 使用轮询的方式检测校准结束
 | ||
| */
 | ||
| void FireBus_ClkAmendCycle(void)
 | ||
| {
 | ||
| 	//使用查询的方式,关闭中断
 | ||
| 	NVIC_DisableIRQ(TIM3_IRQn);
 | ||
| 	TIM_ITConfig(TIM3, TIM_IT_CC1 , DISABLE);//使能CC1中断
 | ||
| 	TIM_ITConfig(TIM3,TIM_IT_Update,DISABLE);
 | ||
| 	if(p_timertriger == NULL)
 | ||
| 	{
 | ||
| 		return;
 | ||
| 	}
 | ||
| 	__disable_irq();
 | ||
| 	while(1)
 | ||
| 	{
 | ||
| 		uint8_t flag = 0;
 | ||
| 		if( TIM_GetITStatus(TIM3,TIM_IT_Update))
 | ||
| 		{
 | ||
| 			if(amend_plus_count > 0)
 | ||
| 				amend_plus_count--;
 | ||
| 			flag = 1;
 | ||
| 			p_timertriger(flag);
 | ||
| 			TIM3->SR = 0;
 | ||
| 		}else if(TIM_GetITStatus(TIM3,TIM_IT_CC1))
 | ||
| 		{
 | ||
| 			flag = 2;
 | ||
| 			p_timertriger(flag);
 | ||
| 			TIM3->SR = 0;
 | ||
| 		}
 | ||
| 		if(amend_plus_count == 0)
 | ||
| 		{
 | ||
| 			flag = 3;
 | ||
| 			TIM_DeInit(TIM3);
 | ||
| 			p_timertriger(flag);
 | ||
| 			p_timertriger = NULL;
 | ||
| 			break;
 | ||
| 		}
 | ||
| 	}
 | ||
| 	__enable_irq();
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| void TIM3_IRQHandler()
 | ||
| {
 | ||
| 	uint8_t flag = 0;
 | ||
| 	rt_interrupt_enter();
 | ||
| 	if( TIM_GetITStatus(TIM3,TIM_IT_Update))
 | ||
| 	{
 | ||
| 		if(amend_plus_count > 0)
 | ||
| 			amend_plus_count--;
 | ||
| 		flag = 1;
 | ||
| 	}else if(TIM_GetITStatus(TIM3,TIM_IT_CC1))
 | ||
| 	{
 | ||
| 		flag = 2;
 | ||
| 	}
 | ||
| 	//timer_interrupt_flag_clear(TIMER2,TIMER_FLAG_UP|TIMER_FLAG_CH2|TIMER_FLAG_CH2O);
 | ||
| 	TIM3->SR = 0;
 | ||
| 	if(p_timertriger != NULL)
 | ||
| 	{
 | ||
| 		p_timertriger(flag);
 | ||
| 	}
 | ||
| 	if(amend_plus_count == 0)
 | ||
| 	{
 | ||
| 		flag = 3;
 | ||
| 		NVIC_DisableIRQ(TIM3_IRQn);
 | ||
| 		TIM_DeInit(TIM3);
 | ||
| 		p_timertriger(flag);
 | ||
| 		p_timertriger = NULL;
 | ||
| 	}
 | ||
| 	 rt_interrupt_leave();
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| /*
 | ||
| @brief 超时定时器,单位10ms
 | ||
| @param ms 最大可设置6553。
 | ||
| @param  pfunc 超时回调函数,注意回调函数中不能做长延时任务
 | ||
| */
 | ||
| void RunTimeOut_Timer(uint16_t ms,Timerupdatefunc pfunc )
 | ||
| {
 | ||
| 	NVIC_InitTypeDef NVIC_InitStructure;  
 | ||
| 	//定时器初始化数据结构定义
 | ||
| 	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 | ||
| 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE );
 | ||
| 	p_timer4update_func = pfunc;
 | ||
| 	ms = ms*2-1;
 | ||
| 	
 | ||
| 	NVIC_DisableIRQ(TIM1_UP_IRQn);
 | ||
| 		//复位计数器
 | ||
| 	TIM_DeInit(TIM1);							
 | ||
| 	TIM_TimeBaseStructure.TIM_Period           = ms;		//计数上限,100*100us = 10000us = 10ms
 | ||
| 	TIM_TimeBaseStructure.TIM_Prescaler        = 36000-1;//2K;	//预分频72MHz主频,分频后时钟周期0.5ms
 | ||
| 	TIM_TimeBaseStructure.TIM_ClockDivision    = TIM_CKD_DIV1;  //不分频
 | ||
| 	TIM_TimeBaseStructure.TIM_CounterMode      = TIM_CounterMode_Up;  //向上计数
 | ||
| 	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
 | ||
| 	//初始化
 | ||
| 	TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
 | ||
| 	//清中断
 | ||
|   TIM_ClearFlag(TIM1, TIM_FLAG_Update);
 | ||
| 	TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE);
 | ||
| 	
 | ||
| 	//定时器清零
 | ||
| 	TIM_SetCounter(TIM1,0);
 | ||
| 	
 | ||
| 	TIM_ARRPreloadConfig(TIM1, DISABLE);
 | ||
| 	
 | ||
| 	//定时器启动	
 | ||
|   TIM_Cmd(TIM1,ENABLE);
 | ||
| 	
 | ||
| 	NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQn;         
 | ||
|   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
 | ||
|   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 10;     
 | ||
|   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;      //TIM2全局中断使能   
 | ||
| 	NVIC_ClearPendingIRQ(TIM1_UP_IRQn);
 | ||
|   NVIC_Init(&NVIC_InitStructure);     
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| //停止超时定时器计数
 | ||
| void RunTimeoutStop(void)
 | ||
| {
 | ||
| 	TIM_DeInit(TIM1);			
 | ||
| }
 | ||
| //获取超时定时器计数值
 | ||
| uint16_t GetRunTimeOutCount(void)
 | ||
| {
 | ||
| 	return TIM1->CNT;
 | ||
| }
 | ||
| 
 | ||
| void TIM1_UP_IRQHandler()
 | ||
| {
 | ||
| //	uint8_t flag = 0;
 | ||
| 	rt_interrupt_enter();
 | ||
| 	if(TIM_GetITStatus(TIM1,TIM_IT_Update))
 | ||
| 	{
 | ||
| 		if(p_timer4update_func != NULL)
 | ||
| 		{
 | ||
| 			TIM_Cmd(TIM1,DISABLE);	
 | ||
| 			p_timer4update_func();
 | ||
| 			
 | ||
| 		}
 | ||
| 	}
 | ||
| 	TIM1->SR = 0x00;
 | ||
| 	rt_interrupt_leave();
 | ||
| 
 | ||
| }
 | ||
| /*
 | ||
| 延时定时器初始化,单次向上计数
 | ||
| */
 | ||
| void DelayTimer_Init(void)
 | ||
| {
 | ||
| 	//定时器初始化数据结构定义
 | ||
| 	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 | ||
| 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE );
 | ||
| 	TIM_DeInit(TIM2);
 | ||
| 	
 | ||
| 	TIM_TimeBaseStructure.TIM_Period           = 0xFFFF;		//计数上限,100*100us = 10000us = 10ms
 | ||
| 	TIM_TimeBaseStructure.TIM_Prescaler        = 7200-1;	//预分频48,48MHz主频,分频后时钟周期1us
 | ||
| 	TIM_TimeBaseStructure.TIM_ClockDivision    = TIM_CKD_DIV1;  //不分频
 | ||
| 	TIM_TimeBaseStructure.TIM_CounterMode      = TIM_CounterMode_Up;  //向上计数
 | ||
| 	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
 | ||
| 	
 | ||
| 	TIM_ARRPreloadConfig(TIM2, DISABLE);
 | ||
| 	//初始化
 | ||
| 	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
 | ||
| 	StartDelayTime();
 | ||
| }
 | ||
| /*
 | ||
| 延时定时器初始化,单次向上计数
 | ||
| */
 | ||
| void TimerCount_Init(void)
 | ||
| {
 | ||
| 		//定时器初始化数据结构定义
 | ||
| 	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
 | ||
| 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE );
 | ||
| 	TIM_DeInit(TIM2);
 | ||
| 	
 | ||
| 	TIM_TimeBaseStructure.TIM_Period           = 0xFFFF;		//计数上限,100*100us = 10000us = 10ms
 | ||
| 	TIM_TimeBaseStructure.TIM_Prescaler        = 7200-1;	//预分频48,48MHz主频,分频后时钟周期1us
 | ||
| 	TIM_TimeBaseStructure.TIM_ClockDivision    = TIM_CKD_DIV1;  //不分频
 | ||
| 	TIM_TimeBaseStructure.TIM_CounterMode      = TIM_CounterMode_Up;  //向上计数
 | ||
| 	TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
 | ||
| 	
 | ||
| 	TIM_ARRPreloadConfig(TIM2, DISABLE);
 | ||
| 	//初始化
 | ||
| 	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
 | ||
| }
 | ||
| /*
 | ||
| @brief 重启延时定时器
 | ||
| */
 | ||
| void StartDelayTime()
 | ||
| {
 | ||
| 	TIM_Cmd(TIM2,DISABLE);
 | ||
| 	TIM2->CNT = 0;
 | ||
| 	TIM2->PSC = (uint32_t)7200-1;//10K 0.1ms
 | ||
| 	TIM2->EGR |= TIM_EventSource_Update;
 | ||
| 	TIM2->SR = 0;
 | ||
| 	TIM_Cmd(TIM2,ENABLE);
 | ||
| 	
 | ||
| }
 | ||
| /*
 | ||
| @brief 定时器是否运行到大于当前值
 | ||
| @param  当前比较值
 | ||
| */
 | ||
| uint8_t isDelayEnd(uint16_t wait_time)
 | ||
| {
 | ||
| 	if((TIM2->CNT > wait_time) && (TIM2->SR > 0) )
 | ||
| 		return 0;
 | ||
| 	return 1;
 | ||
| }
 | ||
| /* 
 | ||
| @breif 等待定时器计数值大于设定值
 | ||
| @param 等待定时器的结束值,单位0.1ms
 | ||
| */
 | ||
| void WaitDelayEnd(uint16_t wait_time)
 | ||
| {
 | ||
| 	while((TIM2->CNT  < wait_time) && (TIM2->SR < 1))
 | ||
| 	{
 | ||
| 		
 | ||
| 	}
 | ||
| }
 | ||
| /*
 | ||
| @brief 获取当前定时器计数值,单位1us。并重启计数
 | ||
| @rtv   返回上次的计数值
 | ||
| */
 | ||
| uint16_t Get1usCount(void)
 | ||
| {
 | ||
| 	uint16_t us_value ;
 | ||
| 	if(TIM2->SR > 0)
 | ||
| 	{
 | ||
| 		us_value = 65535;
 | ||
| 	}else{
 | ||
| 		us_value = TIM2->CNT;
 | ||
| 	}
 | ||
| 	
 | ||
| 	TIM_Cmd(TIM2,DISABLE);
 | ||
| 	TIM2->CNT = 0;
 | ||
| 	TIM2->PSC = (uint32_t)71;//1M 1us
 | ||
| 	TIM2->EGR |= TIM_EventSource_Update;
 | ||
| 	TIM2->SR = 0;
 | ||
| 	TIM_Cmd(TIM2,ENABLE);
 | ||
| 	return us_value;
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| @brief 获取当前定时器计数值,单位10us。并重启计数
 | ||
| @rtv   返回上次的计数值
 | ||
| */
 | ||
| uint16_t Get10usCount(void)
 | ||
| {
 | ||
| 	
 | ||
| 	uint16_t us_value ;
 | ||
| 	if(TIM2->SR > 0)
 | ||
| 	{
 | ||
| 		us_value = 65535;
 | ||
| 	}else{
 | ||
| 		us_value = TIM2->CNT;
 | ||
| 	}
 | ||
| 	
 | ||
| 	TIM_Cmd(TIM2,DISABLE);
 | ||
| 	TIM2->CNT = 0;
 | ||
| 	TIM2->PSC = (uint32_t)720-1;//100K 10us
 | ||
| 	TIM2->EGR |= TIM_EventSource_Update;
 | ||
| 	TIM2->SR = 0;
 | ||
| 	TIM_Cmd(TIM2,ENABLE);
 | ||
| 	return us_value;
 | ||
| 	
 | ||
| 	
 | ||
| 
 | ||
| 	
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| @brief 获取当前定时器计数值,单位0.1ms。并重启计数
 | ||
| @rtv   返回上次的计数值
 | ||
| */
 | ||
| uint16_t Get100usCount(void)
 | ||
| {
 | ||
| 	
 | ||
| 	uint16_t us_value ;
 | ||
| 	if(TIM2->SR > 0)
 | ||
| 	{
 | ||
| 		us_value = 65535;
 | ||
| 	}else{
 | ||
| 		us_value = TIM2->CNT;
 | ||
| 	}
 | ||
| 	
 | ||
| 	TIM_Cmd(TIM2,DISABLE);
 | ||
| 	TIM2->CNT = 0;
 | ||
| 	TIM2->PSC = (uint32_t)7200-1;//10K 100us
 | ||
| 	TIM2->EGR |= TIM_EventSource_Update;
 | ||
| 	TIM2->SR = 0;
 | ||
| 	TIM_Cmd(TIM2,ENABLE);
 | ||
| 	return us_value;
 | ||
| 	
 | ||
| 	
 | ||
| }
 | ||
| 
 | ||
| /*
 | ||
| @brief 直接获取定时器的值
 | ||
| */
 | ||
| uint16_t GetCountTimerCnt()
 | ||
| {
 | ||
| 	return TIM2->CNT;
 | ||
| }
 | ||
| 
 | 
