微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI Zigbee设计交流 > cc2538的mac timer使用问题

cc2538的mac timer使用问题

时间:10-02 整理:3721RD 点击:

您好!我现在使用CC2538DK开发板进行试验,想要使用CC2538中的MAC Timer定时器。现在我使用contiki-3.0中的example-collect例子进行测试,在\cpu\cc2538\dev\cc2538-rf.c文件的init函数中return 1之前加入一段自己的代码。其中MAC timer的使用参照datasheet的350页介绍来做:

 

// *******************************************************************

  rtimer_clock_t test_count = 0;

  unsigned char test_low = 0;

  unsigned char test_high = 0;

  unsigned int test_int = 0;

 

  test_low = REG(RFCORE_SFR_MTM0) & RFCORE_SFR_MTM0_MTM0;

  test_high = REG(RFCORE_SFR_MTM1) & RFCORE_SFR_MTM1_MTM1;

  test_count = test_low | (test_high << 8);

 

  REG(RFCORE_SFR_MTMSEL) &= (~RFCORE_SFR_MTMSEL_MTMSEL); //let RFCORE_SFR_MTM0 can be read

  printf("REG(RFCORE_SFR_MTMSEL) - %d\n",REG(RFCORE_SFR_MTMSEL));

 

  printf("init test time1 : %d, high : %d, low : %d\n", test_count,test_high,test_low);

  //开始计时

  REG(RFCORE_SFR_MTCTRL) &= (~RFCORE_SFR_MTCTRL_RUN);

  REG(RFCORE_SFR_MTCTRL) |= RFCORE_SFR_MTCTRL_RUN;

  for (int iii=0;iii<1000000;iii++)

  {

      test_int++;

  }

 

  test_low = REG(RFCORE_SFR_MTM0) & RFCORE_SFR_MTM0_MTM0;

  test_high = REG(RFCORE_SFR_MTM1) & RFCORE_SFR_MTM1_MTM1;

  test_count = test_low | (test_high << 8);

  test_count &= 0x0000FFFF;

  //读出计时时长

  printf("init test time2 : %d, high : %d, low : %d\n", test_count,test_high,test_low);

  printf("count : %d\n", test_int);

  // *******************************************************************

 

计算机读到的值为:

init test time1 : 0, high : 0, low : 0

init test time2 : 0, high : 0, low : 0

count : 1000000

 

如果将for循环改为clock_delay(50)或是printf一个东西,则第2次printf可以有读数,但是每次复位后读数差异巨大,毫无规律

init test time2 : 6465, high : 25, low : 65

init test time2 : 202, high : 0, low : 202

init test time2 : 14054, high : 54, low : 230

init test time2 : 20206, high : 78, low : 238

 

这到底是什么原因呢?

另外,\cpu\cc2538\clock.c中的clock_isr函数是每次和时钟有关的中断的时候都会进入吗?

望不吝赐教,感谢!

clock_delay(50)

可以看一下这个函数具体怎么实现的,是不是通过一个定时器,而这个定时器是不是被其他地方使用了,还有,有没有考虑定时器溢出。

您好,谢谢您的回答。

我现在的任务背景是在做移植,将MSP430中的一个协议移植过来,MSP430里面使用了TAR和TARR1来比较并产生中断,然后在中断处理函数中加入自己的代码。所以移植过来CC2538就想使用一个16bit的计数器和一个保存特定值的寄存器,计数器计数到寄存器中的值了之后产生中断,然后更新自己定义的一个值,这个功能好像只有MAC Timer可以实现,GPTM没看到有比较的功能。

您说的clock_delay函数仅仅调用了clock_delay_usec,后者的实现如下:

clock_delay_usec(uint16_t dt)
{

REG(GPT_0_BASE + GPTIMER_TAILR) = dt;

REG(GPT_0_BASE + GPTIMER_CTL) |= GPTIMER_CTL_TAEN;

/* One-Shot mode: TAEN will be cleared when the timer reaches 0 */
while(REG(GPT_0_BASE + GPTIMER_CTL) & GPTIMER_CTL_TAEN);
}

使用GPT0定时器的Timer A来进行计时。这个定时器和MACTimer应该不存在干涉啊,初始化的时候别处也没调用过clock_delay_usec和clock_delay这2个函数,实在是令人困惑。在之前的代码中,for了100000次之后难道不占用时间吗,为什么MACTimer定时器还是为0?

此外还有2个问题:

(1)是不是时间到了之后会发送一个中断,而所有时钟或定时器产生的中断都会交给clock_isr函数处理呢?MAC Timer的compare发生之后是不是也是clock_isr函数响应?

(2)MAC Timer的使用有没有可供参考的例子,或者类似有参考价值的使用例子也行?

问题有点长,望不吝赐教!谢谢啊!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top