FREERTOS笔记(四) 软件定时器
1.freertos时间管理带的,可以设置一段时间后执行某函数
2.类似stm32 TIM中断,只是软件相较于硬件准确性可能差点
3. 定时器函数中不能写会阻塞的api函数
比如vTaskDelay(ms);或者vTaskDelayUntil();等
4.主体依赖于prvTimerTask
时间调度任务,这个任务在vTaskStartScheduler();内的xTimerCreateTimerTask();进行创建
5.记得包含头文件#include “timers.h”
API函数
xTimerHandle
创建句柄
xTimerCreate
创建任务 注意第二个参数如果时pdTRUE则时周期,pdFALSE则为单词
xTimerStart / xTimerStartFromISR
开始任务 / 从中断中 //第二个参数时阻塞时间
xTimerStop / xTimerStopFromISR
结束任务 / 从中断中 //第二个参数时阻塞时间
示例
main.c
xTimerHandle AutoReloadTimer_handle;//周期定时器句柄
xTimerHandle OneLoadTimer_handle;//单次定时器句柄
void AutoReloadCallBack(TimerHandle_t timerhandle);//创建周期回调函数
void OneLoadCallBack(TimerHandle_t timerhandle);//创建单次回调函数
void start_task(void *pvParameters)//创建任务
{
taskENTER_CRITICAL();//进入临界区
AutoReloadTimer_handle=xTimerCreate((const char *)"AutoReloadTimer",
(TickType_t)500,//0.5s调用一次
(UBaseType_t)pdTRUE,//周期
(void *)1,//ID
(TimerCallbackFunction_t)AutoReloadCallBack);
OneLoadTimer_handle=xTimerCreate((const char *)"OneLoadTimer",
(TickType_t)2000,//2s调用一次
(UBaseType_t)pdFALSE,//单次
(void *)1,//ID
(TimerCallbackFunction_t)OneLoadCallBack);
taskEXIT_CRITICAL();//退出临界区
vTaskDelete(NULL);
}
void AutoReloadCallBack(TimerHandle_t timerhandle)//周期定时器回调函数
{
static int auto_t;
auto_t++;
printf("\nAutoReloadCallBack---%d\n",auto_t);
}
void OneLoadCallBack(TimerHandle_t timerhandle)//周期定时器回调函数
{
static int auto_t;
auto_t++;
printf("\nOneLoadCallBack---%d\n",auto_t);
}
串口中断函数
extern xTimerHandle AutoReloadTimer_handle;//周期定时器句柄
extern xTimerHandle OneLoadTimer_handle;//单次定时器句柄
void u1_handler(uint8_t ch) //串口接收中断中的函数
{
if(ch=='1')
{
xTimerStartFromISR(AutoReloadTimer_handle,0);
}
else if (ch=='2')
{
xTimerStopFromISR(AutoReloadTimer_handle,0);
}
else if (ch=='3')
{
xTimerStartFromISR(OneLoadTimer_handle,0);
}
else if (ch=='4')
{
xTimerStopFromISR(OneLoadTimer_handle,0);
}
}
实验现象
发送1开启周期定时器,一秒打印两次数据,发送2关闭,不再打印
发送3开启单次定时器,就只打印一次,数据加1,再次发送3才再次打印
如果发送3,在两秒内发送4,就不会触发单次定时器