zoukankan      html  css  js  c++  java
  • 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 ",number);
    }
     
     
    int main(void)
    {
        
        puts(" Test for peripheral TIMERs ");
        printf("Available timers: %i ", TIMER_NUMOF);
        printf(" Testing TIMER_%u: ", 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 ");
        
        while(1)
        {            
            dumb_delay(1);    //如果没有这个语句,那么下面的函数就不执行了,程序会进入空闲模式,因此加个东西,放置进入空闲模式
            if(number >= 10)  
            {
                number=0;
                printf("aaaaaaaaaaaaaaaaaaaaaaaaa = %d ",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"中可以找到,具体的位置在RIOTdriversincludeperiph imer.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

  • 相关阅读:
    JVM三部曲之运行时数据区 (第一部)
    c++鼠标点点,获取坐标值,放入到txt文件中
    自己实现的SVM源码
    SVM资料
    caffe源码解析
    caffe调试小结2
    caffe中卷积层和pooling层计算下一层的特征map的大小
    gpu对任意长度的矢量求和
    caffe代码调试小结
    caffe添加自己的层
  • 原文地址:https://www.cnblogs.com/caobw/p/13228570.html
Copyright © 2011-2022 走看看