WSN之振盪器和時鐘

時鐘的控制可以使用 CLKCONCMD SFR 寄存器執行。
CLKCONSTA 寄存器是一個只讀的寄存器,用於獲得當前時鐘狀態。

注意改變 CLKCONCMD.OSC 位不會立即改變系統時鐘。時鐘源的改變首先在 CLKCONSTA.OSC =
CLKCONCMD.OSC 的時候生效。

1.CC2530在正常運行的時候需要體用一個高頻的時鐘信號和一個低頻的時鐘信號
高頻時鐘信號:主要供給CPU,保證程序的執行
低頻時鐘信號:主要供給看門狗,睡眠定時器等片上的外設

2.時鐘信號的來源(晶振或者RC振盪器)
晶振-> 心臟
CPU -> 大腦
RC振盪器:由電阻和電容構成的振盪器,震盪頻率有誤差;
晶振:在晶體板極上交變電壓,就會使晶片產生機械變形震動,當外加電壓頻率等於晶體諧振器的固有頻率時,就會發生壓電諧振。
高頻時鐘信號有兩個:芯片內部的16M RC電路,外接的32M 石英晶振。
低頻時鐘信號有兩個:芯片內部的32 k RC電路外接的電路的32.768k 石英晶振。

3.CC2530在上電的時候,默認使用是內部的2個RC電路作爲高頻和低頻時鐘來源。

步驟:
1、 讓CLKCONCMD寄存器的第六位清零,設置32M爲系統主時鐘
2、 讓CLKCONCMD寄存器的低3位清零,不分頻輸出
3、 如果讀CLKCONSTA寄存器的第六位爲0,表示會32M的時鐘源已經作爲當前系統主時鐘。

#include<ioCC2530.h>


#define LED1  P1_0
#define LED2  P1_1
#define KEY   P1_3



//延遲
void delay_ms(int time)
{
  int i,j;
  for(i=0;i<time;i++)
  {
    for(j=0;j<240;j++)
    {
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
      asm("NOP");
    }
  }
}


//32 M
void Init_32M()
{
  CLKCONCMD &= ~(1<<6);
  CLKCONCMD &=~0x07;   //CLKCONCMD &=0x01;
  while(!(CLKCONSTA &0x40)); //等待系統時鐘穩定
}

//16M
void Init_16M()
{
  CLKCONCMD &=(1<<6);
  CLKCONCMD &=~0x06;
  //while(!(CLKCONSTA & 0x40));
}

//主函數
void main()
{
  P1DIR |=0x03;
  LED1=0;
  LED2=0;

  //32M
  int number1=10;
  Init_32M();
  while(number1--)
  {
      LED1=!LED1;
      delay_ms(1000);
      LED2=1;
  }

  //16M
  int number2=10;
  Init_16M();
  while(number2--)
  {
      LED1=!LED1;
      delay_ms(1000);
      LED2=0;
  }

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章