zigbee_cc2530--系统切换高频时钟源

系统切换高频时钟源(32M)

1、让两个时钟源起振

2、等待时钟源稳定

3、延时一小段时间(大于63Us)

4、不分频输出(即输出32M)

5、选择高频时钟源作为主频

6、确认当前系统时钟是不是选定的高频时钟源

共用到4个寄存器

SLEEPCMD、SLEEPSTA、CLKCONCMD、CLKCONSTA

SLEEPCMD 的第2位 如果为0 则开启两个振荡源;如果为1 则关闭CPU没有使用的那个时钟源。

1、所以让SLEEPCMD的第二位为0,开启两个时钟源。

SLEEPSTA的第6位为0,则说明还没有稳定;如果为1,则说明稳定了;

2、要等待时钟源稳定,所以查询SLEEPSTA的第6位是否为1。

3、延时大于63us

CLKCONCMD的低3位是控制分频,000表示不分频输出

000 32M
001 16M
010 8M
011 4M
100 2M
101 1M
110 500K
111 250K

4、所以将CLKCONCMD的低3位设置为000.表示不分频

CLKCONSTA的第6位控制的是系统的主时钟,默认情况下为1,即使用RC16M;当为0时,表示使用外部32M

5、所以将CLKCONCMD的第6位置0

6、检查CLKCONSTA的第6位,如果为1,则表示系统还是16M的时钟源,如果为0则表示时钟源为32M。

代码如下

#include
#include
#define uint unsigned int
#define uchar unsigned char

void delay()
{
  uint x,y;
  for(x=0;x<250;x++)
    for(y=0;y<2000;y++);
}
void delayus()
{
  uchar x=250;
  while(x--);
}
void change32M()
{
  SLEEPCMD &= ~0x04;//让两个时钟源起振
  while(0==(SLEEPSTA & 0x40));//检测第6位是否位1,表示时钟源稳定
  delayus();//延时63us
  CLKCONCMD &= ~0x07;  //低三位设置分频,此处设置为000,表示不分频
  CLKCONCMD &= ~0x40;  //第6为置0表示使用32M的时钟源
  while(CLKCONSTA & 0x40); //检测第6位是否为0,为0则表示此时系统统时钟使用的时32M的时钟源
}
void Init()
{
  P1DIR |= 0x01; //P1_0
}
void main()
{
  Init();
  change32M();
  while(1)
  {
    P1_0 ^=1;
    delay();
  }
}

你可能感兴趣的:(笔记)