任意单片机可以用的定时调用函数,可单次可循环

// 定义定时器结构体  
typedef struct {  
    uint32_t interval; // 定时器的时间间隔  
    void (*callback)(); // 定时器到达时间后需要执行的函数  
    uint32_t start_time; // 定时器的开始时间  
    int8_t is_running; // 定时器是否正在运行 
      int8_t is_periodic;
} Timer;

// 定义定时器数组,用于存储多个定时任务  
#define MAX_TIMERS 10  
Timer timers[MAX_TIMERS];

uint32_t bsp_GetRunTime(void)//获取运行时间
{
    return xTaskGetTickCount();//这里给到一个从系统获得的时基计数(跑操作系统或分时调度都可取到,用1ms的时基下建立个计数器即可)
}

uint32_t bsp_CheckRunTime(uint32_t _LastTime)//比较当前时间和上一次时间返回差值
{
    uint32_t now_time;
    uint32_t time_diff;

    now_time = xTaskGetTickCount();    
    
    if (now_time >= _LastTime)
    {
        time_diff = now_time - _LastTime;
    }
    else
    {
        time_diff = _LastTime - now_time;
        time_diff = 0xFFFFFFFF -  time_diff;
    }

    return time_diff;
}

// 定义定时器中断函数  
void timer_interrupt(void) {  
    // 遍历所有的定时器  
    for (int i = 0; i < MAX_TIMERS; i++) {  
        // 如果定时器正在运行,并且当前时间大于等于定时器的开始时间加上定时器的时间间隔  
        if (timers[i].is_running && bsp_CheckRunTime(timers[i].start_time)>=timers[i].interval) {  
            // 执行定时器的回调函数  
            timers[i].callback();  
              
            // 如果是只执行一次的定时器,则停止定时器  
            if (timers[i].is_periodic == 0) {  
                timers[i].is_running = 0;  
            } else {  
                // 如果是周期循环执行的定时器,则重新计算定时器的开始时间  
                timers[i].start_time = bsp_GetRunTime(); 
            }  
        }  
    }  
}  
  
// 定义启动定时器的函数  
void start_timer(unsigned long interval, void (*callback)(), int is_periodic, int *timer_id) {  
    // 获取当前系统时间  
    uint32_t current_time = bsp_GetRunTime();  
      
    // 遍历所有的定时器,找到第一个没有正在运行的定时器  
    for (int i = 0; i < MAX_TIMERS; i++) {  
        if (!timers[i].is_running) {  
            // 启动定时器  
            timers[i].interval = interval;  
            timers[i].callback = callback;  
            timers[i].start_time = current_time;  
            timers[i].is_running = 1;  
            timers[i].is_periodic = is_periodic;
            // 返回定时器的ID  
            *timer_id = i;  
            break;  
        }  
    }  
}  
  
// 定义停止定时器的函数  
void stop_timer(int timer_id) {  
    // 根据定时器ID停止定时器  
    if (timer_id >= 0 && timer_id < MAX_TIMERS) {  
        timers[timer_id].is_running = 0;  
    }  
}

调用:

        // 启动一个定时任务,隔60000毫秒执行一次autoStart函数,只执行一次  
        start_timer(60000, autoStart, 0, &autoOntimer_id);

        // 启动一个定时任务,隔30000毫秒执行一次WrErrorFlag函数,循环执行  
        start_timer(30000, WrErrorFlag, 1 ,&errortimer_id);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值