2021-11-11

单片机----软定时详解


文章目录


前言

相信有很多机友们,在一开始接触单片机的时候,对软定时一知半解的(大佬除外),以下文章是自己对软件定时的一些拙见。有不足之处希望能和大家一起探讨、进步。


一、头文件的创建

在.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 )。
  软定时的本质,其实是对硬件定时的多任务管理,提供了一个更加的封装接口,方便机友们去管理。在软定时的回调函数中,做一些标志位的判断或者简单的操作即可,切记不可停留的时间过长,否则水晶就没了。

上一篇:动画函数的实现、封装、回调函数


下一篇:js - 防抖与节流