| 
									
										
										
										
											2023-10-06 18:47:05 +08:00
										 |  |  |  | #include "base/define.h"
 | 
					
						
							|  |  |  |  | #include "timer_cfg.h"
 | 
					
						
							|  |  |  |  | #include "base/delay.h"
 | 
					
						
							| 
									
										
										
										
											2023-10-16 18:53:12 +08:00
										 |  |  |  | volatile Timerupdatefunc p_timer4update_func = NULL; | 
					
						
							| 
									
										
										
										
											2023-10-06 18:47:05 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | /*
 | 
					
						
							|  |  |  |  | @brief 发送时钟校准波形 | 
					
						
							|  |  |  |  | @param pre_us 发送的周期 | 
					
						
							|  |  |  |  | @param count 发送周期的个数 | 
					
						
							|  |  |  |  | */ | 
					
						
							|  |  |  |  | static volatile uint16_t amend_plus_count = 0; | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-16 18:53:12 +08:00
										 |  |  |  | volatile TimerTriger p_timertriger = NULL; | 
					
						
							| 
									
										
										
										
											2023-10-06 18:47:05 +08:00
										 |  |  |  | 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; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-13 17:34:05 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | void TimerCount_Off(void) | 
					
						
							|  |  |  |  | { | 
					
						
							|  |  |  |  | 	TIM_Cmd(TIM2,DISABLE); | 
					
						
							|  |  |  |  | 	TIM2->CNT = 0; | 
					
						
							|  |  |  |  | 	TIM2->PSC = (uint32_t)7200-1;//10K 0.1ms
 | 
					
						
							|  |  |  |  | 	TIM2->EGR |= TIM_EventSource_Update; | 
					
						
							|  |  |  |  | 	TIM2->SR = 0; | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | 
 |