目录
一、简介
1、FreeRTOS定时器简介
freertos自带的定时功能,这是一个可选功能,使用将configUSE_TIMERS置为1,可配置为单次定时器和周期定时器,软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数即回调函数,在回调函数中一定不能调用可以阻塞任务的API函数。
ps:相关函数在timers.c和timers.h中。
2、相关宏
宏 | 说明 |
---|---|
configUSE_TIMERS | 是否开启软件定时器功能 |
configTIMER_TASK_PRIORITY | 定时器任务优先级 |
configTIMER_QUEUE_LENGTH | 定时器队列长度 |
configTIMER_TASK_STACK_DEPTH | 定时器任务堆栈大小 |
3、回调函数
当定时器定时间到,会跳转到回调函数执行,回调函数没有函数名字的限制,参数必须为TimerHandle_t类型。例:
void AutoReloadTimeCallback(TimerHandle_t xTimer)
二、相关函数详解
1、函数汇总
函数 | 描述 |
---|---|
xTimerReset() | 复位软件定时器 |
xTimerResetFromISR() | 复位软件定时器,中断中 |
xTimerCreate() | 使用动态方法创建软件定时器。 |
xTimerCreateStatic() | 使用静态方法创建软件定时器。 |
xTimerStart() | 开启软件定时器,用于任务中。 |
xTimerStartFromISR() | 开启软件定时器,用于中断中。 |
xTimerStop() | 关闭软件定时器,用于任务中。 |
xTimerStopFromISR() | 关闭软件定时器,用于中断中。 |
2、xTimerReset()
-
功能
复位软件定时器,在使用定时器中途复位定时器,定时器会重新计时。
-
函数
BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait )
-
参数
xTimer:要复位的软件定时器的句柄。
xTicksToWait:设置阻塞时间,调用函数 xTimerReset ()开启软件定时器其实就是向定时器命令队列发 送一条 tmrCOMMAND_RESET 命令,既然是向队列发送消息,那肯定会涉及到入队阻塞 时间的设置。
-
返回值
pdPASS: 软件定时器复位成功,其实就是命令发送成功。
pdFAIL: 软件定时器复位失败,命令发送失败。
3、xTimerResetFromISR()
-
功能
复位软件定时器,在使用定时器中途复位定时器,定时器会重新计时。在中断中使用
-
函数
BaseType_t xTimerResetFromISR( TimerHandle_t xTimer, BaseType_t * pxHigherPriorityTaskWoken );
-
参数
xTimer:要复位的软件定时器的句柄。
pxHigherPriorityTaskWoken:记退出此函数以后是否进行任务切换,这个变量的值函数会自动设置的,用 户不用进行设置,用户只需要提供一个变量来保存这个值就行了。当此值为 pdTRUE 的时候在退出中断服函数之前一定要进行一次任务切换。
-
返回值
pdPASS: 软件定时器复位成功,其实就是命令发送成功。
pdFAIL: 软件定时器复位失败,命令发送失败。
4、xTimerCreate()
-
功能
创建一个软件定时器,所需要的内存由系统动态分配
-
函数
TimerHandle_t xTimerCreate( const char * const pcTimerName, TickType_t xTimerPeriodInTicks, UBaseType_t uxAutoReload, void * pvTimerID, TimerCallbackFunction_t pxCallbackFunction )
-
参数
pcTimerName:软件定时器的名字,字符串类型,用于调试
xTimerPeriodInTicks:软件定时器的定时器周期, 单位是时钟节拍数,可以使用portTICK_PERIOD_MS 改变成ms单位,例如500ms即为:500/ portTICK_PERIOD_MS。
uxAutoReload:是否重载,pdTURE:周期,pdFALSE:单次。
pvTimerID:定时器的ID号。
pxCallbackFunction: 定时器回调函数,当定时器定时周期到了以后就会调用这个函数。
-
返回值
NULL: 软件定时器创建失败。
其他值: 创建成功的软件定时器句柄。
5、xTimerCreateStatic()
-
功能
创建一个软件定时器,所需要的内存由用户自己分配。
-
函数
TimerHandle_t xTimerCreateStatic(const char * const pcTimerName, TickType_t xTimerPeriodInTicks, UBaseType_t uxAutoReload, void * pvTimerID, TimerCallbackFunction_t pxCallbackFunction, StaticTimer_t * pxTimerBuffer )
-
参数
pcTimerName:软件定时器的名字,字符串类型,用于调试
xTimerPeriodInTicks:软件定时器的定时器周期, 单位是时钟节拍数,可以使用portTICK_PERIOD_MS 改变成ms单位,例如500ms即为:500/ portTICK_PERIOD_MS。
uxAutoReload:是否重载,pdTURE:周期,pdFALSE:单次。
pvTimerID:定时器的ID号。
pxCallbackFunction: 定时器回调函数,当定时器定时周期到了以后就会调用这个函数。
pxTimerBuffer: 参数指向一个 StaticTimer_t 类型的变量,用来保存定时器结构体。
-
返回值
NULL: 软件定时器创建失败。
其他值: 创建成功的软件定时器句柄。
6、xTimerStart()
-
功能
启动定时器,在任务中
-
函数
BaseType_t xTimerStart( TimerHandle_t xTimer, TickType_t xTicksToWait )
-
参数
xTimer: 要开启的软件定时器的句柄。
xTicksToWait:设置阻塞时间,调用函数 xTimerStart()开启软件定时器其实就是向定时器命令队列发送一条 tmrCOMMAND_START 命令,既然是向队列发送消息,那肯定会涉及到入队阻塞时间的置。
-
返回值
pdPASS: 软件定时器开启成功,其实就是命令发送成功。
pdFAIL: 软件定时器开启失败,命令发送失败。
7、xTimerStartFromISR()
-
功能
启动定时器,在中断中
-
函数
BaseType_t xTimerStartFromISR( TimerHandle_t xTimer, BaseType_t * pxHigherPriorityTaskWoken );
-
参数
xTimer:要开启的软件定时器的句柄。
pxHigherPriorityTaskWoken:退出是否进行任务切换......
-
返回值
pdPASS: 软件定时器开启成功,其实就是命令发送成功。
pdFAIL: 软件定时器开启失败,命令发送失败。
8、xTimerStop()
-
功能
停止软件定时器,用于任务中。
-
函数
BaseType_t xTimerStop ( TimerHandle_t xTimer, TickType_t xTicksToWait );
-
参数
xTimer:要暂停的软件定时器的句柄。
xTicksToWait:阻塞时间。
-
返回值
pdPASS: 软件定时器停止成功,其实就是命令发送成功。
pdFAIL: 软件定时器停止失败,命令发送失败。
9、xTimerStopFromISR()
-
功能
停止软件定时器,用于中断中。
-
函数
BaseType_t xTimerStopFromISR( TimerHandle_t xTimer, BaseType_t * pxHigherPriorityTaskWoken );
-
参数
xTimer:要暂停的软件定时器的句柄。
pxHigherPriorityTaskWoken:退出是否进行任务切换......
-
返回值
pdPASS: 软件定时器停止成功,其实就是命令发送成功。
pdFAIL: 软件定时器停止失败,命令发送失败。
三、使用流程
1、创建定时器
TimerHandle_t RrloadTimer_Handle; //周期定时器句柄
TimerHandle_t OneShotTimer_Handle; //单次定时器句柄
...
RrloadTimer_Handle = xTimerCreate("ReloadTime",
1500/portTICK_PERIOD_MS,
1,
(void *)1,
AutoReloadTimeCallback);
OneShotTimer_Handle = xTimerCreate("OneShotTime",
2000/portTICK_PERIOD_MS,
0,
(void *)2,OneShotTimeCallback);
2、编写回调函数
void AutoReloadTimeCallback(TimerHandle_t xTimer);
void OneShotTimeCallback(TimerHandle_t xTimer);
......
void AutoReloadTimeCallback(TimerHandle_t xTimer)
{
Relodadnum++;
LEDB_Toggle;
printf("周期定时器执行%d次\r\n",Relodadnum);
}
void OneShotTimeCallback(TimerHandle_t xTimer)
{
printf("单次定时器执行\r\n");
}
3、启动定时器
xTimerStart(RrloadTimer_Handle,20);
xTimerStart(OneShotTimer_Handle,20);
4、暂停定时器
void Task1(void * pvParaeters)
{
BaseType_t err;
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1)
{
printf("K1按下!\r\n");
err = xTimerStop(RrloadTimer_Handle,20);
if(err == pdPASS)
{
printf("周期定时器暂停成功\r\n");
}
while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1);
}
if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 1)
{
printf("K2按下!\r\n");
err = xTimerStart(RrloadTimer_Handle,20);
if(err == pdPASS)
{
printf("周期定时器开启成功\r\n");
}
while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13) == 1);
}
vTaskDelay(200);
}
}