RIOT 技术笔记-08 RIOT操作系统中 通用定时器的使用

 

代码下载地址

https://files.cnblogs.com/files/caobw/RIOT-DEMO%E4%BB%A3%E7%A0%81.rar

 

 

 

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也是需要时间的,因此,有那么细微的误差。。。。。

 

 


————————————————
版权声明:本文为CSDN博主「莫九玉」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mx1252111/article/details/53494950

posted on 2020-07-03 09:45  bodaaa  阅读(249)  评论(0编辑  收藏  举报

导航