378 lines
9.1 KiB
C
378 lines
9.1 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;
|
||
}
|
||
|
||
|
||
|
||
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;
|
||
}
|
||
|
||
|