单片机----软定时详解
前言
相信有很多机友们,在一开始接触单片机的时候,对软定时一知半解的(大佬除外),以下文章是自己对软件定时的一些拙见。有不足之处希望能和大家一起探讨、进步。
一、头文件的创建
在.h文件中声明了一个枚举类型,该枚举类型是为了在软定时的初始化函数中,判断开启软定时的次数是(单次)或者(重复运行);然后还创建了一个保存软定时使用到的结构体。
typedef enum
{
Once_Time = 0,
Rep_Time = 1,
} Repet_Or_Not;
typedef struct _TIMER
{
uint8_t isEnable;
uint8_t Repet;
uint16_t count;
uint16_t countNeed;
void (*func)();
} SOFT_TIMER;
二、源文件的使用
在源文件中,定义了以下函数。
void timer_Run(SOFT_TIMER *timer)
{
if (timer->isEnable)
{
timer->count++;
if (timer->count == timer->countNeed)
{
if (timer->Repet == Once_Time)
{
timer->isEnable = 0;
}
timer->count = 0;
timer->func();
}
}
}
void startTimer(SOFT_TIMER *timer, Repet_Or_Not rep, uint16_t timeneed, void(*func))
{
timer->count = 0;
timer->isEnable = 1;
timer->countNeed = timeneed;
timer->func = func;
timer->Repet = rep;
}
void stopTimer(SOFT_TIMER *timer)
{
timer->isEnable = 0;
timer->count = 0;
}
void resetTimer(SOFT_TIMER *timer)
{
timer->count = 0;
}
void Soft_Timer_Init(void)
{
timer1_configuration();
user_timer_start(IDX_TIMER1);
}
void timer0_isr
{
timer_Run(&xxxx);
}
总结
??在作者看来,软件定时器的实现是在硬件定时器的基础上再次进行二次封装,当硬件定时产生时,判断软定时任务结构体参数里的使能标志位是否打开,通过设置的countNeed(所以实际进入软定时回调函数的时间也即是:硬件定时的时间 * countNeed )。 ??软定时的本质,其实是对硬件定时的多任务管理,提供了一个更加的封装接口,方便机友们去管理。在软定时的回调函数中,做一些标志位的判断或者简单的操作即可,切记不可停留的时间过长,否则水晶就没了。
|