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);
}
}
}
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);
}
}
}
相关文章推荐
- cc2530晶振与时钟
- 晶振、时钟信号、锁相环、分频器
- stm32变更外部晶振时如何配置时钟、以及HSI的使用
- CC2530 Debug ---CC2530 无启动之32K晶振
- 单片机系统时钟与实时时钟有什么区别?为什么有的系统时钟晶振使用12M,而实时时钟使用32.768K
- 32.768KHZ时钟晶振在电子产品中起到的重要作用
- cc2530的时钟
- 3225有源时钟,晶振封装管脚定义
- STM32L151系列标准库时钟晶振修改
- 晶振,时钟PLL,CPU,APBI,TIM,电源,电路,看门狗等等stm32工作原理的通俗解释。
- 晶振、时钟信号、锁相环、分频器
- CC2530学习之时钟与振荡器
- 为什么实时时钟的晶振都是32.768KHZ呢
- STM32F4板子晶振更改后时钟的配置
- CC2530之时钟源
- 【STM32F103攻城笔记】内部晶振HSI倍频设置系统时钟
- 基于计算机时钟晶振的高精度时间的获取
- STM32F107(互联网型)外部晶振用25MHZ 而STM32F103却用8MHZ的原因及其时钟来源分析
- ZigBee_CC2530_0DH_关于协议栈时钟的一些记录
- STM32时钟配置,不同晶振时需要配置的程序