在platform/contiki-main.c源文件下的main函数数的第一行代码就是实现clock的初始化,以下是其函数体
/*---------------------------------------------------------------------------*/
/*
* There is some ambiguity between TI cc2530 software examples and information
* in the datasheet.
*
* TI examples appear to be writing to SLEEPCMD, initialising hardware in a
* fashion semi-similar to cc2430
*
* However, the datasheet claims that those bits in SLEEPCMD are reserved
*
* The code here goes by the datasheet (ignore TI examples) and seems to work.
*/
void clock_init(void)
{
/* Make sure we know where we stand */
1.CLKCONCMD = CLKCONCMD_OSC32K | CLKCONCMD_OSC;
/* Stay with 32 KHz RC OSC, Chance System Clock to 32 MHz */
2.CLKCONCMD &= ~CLKCONCMD_OSC;
3.while(CLKCONSTA & CLKCONCMD_OSC);
/* Tickspeed 500 kHz for timers[1-4] */
4.CLKCONCMD |= CLKCONCMD_TICKSPD2 | CLKCONCMD_TICKSPD1;
while(CLKCONSTA != CLKCONCMD);
/* Initialize tick value */
5.timer_value = ST0;
6timer_value += ((unsigned long int)ST1) << 8;
75. timer_value += ((unsigned long int)ST2) << 16;
86.timer_value += TICK_VAL;
9.ST2 = (unsigned char)(timer_value >> 16);
10. ST1 = (unsigned char)(timer_value >> 8);
11. ST0 = (unsigned char)timer_value;
12. STIE = 1; /* IEN0.STIE interrupt enable */
}
函数第1句是对时钟控制命令寄存器进行初始化.cc2530设备有一个内部系统时钟或主时钟。该系统时钟的源既可以用16 MHz RC 振荡器,也可以采用32 MHz 晶体振荡器。时钟的控制可以使用CLKCONCMD SFR 寄存器执行。还有一个32 KHz 时钟源,可以是RC振荡器或晶振,也由CLKCONCMD 寄存器控制(
xosc是指外部的晶振给系统提供clock,rcosc是指单片机内部的RC震荡电路提供系统clock)。如图1所示:
图1
图2
CLKCONSTA寄存器是一个只读寄存器,用于读取当前定时器的状态.从CC2530手册上关于用CLKCONCMD 的描述可知第一句是让32KHz的RCOSC作为32kHz时钟的源(注意设置这个位的时候系统时钟要选择16MHz的RCOSC)。第二句是让系统时钟从16MHZ(上电系统默认时钟是这个时钟) 的RCOSC转换到32MHZ的XOSC.第三句是等待这个状态的完成.函数的第4句用于设置定时器1-4的Tick speed 为500Khz