FreeRTOS软件定时器使用学习笔记

目录

一、简介

1、FreeRTOS定时器简介

2、相关宏

3、回调函数

二、相关函数详解

1、函数汇总

2、xTimerReset()

3、xTimerResetFromISR()

4、xTimerCreate()

5、xTimerCreateStatic()

6、xTimerStart()

7、xTimerStartFromISR()

8、xTimerStop()

9、xTimerStopFromISR()

三、使用流程

1、创建定时器

2、编写回调函数

3、启动定时器

4、暂停定时器


一、简介

1、FreeRTOS定时器简介

freertos自带的定时功能,这是一个可选功能,使用将configUSE_TIMERS置为1,可配置为单次定时器和周期定时器,软件定时器允许设置一段时间,当设置的时间到达之后就执行指定的功能函数即回调函数,在回调函数中一定不能调用可以阻塞任务的API函数。

ps:相关函数在timers.ctimers.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);
        }
}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小米和小米粥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值