155 lines
5.6 KiB
C
155 lines
5.6 KiB
C
|
|
/*C*****************************************************************************
|
||
|
|
* NAME: time_count.c
|
||
|
|
*-------------------------------------------------------------------------------
|
||
|
|
* RELEASE:
|
||
|
|
* REVISION: 1.0
|
||
|
|
|
||
|
|
*******************************************************************************/
|
||
|
|
/*_____ I N C L U D E S ______________________________________________________*/
|
||
|
|
|
||
|
|
#include "config.h" //全局声明
|
||
|
|
|
||
|
|
void delay(unsigned int Counter)
|
||
|
|
{
|
||
|
|
unsigned int i;
|
||
|
|
for (; Counter != 0; Counter--)
|
||
|
|
{
|
||
|
|
i = 55; // 经示波器测试,精度1%
|
||
|
|
while (i--)
|
||
|
|
;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
/*_____ M A C R O S __________________________________________________________*/
|
||
|
|
|
||
|
|
/****************************************************
|
||
|
|
函数名:TimerTask
|
||
|
|
功能 :定时器初始化(主定时器,timer2)1ms
|
||
|
|
参数 :无
|
||
|
|
返回值:无
|
||
|
|
****************************************************/
|
||
|
|
void Timer_Init(void)
|
||
|
|
{
|
||
|
|
u8 i = 0, j = 0;
|
||
|
|
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
|
||
|
|
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 开TIM2时钟
|
||
|
|
/*TIM2*/
|
||
|
|
TIM_TimeBaseStructure.TIM_Prescaler = 168 - 1; // 分频系数1000k
|
||
|
|
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 计数方式
|
||
|
|
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; // 计数上限 10ms 100hz
|
||
|
|
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟选裕:系统时钟
|
||
|
|
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // TIM2时基初始化
|
||
|
|
/***********************/
|
||
|
|
TXHData.Timer_Num_Top = 0; // 初始化定时器数目
|
||
|
|
/***************初始化定时器组*******************/
|
||
|
|
for (i = 0; i < 4; i++)
|
||
|
|
{
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MDRestartTimer[i];
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MBCountTimer[i];
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MBCountRXIDLETimer[i];
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_FramContinuityTimer[i];
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
for (j = 0; j < 16; j++)
|
||
|
|
{
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_Port_Info[i].GunInfo[j].LTDelayTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_Port_Info[i].FatherDevice[j].LTDelayTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.POSCutTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.HeartbeatTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.POS_RS232Timer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.ReSendDataTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.GPSDataTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.AnalogTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.CTIMEReadTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_LORA_SlaveTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.KeyFindTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.POSReLinkTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_MultiplexRXIDLETimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_MultiplexTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
for (i = 0; i < 5; i++)
|
||
|
|
{
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.MD_Multiplex_Port_Info.MultiplexDevicerTimer[i];
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
}
|
||
|
|
TXHData.Timer_Buff[TXHData.Timer_Num_Top] = &TXHData.DelayDetectionTimer;
|
||
|
|
TXHData.Timer_Num_Top++;
|
||
|
|
TIM_Cmd(TIM2, ENABLE); // 打开TIM2
|
||
|
|
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //
|
||
|
|
Timer_NVIC_Configuration();
|
||
|
|
}
|
||
|
|
/****************************************************
|
||
|
|
函数名:Timer_NVIC_Configuration
|
||
|
|
功能 :定时器中断配置timer2
|
||
|
|
参数 :无
|
||
|
|
返回值:无
|
||
|
|
****************************************************/
|
||
|
|
void Timer_NVIC_Configuration(void)
|
||
|
|
{
|
||
|
|
NVIC_InitTypeDef NVIC_InitStructure; // 定义中断配置结构体
|
||
|
|
|
||
|
|
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
|
||
|
|
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
|
||
|
|
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
|
||
|
|
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
|
||
|
|
NVIC_Init(&NVIC_InitStructure);
|
||
|
|
}
|
||
|
|
/****************************************************
|
||
|
|
函数名:SYSTimer_IRQHandler
|
||
|
|
功能 :系统定时器中断(主定时器,timer2)10ms
|
||
|
|
参数 :无
|
||
|
|
返回值:无
|
||
|
|
****************************************************/
|
||
|
|
void SYSTimer_IRQHandler(void)
|
||
|
|
{
|
||
|
|
u8 pTimer = 0;
|
||
|
|
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
|
||
|
|
{
|
||
|
|
for (pTimer = 0; pTimer < TXHData.Timer_Num_Top; pTimer++) // 轮训定时器队列
|
||
|
|
{
|
||
|
|
if (TXHData.Timer_Buff[pTimer]->Init == 1) // 定时器初始化标志
|
||
|
|
{
|
||
|
|
TXHData.Timer_Buff[pTimer]->Init = 0;
|
||
|
|
TXHData.Timer_Buff[pTimer]->ON_OFF = 0;
|
||
|
|
TXHData.Timer_Buff[pTimer]->Flag = 0;
|
||
|
|
TXHData.Timer_Buff[pTimer]->TimerCount = 0;
|
||
|
|
}
|
||
|
|
else if (TXHData.Timer_Buff[pTimer]->ON_OFF == 1 && TXHData.Timer_Buff[pTimer]->Flag == 0) // 定时器开启状态,未到时
|
||
|
|
{
|
||
|
|
TXHData.Timer_Buff[pTimer]->TimerCount += 1; // 如果定时器开启,计数值累加
|
||
|
|
if (TXHData.Timer_Buff[pTimer]->TimerCount >= TXHData.Timer_Buff[pTimer]->TimerCountMax) // 判断定时器是否到时
|
||
|
|
{
|
||
|
|
TXHData.Timer_Buff[pTimer]->Flag = 1; // 置位定时器到时标志
|
||
|
|
if (TXHData.Timer_Buff[pTimer]->Cycle == 1) // 定时器循环,清除定时器计数值
|
||
|
|
{
|
||
|
|
TXHData.Timer_Buff[pTimer]->TimerCount = 0;
|
||
|
|
}
|
||
|
|
else // 到时不循环,初始化定时器
|
||
|
|
{
|
||
|
|
TXHData.Timer_Buff[pTimer]->ON_OFF = 0;
|
||
|
|
TXHData.Timer_Buff[pTimer]->TimerCount = 0;
|
||
|
|
TXHData.Timer_Buff[pTimer]->Cycle = 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
|
||
|
|
}
|