介绍
FreeRTOS软件定时器组的时基是基于系统时钟节拍实现的。创建软件定时器时,指定软件定时器的回调函数,在回调函数中实现相应的功能。FreeRTOS提供的软件定时器支持单次模式和周期性模式:单次模式就是用户创建了定时器并启动了定时器后,定时时间到将不再重新执行;周期模式就是此定时器会按照设置的时间周期重复去执行。
注意 :定时器回调函数是在定时器任务中执行的,实际应用中切不可在定时器回调函数中调用任何将定时器任务挂起的函数,比如vTaskDelay(),vTaskDelayUntil()以及非零延迟的消息队列和信号量相关的函数。将定时器任务挂起,会导致定时器任务负责的相关功能都不能正确执行了。
FreeRTOSConfig.h配置
#define configUSE_TIMERS 1
#include "timers.h"
相关函数
函数 xTimerCreate
函数 xTimerStart
函数 pvTimerGetTimerID
void *pvTimerGetTimerID( TimerHandle_t xTimer ); /* 定时器句柄*/
函数pvTimerGetTimerID用于返回使用函数xTimerCreate创建的软件定时器ID。
使用
定义Timer
static TimerHandle_t xTimers = NULL;
xTimers = xTimerCreate("Timer", /* 定时器名字 */
3000, /* 定时器周期,单位时钟节拍 */
pdTRUE, /* 周期性 */
(void * )0x01, /* 定时器ID */
vTimerCallback); /* 定时器回调函数 */
if(xTimers == NULL)
{
/* 没有创建成功,用户可以在这里加入创建失败的处理机制 */
}
else
{
/* 启动定时器,系统启动后才开始工作 */
if(xTimerStart(xTimers, 100) != pdPASS)
{
/* 定时器还没有进入激活状态 */
}
}
回调函数
static void vTimerCallback(xTimerHandle pxTimer)
{
uint32_t ulTimerID;
configASSERT(pxTimer);
/* 获取那个定时器时间到 */
ulTimerID = (uint32_t)pvTimerGetTimerID(pxTimer);
// /* 处理定时器0任务 */
// if(ulTimerID == 0)
// {
// bsp_LedToggle(1);
// }
/* 处理定时器1任务 */
if(ulTimerID == 1)
{
uint8_t data[]="This is a Timer";
taskENTER_CRITICAL(); /* 进入临界区 */
HAL_UART_Transmit(&huart1,data,sizeof(data),0xff);
taskEXIT_CRITICAL(); /* 退出临界区 */
}
}