#define Max_Timer_number 20 //最大定时器个数
typedef void (*T_CallBack)(void );
typedef enum
{/*********************************************************************************************************/
USART_TimerID = 0, //串口的定时器,其在定时器数组中位于第1个,即下标为0的定时器
Thing_1_TimerID = 1, //事件1的定时器,其在定时器数组中位于第2个,即下标为1的定时器
Thing_2_TimerID = 2, //事件2的定时器,其在定时器数组中位于第3个,即下标为2的定时器
Thing_3_TimerID = 3, //事件3的定时器,其在定时器数组中位于第4个,即下标为3的定时器
...........................................................
...........................................................
Thing_19_TimerID = Max_Timer_number - 1
} TimerID_Index;
typedef enum{
TimerON =1,
TimerOFF,
Overflow,
NoOverflow
TimerPeriodic, //周期性定时
TimerOnce, //一次性定时
} TimerStatus;
typedef struct
{
TimerStatus ONOFF_Flag ; //定时器开启或关闭标志
uint32_t current_COUNT; //计数值
uint32_t reload_COUNT; //重装载值
TimerStatus Overflow_Flag ; //
TimerStatus Once_Periodic ; //
} Struct_Timer;
/初始化操作///
Struct_Timer StrTimerArray[Max_Timer_number]; //定义 【定时器结构体数组】
//定义Thing_1_TimerID 的回调函数
void Thing_1_TimerCallBack(void )
{
//Thing_1_TimerID 该事件定时溢出后要处理的事情。。。。。。。。。。。。。
}
/定时器初始化函数///
void Initialize_Timer( TimerID_Index TimerID,
TimerStatus v_ONOFF_Flag,
uint32_t v_current_COUNT ,
uint32_t v_reload_COUNT,
TimerStatus v_Overflow_Flag ,
TimerStatus v_Once_Periodic ,
T_CallBack v_TimerCallBack )
{
StrTimerArray[ TimerID ].ONOFF_Flag = v_ONOFF_Flag;
StrTimerArray[ TimerID ].current_COUNT = v_current_COUNT ;
StrTimerArray[ TimerID ].reload_COUNT = v_reload_COUNT;
StrTimerArray[ TimerID ].Overflow_Flag = v_Overflow_Flag ;
StrTimerArray[ TimerID ].Once_Periodic = v_Once_Periodic ;
StrTimerArray[ TimerID ].TimerCallBack = v_TimerCallBack ;
}
/定时器启动函数///
void Start_Timer( TimerID_Index TimerID ){
StrTimerArray[ TimerID ].Overflow_Flag = NoOverflow ;
StrTimerArray[ TimerID ].current_COUNT = 0;
StrTimerArray[ TimerID ].ONOFF_Flag = TimerON;
}
/// 初始化定时器Thing_1_TimerID //
Initialize_Timer( Thing_1_TimerID ,
TimerON ,
0 ,
1000 ,
NoOverflow ,
TimerPeriodic ,
Thing_1_TimerCallBack
);
/定时中断操作///
//遍历 StrTimerArray[Max_Timer_number],对有任务的定时器进行计数操作{
if( StrTimerArray[ i ].ONOFF_Flag == TimerON ) {
if ( StrTimerArray[ i ].current_COUNT < StrTimerArray[ i ].reload_COUNT ){
StrTimerArray[ i ].current_COUNT ++;
}
else{
StrTimerArray[ i ].current_COUNT = 0;
StrTimerArray[ i ].ONOFF_Flag = TimerOFF;
StrTimerArray[ i ].Overflow_Flag = Overflow ;
}
}
}
/main( )中大while( 1 )///
for( i=0;i<Max_Timer_number;i++ )
{
if( StrTimerArray[ i ].Overflow_Flag == Overflow ) {
StrTimerArray[ i ].TimerCallBack ;
StrTimerArray[ i ].Overflow_Flag = NoOverflow ;
if ( StrTimerArray[ i ].Once_Periodic == TimerPeriodic ){
StrTimerArray[ i ].ONOFF_Flag = TimerON;
}
}
}