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);
}
}
}