FreeRTOS软件定时器
可以在任务和中断中启动,时间到后触发回调
创建软件定时器 xTimerCreate
创建定时器,并不会启动
TimerHandle_t xTimerCreate(
const char * const pcTimerName, //定时器名称(调试用)
const TickType_t xTimerPeriodInTicks,//周期(单位tick)
const UBaseType_t uxAutoReload,//自动装载(pdTURE)
void * const pvTimerID,//定时器ID,可以判断是哪一个定时器
TimerCallbackFunction_t pxCallbackFunction //回调函数
)
回调函数示例:
void callbackFunctionExample(TimerHandle_t xTimer);
软件定时器的启动 xTimerStart / xTimerStartFromISR
//成功pdPASS,队列已满pdFAIL
BaseType_t xTimerStart(
TimerHandle_t xTimer,//定时器句柄
TickType_t xToclsToWait//阻塞等待时间(内部是消息队列)
)
重启定时器xTimerReset
- 重启软件定时器
- 如果定时器已经启动,重新计算时间
- 如果没有启动,则启动
BaseType_t xTimerReset(
TimerHandle_t xTimer,//定时器句柄
TickType_t xToclsToWait//阻塞等待时间(内部是消息队列)
)
获取定时器ID pvTimerGetTimerID()
void* pvTimerGetTimerID(TimerHandle_t xTimer);
更改定时器周期 xTimerChangePeriod
- 如果定时器没启动,会启动定时器
BaseType_t xTimerChangePeriod(
TimerHandle_t xTimer,//定时器句柄
TickType_t xMew{eropd,//新的定时周期
TickType_t xToclsToWait//阻塞等待时间
)
代码
LED灯闪烁代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/timers.h"
#include "driver/gpio.h"
#define LED_Built_In 16
//定时器的回调
void vTimerCallback( TimerHandle_t xTimer )
{
static int i = 0;
gpio_set_level(LED_Built_In,i%2);
++i;
}
void app_main(void)
{
//GPIO初始化
gpio_config_t io_conf;
memset(&io_conf,0,sizeof(gpio_config_t));
io_conf.mode = GPIO_MODE_OUTPUT;//设置为输出
io_conf.pin_bit_mask = (1ULL<<LED_Built_In) ;
gpio_config(&io_conf);
gpio_set_level(LED_Built_In,1);
//创建定时器
TimerHandle_t myTimer;
myTimer = xTimerCreate("myTimer",100,pdTRUE,(void*)0,vTimerCallback);
if(myTimer == NULL){
//error
printf("Error xTimerCreate\n");
}else{
xTimerStart(myTimer,0);
}
while (1) {
//空闲任务
vTaskDelay(1000 / portTICK_RATE_MS);
}
}