8、RIOT操作系统中 通用定时器的使用

本文介绍RIOT操作系统下CC2538的通用定时器使用方法,包括定时器初始化、设置频率及回调函数等关键步骤,并通过实例演示如何实现精确定时。

RIOT操作系统中 通用定时器的使用

        cc2538中有4个通用定时器(0-3),每个定时器有两个通道(0-1)。首先看看下面的源码。。。。。

main.c

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>

#include "periph/timer.h"

uint8_t a = 0;
uint16_t number = 0; 

void dumb_delay(uint16_t delay)
{
    uint16_t i,j;
    
    for (i = 0; i < delay; i++) 
    {
        for(j = 0; j < 1; j++)
        {
        	__asm__("nop");
        }       
    }
}


static void call_back0(void *arg, int chan)
{
	(void)arg;
	
	number ++;
	printf("number : %d\n",number);
}


int main(void)
{
	
    puts("\nTest for peripheral TIMERs\n");
    printf("Available timers: %i\n", TIMER_NUMOF);
    printf("\nTesting TIMER_%u:\n", 0);
  
      
    timer_init(TIMER_DEV(0), 1000000, call_back0, NULL); // 定时器0(0-3)  设置频率  回调函数 	
    timer_set (TIMER_DEV(0), 0, 1000000);                // 定时器0(0-3)  通道0(0-1)
    
	printf("mojiuyu mojiuyu mojiuyu mojiuyu \n\n");
	
	while(1)
	{			
		dumb_delay(1);    //如果没有这个语句,那么下面的函数就不执行了,程序会进入空闲模式,因此加个东西,放置进入空闲模式
		if(number >= 10)  
		{
			number=0;
			printf("aaaaaaaaaaaaaaaaaaaaaaaaa = %d\n\n",number);
		}
	}
    
}


makefile

APPLICATION = 4-mjy-1timer

BOARD ?= cc2538dk
RIOTBASE ?= $(CURDIR)/../..
CFLAGS += -DDEVELHELP
QUIET ?= 1

include $(RIOTBASE)/Makefile.include



        这个实验中,我们使用的是定时器0,通道0。因此我们在main函数中先把这个定时器中断给初始化。

        我们使用了两条语句。   

                      timer_init(TIMER_DEV(0), 1000000, call_back0, NULL); // 定时器0(0-3)  设置频率  回调函数
                      timer_set (TIMER_DEV(0), 0, 1000000);                // 定时器0(0-3)  通道0(0-1)

        这两条语句在头文件#include "periph/timer.h"中可以找到,具体的位置在RIOT\drivers\include\periph\timer.h,可以自己去看看。

        TIMER_DEV(0)表示定时器0;1000000意思是每秒1MHz的频率。中断执行函数是call_back0。。这个中断执行函数很重要,很多人都不知道中断函数在什么地方,也就是这个call_back0了。

         timer_set (TIMER_DEV(0), 0, 1000000); 这个函数表示我设定定时器0,通道0,没秒钟中断一次。。如果要100ms中断一次,那就用100000.以此类推。。。

        然后下面的语句就是设定了定时器的通道,以及中断相应时间。。。。

       然后其他的就和我们使用的单片机没有什么区别了。。。


      在ubuntu中打开timer.c文件(在cpu/cc2538/periph文件夹中),如下图添加一条语句。gptimer->TAILR    = gptimer->TAMATCHR;  。。。因为这个timer.c他写的有点问题的。。。。


   

     然后是这里也要加进去,官方也不知道搞什么的,这个地方他没有搞好。。。。。。为什么要这么写,自己去看数据手册。。。计数寄到了之后要复位重新计数,但是源码中没有一个复位的,我加进去后,定时器就可以了。。。



来看看实验的结果,实验表明,cc2538的定时器非常的准确。。如果没有printf函数 更加的准确,因为printf也是需要时间的,因此,有那么细微的误差。。。。。




                                         莫九玉

                           写于  2016.12.7    11:17





评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值