zoukankan      html  css  js  c++  java
  • FreeRTOS软件定时器

    API函数

    //创建
    TimerHandle_t xTimerCreate( const char * const pcTimerName,
                                const TickType_t xTimerPeriodInTicks,
                                const UBaseType_t uxAutoReload,
                                void * const pvTimerID,
                                TimerCallbackFunction_t pxCallbackFunction )
    
    //开始
    #define xTimerStart( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_START, 
        ( xTaskGetTickCount() ), NULL, ( xTicksToWait ) )
    BaseType_t xTimerGenericCommand( TimerHandle_t xTimer, const BaseType_t xCommandID, 
        const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, 
        const TickType_t xTicksToWait )
    
    //停止
    #define xTimerStop( xTimer, xTicksToWait ) xTimerGenericCommand( ( xTimer ), tmrCOMMAND_STOP, 
        0U, NULL, ( xTicksToWait ) )

    举例

    void start_task(void *pvParameters)
    {
        //创建软件周期定时器。周期1s(1000个时钟节拍),周期模式
        AutoReloadTimer_Handle=xTimerCreate((const char*        )"AutoReloadTimer",
                                            (TickType_t         )1000,
                                            (UBaseType_t        )pdTRUE,
                                            (void*              )1,
                                            (TimerCallbackFunction_t)AutoReloadCallback);
    
        //创建单次定时器。周期2s(2000个时钟节拍),单次模式
        OneShotTimer_Handle=xTimerCreate((const char*           )"OneShotTimer",
                                         (TickType_t            )2000,
                                         (UBaseType_t           )pdFALSE,
                                         (void*                 )2,
                                         (TimerCallbackFunction_t)OneShotCallback);
    }
    
    //周期定时器的回调函数
    void AutoReloadCallback(TimerHandle_t xTimer)
    {
        static u8 tmr1_num=0;
        tmr1_num++;     //周期定时器执行次数加1
        printf("AutoReloadCallback %d
    ", tmr1_num);
    }
    
    //单次定时器的回调函数
    void OneShotCallback(TimerHandle_t xTimer)
    {
        static u8 tmr2_num = 0;
        tmr2_num++;     //单次定时器执行次数加1
        printf("OneShotCallback %d
    ", tmr2_num);
    }
    
    void timercontrol_task(void *pvParameters)
    {
        while(1)
        {
            key = KEY_Scan(0);
            switch(key)
            {
                case WKUP_PRES:     //当key_up按下的话打开周期定时器
                    xTimerStart(AutoReloadTimer_Handle,0);  //开启周期定时器
                    printf("开启定时器1
    ");
                    break;
                case KEY0_PRES:     //当key0按下的话打开单次定时器
                    xTimerStart(OneShotTimer_Handle,0);     //开启单次定时器
                    printf("开启定时器2
    ");
                    break;
                case KEY1_PRES:     //当key1按下话就关闭定时器
                    xTimerStop(AutoReloadTimer_Handle,0);   //关闭周期定时器
                    xTimerStop(OneShotTimer_Handle,0);      //关闭单次定时器
                    printf("关闭定时器1和2
    ");
                    break;  
            }
    
            vTaskDelay(10); //延时10ms,也就是10个时钟节拍
        }
    }

    实验现象
    1

  • 相关阅读:
    关于内存对齐的一点理解
    绿萝记
    《程序是怎样跑起来的》读书笔记——第五章 内存和磁盘的亲密关系
    《程序是怎样跑起来的》读书笔记——第四章 熟练使用有棱有角的内存
    《程序是怎样跑起来的》读书笔记——第三章 计算机进行小数运算时出错的原因
    《程序是怎样跑起来的》读书笔记——第二章 数据是用二进制数表示的
    《程序是怎样跑起来的》读书笔记——第一章 对程序员来说CPU是什么
    代理模式--学习记录
    latex学习--基础知识
    JavaIO之File类
  • 原文地址:https://www.cnblogs.com/zhangxuechao/p/11709470.html
Copyright © 2011-2022 走看看