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

1万+

被折叠的 条评论
为什么被折叠?



