FreeRTOS定时器用法

lcysts
12
2025-10-19

在实际项目中,我们经常会有这样的需求:

需要每隔一段时间,干一件特定的事情,比如每隔30s,将MCU搜集到的传感器数据上传到服务器

这样的需求,我们可以使用FreeRTOS里面的定时器完成

创建定时器

TimerHandle_t xTimerCreate( const char * const pcTimerName, 
                                const TickType_t xTimerPeriodInTicks,
                                const UBaseType_t uxAutoReload,
                                void * const pvTimerID,
                                TimerCallbackFunction_t pxCallbackFunction )

该函数用于创建一个定时器,一共有如下几个参数:

  • pcTimerName:定时器的名称,类型为一个字符串

  • xTimerPeriodInTicks:定时器每隔多长时间执行一次,单位为tick,要将时间转换成tick,开始将时间除以portTICK_PERIOD_MS得到

  • uxAutoReload:该定时器是否需要重复触发,为pdTRUE表示重复触发,为pdFALSE表示只触发一次

  • pvTimerID:定时器的标识符,一般不用,除非在多个定时器绑定相同逻辑函数时,才会使用该参数来区分是哪一个定时器触发了逻辑函数;

  • pxCallbackFunction:定时器触发后,需要执行的逻辑函数,返回值为void,只有一个参数,类型为void*

函数的返回值为定时器对象,类型为TimerHandle_t

启动定时器

BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait );

该函数用于启动一个定时器,有两个参数:

  • xTimer:第一个参数为要启动的定时器的句柄;

  • xTicksToWait:第二个参数为等待时间,表示如果任务队列已满,该函数需要等待的时间,如果设置为0,表示不需要等待

  • 返回值为pdPASS表示定时器启动成功,返回值为pdFAIL表示定时器启动失败

停止定时器

BaseType_t xTimerStop( TimerHandle_t xTimer, TickType_t xTicksToWait );

该函数用于启动一个定时器,有两个参数:

  • xTimer:第一个参数为要启动的定时器的句柄;

  • xTicksToWait:第二个参数为等待时间,表示如果任务队列已满,该函数需要等待的时间,如果设置为0,表示不需要等待

  • 返回值为pdPASS表示定时器启动成功,返回值为pdFAIL表示定时器启动失败

实战案例

使用定时器,实现如何功能:

每隔一秒通过串口打印一次hello world,打印10次后,停止定时器

代码如下:

动物装饰