MCU裸机时间管理机制----自定义软件定时器

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

    T_CallBack                 TimerCallBack;   

} 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],对有任务的定时器进行计数操作

for( i=0;i<Max_Timer_number;i++ )

{

    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;

             }

    }

}



  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值