定时器在所有的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,那可以忽略这点。