FreeRTOS学习(六)软件定时器 XTimer

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 
#include 
#include 

#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);
    }
}

你可能感兴趣的:(ESP,RTOS,C语言)