介绍软件定时器使用基础:单次触发和自动重载定时器。

1、头文件声明

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

// 定义定时器相关时间
#define mainONE_SHOT_TIMER_PERIOD		( pdMS_TO_TICKS( 3333UL ) )
#define mainAUTO_RELOAD_TIMER_PERIOD	( pdMS_TO_TICKS( 500UL ) )

// 定时器回调函数
static void prvOneShotTimerCallback( TimerHandle_t xTimer );
static void prvAutoReloadTimerCallback( TimerHandle_t xTimer );

2、创建和启动软件定时器

int main( void )
{
	TimerHandle_t xAutoReloadTimer, xOneShotTimer;
	BaseType_t xTimer1Started, xTimer2Started;

	// 创建软件定时器:单次执行
	software timer in xOneShotTimer. */
	xOneShotTimer = xTimerCreate( "OneShot",					// 名字
								  mainONE_SHOT_TIMER_PERIOD,	// 多久开始执行
								  pdFALSE,						// 设置为单次执行
								  0,							
								  prvOneShotTimerCallback );	// 回调函数

	// 创建软件定时器:自动重载
	xAutoReloadTimer = xTimerCreate( "AutoReload",					// 名字
									 mainAUTO_RELOAD_TIMER_PERIOD,	// 重载需要时间
									 pdTRUE,						// 重载模式
									 0,							
									 prvAutoReloadTimerCallback );	// 回调函数

	if( ( xOneShotTimer != NULL ) && ( xAutoReloadTimer != NULL ) )
	{
		// 启动定时器
		xTimer1Started = xTimerStart( xOneShotTimer, 0 );
		xTimer2Started = xTimerStart( xAutoReloadTimer, 0 );

		if( ( xTimer1Started == pdPASS ) && ( xTimer2Started == pdPASS ) )
		{
			// 开始调度
			vTaskStartScheduler();
		}
	}

	for( ;; );
	return 0;
}

3、定时器回调函数

static void prvOneShotTimerCallback( TimerHandle_t xTimer )
{
	static TickType_t xTimeNow;

	xTimeNow = xTaskGetTickCount();

	vPrintStringAndNumber( "One-shot timer callback executing", xTimeNow );
}

static void prvAutoReloadTimerCallback( TimerHandle_t xTimer )
{
	static TickType_t xTimeNow;

	xTimeNow = xTaskGetTickCount();

	vPrintStringAndNumber( "Auto-reload timer callback executing", xTimeNow );
}