Files

378 lines
9.1 KiB
C
Raw Permalink Normal View History

#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; //周期0FFFF
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;
}
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;
}