FreeRTOS 软件定时器使用

本文深入解析FreeRTOS软件定时器的两种工作模式:单次触发与自动重载。介绍了核心函数,如创建、启动、停止及重置定时器的方法,并展示了如何在代码中配置与使用软件定时器。

FreeRTOS 的软件定时器工作模式有两种:单次触发 和 自动重载。

1. 主要功能函数介绍

官方API文档:FreeRTOS 软件定时器 API文档

 

最为常用的函数有

// 创建软件定时器,返回 TimerHandle_t句柄
TimerHandle_t xTimerCreate(	const char * const pcTimerName,		        // 软件定时器名称
				const TickType_t xTimerPeriodInTicks,		// 定时器触发周期,x个时钟节拍
				const UBaseType_t uxAutoReload,			// 触发模式。pdTRUE为循环,pdFALSE为单次
				void * const pvTimerID,				// 定时器ID,从1开始
				TimerCallbackFunction_t pxCallbackFunction )	// 回调函数
// 软件定时器启动函数
xTimerStart( xTimer, xTicksToWait )			// xTimer 为定时器句柄
							// xTicksToWait 为延时执行节拍数,一般为0
// 软件定时器停止函数
xTimerStop( xTimer, xTicksToWait )			// xTimer 为定时器句柄
							// xTicksToWait 为延时执行节拍数,一般为0
// 软件定时器复位函数
xTimerReset( xTimer, xTicksToWait )			// xTimer 为定时器句柄
							// xTicksToWait 为延时执行节拍数,一般为0
// 更改定时器的计时周期,来更改活动或休眠状态计时器的周期
xTimerChangePeriod( xTimer, xNewPeriod, xTicksToWait )	// xTimer 为定时器句柄
							// xNewPeriod 为新的计时节拍数
							// xTicksToWait 为延时执行节拍数,一般为0

 

2. 开启软件定时器功能,优先级设置

开启软件定时器功能,需要先将 " FreeRTOSConfig.h " 中的 configUSE_TIMERS 设置为 1。

同时分配优先级,队列长度,和任务栈大小。

/***************************************************************************************************************/
/*                                FreeRTOS与软件定时器有关的配置选项                                            */
/***************************************************************************************************************/
#define configUSE_TIMERS		1				//为1时启用软件定时器
#define configTIMER_TASK_PRIORITY	(configMAX_PRIORITIES-1)	//软件定时器优先级
#define configTIMER_QUEUE_LENGTH	5				//软件定时器队列长度
#define configTIMER_TASK_STACK_DEPTH	(configMINIMAL_STACK_SIZE*2)	//软件定时器任务堆栈大小

 

3. 示例

创建一个周期为1000节拍数的软件定时器,模式为周期循环模式。

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

/* FreeRTOS任务配置 */
#define START_TASK_PRIO		1	//任务优先级
#define START_STK_SIZE		128	//任务堆栈大小
TaskHandle_t StartTask_Handler;		//任务句柄
void start_task(void *pvParameters);	//任务函数

/* FreeRTOS软件定时器,1000节拍数 */
TimerHandle_t 	countPlusTimer_Handle;		//软件定时器句柄
void countPlusCallback(TimerHandle_t xTimer); 	//软件定时器回调函数

int main(void)
{
	......
	//创建开始任务
	xTaskCreate((TaskFunction_t )start_task,	//任务函数
		(const char*    )"start_task",          //任务名称
		(uint16_t       )START_STK_SIZE,        //任务堆栈大小
		(void*          )NULL,                  //传递给任务函数的参数
		(UBaseType_t    )START_TASK_PRIO,       //任务优先级
		(TaskHandle_t*  )&StartTask_Handler);   //任务句柄
				
	vTaskStartScheduler();          //开启任务调度
}

//开始任务任务函数
void start_task(void *pvParameters)
{
	taskENTER_CRITICAL();           //进入临界区
	
	//创建1000节拍数 软件周期定时器,用于计数++
	netClockCountTimer_Handle=xTimerCreate((const char*	)"countPlusTimer",
				(TickType_t		)1000,
				(UBaseType_t	)pdTRUE,
				(void*		)1,
				(TimerCallbackFunction_t)countPlusCallback); //周期定时器,ID=1,周期1s(1000个时钟节拍)
	
	//开启1000节拍数 软件周期定时器,用于计数++
	if(countPlusTimer_Handle!=NULL)
	{
		xTimerStart(countPlusTimer_Handle,0);	//开启周期定时器
	}
	
	vTaskDelete(StartTask_Handler); //删除开始任务
	taskEXIT_CRITICAL();            //退出临界区
}

uint16_t xtep=0;
// 软件定时器的回调函数
// 软件定时器,ID=1,周期(1000个时钟节拍)
void countPlusCallback(TimerHandle_t xTimer)
{
	xtep++;
}

连接Jlink,view观察 xtep变量,程序运行后 xtep以1000节拍数为周期递增。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值