BC0006-CSR uEnergy例子讲解之timer用法

定时器在所有的MCU中都扮演着十分重要的角色,在CSR101x系列SOC中也不例外,下面我就以SDK中的例子来简单说明timer在CSR101x开发中的用法。

首先打开我们要的工程:

整个工程就一个文件—main.c,打开该文件,首先我们会看到三个宏定义:

第一个是MAX_TIMERS,它定义了整个程序同时所用到的timer数量,这里我们只用到了一个,所以只定义了1.

TIMER_TIMEROUT1和TIMER_TIMEOUT2分别定义了timer溢出的时间。

接下去定义的是定时器的缓存:

以上这些定义都会在下面的代码中用到。

接下去直接切入主题,看到初始化函数:

void AppInit(sleep_state last_sleep_state)

{

    //初始化Debug串口

    DebugInit(1, NULL, NULL);

    //发送Debug字符串

    DebugWriteString(“\r\nInitialising timers”);

    //初始化timer,这里用到了前面的定义,timer的初始化就是这么简单,但是这步是必须的

    TimerInit(MAX_TIMERS, (void *)app_timers);

    //向串口打印当前系统time信息

    printCurrentTime();

    //开启第一个定时器

    startTimer(TIMER_TIMEOUT1, timerCallback1);

}

下面我们来看一下开启定时器函数startTimer是怎么写的:

static void startTimer(uint32 timeout, timer_callback_arg handler)

{

    //开启timer定时器,TimerCreate函数需要输入timer溢出时间和回调函数两个参数,中间的参数一般就设置为TRUE好了,然后如果timer开启成功,会返回一个timer_id值,这个值建议存在一个变量中。

    const timer_id tId = TimerCreate(timeout, TRUE, handler);

    //如果timer创建失败,则向系统报错

    if (tId == TIMER_INVALID)

    {

        DebugWriteString(“\r\nFailed to start timer”);

        /* Panic with panic code 0xfe */

        Panic(0xfe);

    }

}

前面我们提到过TIMER_TIMEOUT1定义的时间为1s,如果程序运行正常,1s后会自动运行timerCallback1函数,下面我们再看看timerCallback1中发生了什么:

static void timerCallback1(timer_id const id)

{

    ……

    //上面上面省略的代码不做过多解释,反正就是根据一些条件往串口打印一些数据

    //这里重新开启另一个timer,当时间溢出后调用timerCallback2回调函数

    startTimer((TIMER_TIMEOUT2 – TIMER_TIMEOUT1), timerCallback2);

}

同样,我们来看timerCallback2函数:

static void timerCallback2(timer_id const id)

{

    …

           //这里timer2结束后重新开启一个timer1

    startTimer(TIMER_TIMEOUT1, timerCallback1);

}

就这样,整个程序就是执行完timerCallback1后执行timerCallback2,执行完timerCallback2后继续执行timerCallback1,如此周而复始。。。

由以上例子可以看出,timerCallback函数只会在timer溢出时执行一次,如果要让他继续执行,则必须要在函数结束前再重新开启一遍timer。

当然,我们还可以在timerCallback函数执行前销毁timer,这样timerCallback函数就不会被执行,销毁timer可以调用TimerDelete(timer_id),这里需要用到创建timer时候返回的timer_id号,如果创建的时候未保存,那就不能delete了啦。此函数在本例子中没有说明,具体使用方法在API中有详细说明。

这里强调一点,在这样的简单程序中,以上写法没啥大问题,因为你能清楚地掌控所有timer,但是如果是一个复杂程序,这样写显得不严谨,容易给你的debug造成很大困扰,因为你根本不知道何时程序会开启一个timer,何时程序会去销毁一个timer,所以,当我们在开启timer的时候必须要将timerId保存到一个变量中,当销毁一个timer的时候要将次变量中的timerId清除,当执行一个timerCallback函数的时候,要判断timerId是否相符。。。在使用timer的时候必须保持良好的习惯,这样程序才不容易出错。当然,如果你有十足把握掌控所有timer,那可以忽略这点。

留下评论

邮箱地址不会被公开。 必填项已用*标注