cc2538的mac timer使用问题
您好!我现在使用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的使用有没有可供参考的例子,或者类似有参考价值的使用例子也行?
问题有点长,望不吝赐教!谢谢啊!