1. 创建定时器

定时器的创建使用 xTimerCreate 函数。该函数有以下参数:

  • pcTimerName:定时器的名字,主要用于调试。
  • xTimerPeriodInTicks:定时器的周期,以系统节拍计时。
  • uxAutoReload:定时器是否自动重载。如果为 pdTRUE,定时器将在到期后自动重启;如果为 pdFALSE,定时器将在到期后停止。
  • pvTimerID:一个用户定义的标识符,可以在回调函数中使用。
  • pxCallbackFunction:定时器到期时调用的回调函数。
TimerHandle_t xTimer;
xTimer = xTimerCreate(
            "MyTimer",           // 定时器名字
            pdMS_TO_TICKS(1000), // 定时器周期,单位为毫秒
            pdTRUE,              // 自动重载
            ( void * ) 0,        // 定时器标识符
            vTimerCallback       // 回调函数
        );

if (xTimer == NULL) {
    // 创建定时器失败
} else {
    // 创建定时器成功
}

2. 开始定时器

定时器的启动使用 xTimerStart 函数。该函数有以下参数:

  • xTimer:定时器句柄。
  • xTicksToWait:如果队列已满,任务需要等待的节拍数。
if (xTimerStart(xTimer, 0) != pdPASS) {
    // 启动定时器失败
} else {
    // 启动定时器成功
}

3. 停止定时器

定时器的停止使用 xTimerStop 函数。该函数有以下参数:

  • xTimer:定时器句柄。
  • xTicksToWait:如果队列已满,任务需要等待的节拍数。
if (xTimerStop(xTimer, 0) != pdPASS) {
    // 停止定时器失败
} else {
    // 停止定时器成功
}

代码示例:

#include "FreeRTOS.h"
#include "task.h"
#include "timers.h"

void vTimerCallback(TimerHandle_t xTimer) {
    // 定时器回调函数
    printf("Timer expired!\n");
}

void vTaskFunction(void *pvParameters) {
    TimerHandle_t xTimer;

    // 创建定时器
    xTimer = xTimerCreate(
                "MyTimer",           // 定时器名字
                pdMS_TO_TICKS(1000), // 定时器周期,单位为毫秒
                pdTRUE,              // 自动重载
                ( void * ) 0,        // 定时器标识符
                vTimerCallback       // 回调函数
            );

    if (xTimer == NULL) {
        // 创建定时器失败
    } else {
        // 创建定时器成功
        if (xTimerStart(xTimer, 0) != pdPASS) {
            // 启动定时器失败
        } else {
            // 启动定时器成功
        }
    }

    // 任务循环
    for (;;) {
        // 停止定时器(例如在某些条件下)
        if (/* some condition */) {
            if (xTimerStop(xTimer, 0) != pdPASS) {
                // 停止定时器失败
            } else {
                // 停止定时器成功
            }
        }
        vTaskDelay(pdMS_TO_TICKS(2000)); // 延时以模拟任务的其他操作
    }
}

int main(void) {
    // 创建任务
    xTaskCreate(vTaskFunction, "Task", configMINIMAL_STACK_SIZE, NULL, 1, NULL);

    // 启动调度器
    vTaskStartScheduler();

    // 如果程序运行到这里,说明调度器启动失败
    for (;;);
}