您的位置:首页 > 其它

cc2530晶振与时钟

2014-04-15 22:59 375 查看
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);

}

}



}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: