CSR uEnergy例子讲解之timer用法
来源:互联网 发布:linux 磁盘挂载出问题 编辑:程序博客网 时间:2024/04/28 08:57
定时器在所有的MCU中都扮演着十分重要的角色,在CSR101x系列SOC中也不例外,下面我就以SDK中的例子来简单说明timer在CSR101x开发中的用法。
首先打开我们要的工程:
整个工程就一个文件—main.c,打开该文件,首先我们会看到三个宏定义:
第一个是MAX_TIMERS,它定义了整个程序同时所用到的timer数量,这里我们只用到了一个,所以只定义了1.
TIMER_TIMEROUT1和TIMER_TIMEOUT2分别定义了timer溢出的时间。
接下去定义的是定时器的缓存:
以上这些定义都会在下面的代码中用到。
接下去直接切入主题,看到初始化函数:
void AppInit(sleep_statelast_sleep_state)
{
//初始化Debug串口
DebugInit(1, NULL, NULL);
//发送Debug字符串
DebugWriteString("\r\nInitialisingtimers");
//初始化timer,这里用到了前面的定义,timer的初始化就是这么简单,但是这步是必须的
TimerInit(MAX_TIMERS, (void *)app_timers);
//向串口打印当前系统time信息
printCurrentTime();
//开启第一个定时器
startTimer(TIMER_TIMEOUT1, timerCallback1);
}
下面我们来看一下开启定时器函数startTimer是怎么写的:
static void startTimer(uint32timeout, 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 tostart timer");
/* Panic with panic code 0xfe */
Panic(0xfe);
}
}
前面我们提到过TIMER_TIMEOUT1定义的时间为1s,如果程序运行正常,1s后会自动运行timerCallback1函数,下面我们再看看timerCallback1中发生了什么:
static voidtimerCallback1(timer_id const id)
{
……
//上面上面省略的代码不做过多解释,反正就是根据一些条件往串口打印一些数据
//这里重新开启另一个timer,当时间溢出后调用timerCallback2回调函数
startTimer((TIMER_TIMEOUT2 -TIMER_TIMEOUT1), timerCallback2);
}
同样,我们来看timerCallback2函数:
static voidtimerCallback2(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,那可以忽略这点。
转自:http://sanwen8.cn/p/1f9CFqR.html
- CSR uEnergy例子讲解之timer用法
- CSR uEnergy例子讲解之PIO操作
- Java之Timer用法
- System.Threading.Timer用法和例子
- System.Threading.Timer用法和例子
- Java之Timer的用法
- java之Timer类使用方法小例子
- Timer例子
- OSG例子讲解之osgautotransform
- QT学习之Timer的用法
- Timer用法
- Timer用法
- Timer用法
- Timer用法
- timer用法
- Timer,TimerTask简单讲解
- C# Timer讲解
- 通过两个例子讲解PIVOT/UNPIVOT的用法_SQL技巧
- C#的第12课的内容
- RabbitMQ入门教程 For Java【1】 - Hello World
- 前端项目之布局那些事儿
- iOS语音听写、语音合成
- iOS开发-iOS10新特性及开发者主要注意点
- CSR uEnergy例子讲解之timer用法
- 软件测试面试 (二) 如何测试网页的登录页面
- 第五讲:类的成员、对象成员的引用
- Android布局分析工具HierarchyView
- CentOS 图形界面 命令行界面切换 多种方法
- c++学习心得
- 如何用Charles 软件抓取https的包
- Nginx的安装SSL
- RxJava concatMap操作符