Freertos学习09-软件定时器

发布时间 2023-07-20 10:53:54作者: seekwhale13

一、概述

软件定时器是一种在单片机上实现定时功能的方法,可以用于周期性地执行任务或者延时执行任务。软件定时器由FreeRTOS内核实现,不需要硬件支持。软件定时器只有在软件定时器回调函数被调用时才需要占用CPU时间。
  本节主要设计以下内容:

  • 软件定时器的API介绍
  • 实例测试

二、软件定时器API

  1. 创建一个软件定时器
TimerHandle_t xTimerCreate(const char *pcTimerName, 
			   TickType_t xTimerPeriod, 
			   UBaseType_t uxAutoReload, 
			   void *pvTimerID, 
			   TimerCallbackFunction_t pxCallbackFunction);
参数 说明
pcTimerName 定时器的名称
xTimerPeriod 定时器的周期,以FreeRTOS的时钟节拍为单位。定时器将在每个周期结束时触发回调函数。
uxAutoReload 设置定时器是否自动重载
pvTimerID 用户自定义的定时器ID
pxCallbackFunction 定时器到期时要执行的回调函数
返回值 NULL,软件定时器无法创建;其他值,定时器句柄
//创建定时器xtimer1
xtimer1 =  xTimerCreate("xtimer1",100,pdTRUE,( void * ) 0,vTimerCallback);
  1. 启动定时器:
BaseType_t xTimerStart(TimerHandle_t xTimer, TickType_t xTicksToWait);

  其中,xTimer是要启动的定时器句柄,xTicksToWait是启动定时器前要等待的时钟节拍数。
 
3. 定时器回调函数:

void vTimerCallback(TimerHandle_t xTimer);

  在定时器到期时,会调用注册的回调函数。该函数传入定时器的句柄。
4. 停止定时器:

BaseType_t xTimerStop(TimerHandle_t xTimer, TickType_t xTicksToWait);

其中,xTimer是要停止的定时器句柄,xTicksToWait是停止定时器前要等待的时钟节拍数。
5. 重启定时器

BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );

该个函数用于重置一个软件定时器。当调用xTimerReset函数时,定时器将被重置为其初始状态,并重新开始计时。示例用法如下:

// 创建一个定时器
TimerHandle_t xTimer = xTimerCreate("MyTimer", pdMS_TO_TICKS(1000), pdTRUE, NULL, vTimerCallback);

// 启动定时器
xTimerStart(xTimer, 0);

// 重置定时器
xTimerReset(xTimer, 0);

在上面的示例中,我们首先使用xTimerCreate函数创建了一个名为"MyTimer"的定时器,定时器的周期为1000毫秒,并指定了一个回调函数vTimerCallback。然后,我们使用xTimerStart函数启动定时器。最后,我们使用xTimerReset函数重置定时器。

请注意,xTimerReset函数的第二个参数是一个延迟时间,用于指定何时重置定时器。如果将延迟时间设置为0,则定时器将立即重置。如果将延迟时间设置为正值,则定时器将在指定的延迟时间后重置。

三、代码实例

#include <stdio.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/timers.h"

void vTimerCallback(TimerHandle_t xtimer1)
{
    printf("xtimer task test!\r\n");

}

TimerHandle_t xtimer1;
void app_main(void)
{
    //创建定时器xtimer1
    xtimer1 =  xTimerCreate("xtimer1",100,pdTRUE,( void * ) 0,vTimerCallback);
    xTimerStart(xtimer1, 0);//启动定时器
}