单片机----软定时详解
文章目录
前言
相信有很多机友们,在一开始接触单片机的时候,对软定时一知半解的(大佬除外),以下文章是自己对软件定时的一些拙见。有不足之处希望能和大家一起探讨、进步。
一、头文件的创建
在.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)
{
// 在工程中,配置定时器1,每计数一毫米尝试一次中断
timer1_configuration();
// 在工程中,开启定时器1
user_timer_start(IDX_TIMER1);
}
/************************硬件定时器1的回调函数************************/
void timer0_isr
{
timer_Run(&xxxx);
}
总结
在作者看来,软件定时器的实现是在硬件定时器的基础上再次进行二次封装,当硬件定时产生时,判断软定时任务结构体参数里的使能标志位是否打开,通过设置的countNeed(所以实际进入软定时回调函数的时间也即是:硬件定时的时间 * countNeed )。
软定时的本质,其实是对硬件定时的多任务管理,提供了一个更加的封装接口,方便机友们去管理。在软定时的回调函数中,做一些标志位的判断或者简单的操作即可,切记不可停留的时间过长,否则水晶就没了。