Files
checker_slave/source/elec_det/hardware/timer_cfg.c
ranchuan bff9b1b774 V2.05
重写延时等待函数,解决与模块之间通信间隔有可能过短的问题
    修改硬件版本号时自动修改can波特率
2023-11-13 17:34:05 +08:00

378 lines
9.1 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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;
}