现在的位置: 首页 > 综合 > 正文

Contiki学习笔记之时钟初始化

2018年04月11日 ⁄ 综合 ⁄ 共 1513字 ⁄ 字号 评论关闭

  在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
 

抱歉!评论已关闭.