STM32F429-DISCO 学习之FreeRTOS软件定时器

/ 0评 / 0

如果,处理器的硬件定时器不足,而成本又受到限制,并且在误差允许范围(1-2 Tick)内,就可以用软件定时器,除了不能像某些硬件定时可以直接发生波形,做做通用定时器还是挺方便的.既然是软件定时器,那一定占一些软件资源,比如RAM和性能开销.定时器以CallBack方式运行,类似于发生事情时,进入一个中断函数.定时器可以任何时候创建,删除,暂停,调整定时间距.
每个定时器,他有独立的结构体,TimerHandle_t类型,我们目前做2个定时器,所以... 叫做:

TimerHandle_t xTimers1;
TimerHandle_t xTimers2;

需要使用xTimerCreate创建,创建失败返回NULL,否则就是生成这个Handle.举例说明:

xTimers1 = xTimerCreate("Timers1", ( 1000 ), pdTRUE, ( void * ) 1,xTimersFunc);
xTimers2 = xTimerCreate("Timers2", ( 5000 ), pdFALSE, ( void * ) 2,xTimersFunc);

首先第一个参数是友好的名字,跟Task的人为命名是一个东西,第二个参数是定时间隙,这个是以Tick为单位,并不是系统主频也不是总线频率哦,接着是是否循环定时,pdTRUE就是循环,接着是定时器的唯一ID,最后是定时器溢出是否调用的函数的名字.他们共同调用的函数,我写成这样:

void xTimersFunc( TimerHandle_t pxTimer )
{
    int32_t lArrayIndex;
    lArrayIndex = ( int32_t ) pvTimerGetTimerID( pxTimer );
    if(lArrayIndex == 1)
    {
    }
    else if(lArrayIndex == 2)
    {
    }
}

通过lArrayIndex获取是哪个定时器唯一ID来操作.xTaskCreate分配了唯一ID是1和2.我们在创建后,还可以随时修改这个周期.

    xTimers1 = xTimerCreate("Timers1", ( 5000 / portTICK_RATE_MS ), pdTRUE, ( void * ) 1, xTimersFunc);
    xTimers2 = xTimerCreate("Timers2", ( 10000 / portTICK_RATE_MS ), pdFALSE, ( void * ) 2, xTimersFunc);
    xTimerChangePeriod( xTimers1, 500 / portTICK_PERIOD_MS, 2000 );
    xTimerStart(xTimers1, 0);
    xTimerStart(xTimers2, 0);

注意的是,不得只有一个定时器,一定要有任务才能启动调度器,否则会出错,在现实的项目中,也不可能没有别的任务啊.