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

cc2530晶振与时钟

2017年03月26日 ⁄ 综合 ⁄ 共 1662字 ⁄ 字号 评论关闭

CC2530有四个晶振,两个内部(16M RC晶振,32K RC晶振),两个外部(32.768K的石英晶振,32M的石英晶振),石英晶振的精度高,耗电大,启动慢。RC晶振精度低一点,耗电小,启动快。在上电时,默认是使用内部的两个晶振,因为内部这两个RC晶振速度快。外部的32.768石英晶振也可以不接。两个低频晶振不能同时上电,即不能同时起振。
cc2530数据手册上SLEEPCMD这个寄存器的第2位(从第0位开始计)说明是错误,该位的正确说明,应当看cc2430的数据手册SLEEP寄存器的第2位。当该位为0时,将两个高频晶振同时上电;该位为1时,将CLKCONCMD.OSC位没有选择的高频晶振关闭。同样的,cc2530数据手册SLEEPSTA这个寄存器的第6位和第5位说明是错误,这两位的正确说明,应当看cc2430的数据手册SLEEP寄存器的第6位和5位。
#include <iocc2530.h>
#include <string.h>

#define LED1 P1_0

#define uint16 unsigned int

void Hal_Init_Mcu(void)
{
  SLEEPCMD &= ~0X04;                                 //将两个高频的晶振同时上电(即同时开启)
  while(!(SLEEPSTA & 0x20) || !(SLEEPSTA & 0x40));  //等待两个高频晶振都稳定
  asm("NOP");
  {
    uint16 i;
    for(i=0;i<504;i++)
      asm("NOP");
  }
  CLKCONCMD = 0X00;
  SLEEPCMD |= 0X04;
}

void Hal_Init_Led(void)
{
  P1DIR |= 0X01;
  LED1 = 0;
}

void HAL_Set_MainClock(uint16 source)
{
  register uint16 usc32k_bm = CLKCONCMD & 0X80;       //将选择的低频晶振的值保存
  SLEEPCMD &= ~0X04;                                  //将两个高频的晶振同时上电(即同时开启)
  while(!(SLEEPSTA & 0x20) || !(SLEEPSTA & 0x40));    //等待两个高频晶振都稳定
  asm("NOP");
  {
    uint16 i;
    for(i=0;i<504;i++)
      asm("NOP");
  }
  
  if(source ==0)//选择32M的石英晶振
    CLKCONCMD = (usc32k_bm | 0X00);
  else          //选择32M的RC晶振
    CLKCONCMD = (usc32k_bm | 0X40 | (0X01<<3) | 0x01);
  
  //等待设置稳定下来
  uint16 cmd = CLKCONCMD;
  while(1)
  {
    uint16 sta = CLKCONSTA;
    if(cmd == sta)
      break;
  }
  SLEEPCMD |= 0X04;           //去掉没有选择的高频晶振
  
}

void delay(uint16 n)
{  
    uint16 i,j; 
    for(j=0;j<15;j++)
      for(i=0;i<n;i++); 
}

void main(void)
{
  Hal_Init_Mcu();
  Hal_Init_Led();
  
  while(1)
  {
    HAL_Set_MainClock(0);
    for(int i=0;i<10;i++)
    {
      LED1 = !LED1;
      delay(10000);
    }
    
    LED1 = 1;
    delay(50000);
    
    HAL_Set_MainClock(1);
    for(int i=0;i<10;i++)
    {
      LED1 = !LED1;
      delay(10000);
    }
  }
  
}

抱歉!评论已关闭.