- CC2530在正常运行的时候需要一个高频时钟信号和一个低频的时钟信号
高频时钟信号,主要供给CPU,保证程序的运行。
低频时钟信号,主要供给看门狗、睡眠定时器等偏上外设。 - 时钟信号的来源:
高频信号有2个,芯片内部的16M RC电路;外接的32M石英晶振
低频信号也有2个来源,芯片内部的32K RC电路,外接的32.768K石英晶振。 - CC2530芯片默认上电的时候,是内部的2个RC电路作为高频和低频的时钟来源。
- 如果我们在用串口,特别是无线通信的时候,必须要用32M的石英晶振作为高频时钟来源。
- 高频时钟源特点:
2个高频时钟源可以同时起振产生高频时钟信号;
而2个低频时钟源,某一时刻只能有1个起振,并且起振的这个时钟源供给CC2530. - 32MHz表示不分频输出
16MHz表示2分频输出
以此类推
时钟
系统高频时钟源切换步骤:
- 让2个高频时钟源起振;
- 等待目标时钟源振荡稳定;
- 延时一小段时间63us;
- 不分频输出;
- 选中目标高频时钟源作为系统主时钟;
- 确认一下当前工作的系统时钟是不是所选的高频时钟;
相关寄存器:
SLEEPCMD、CLKCONCMD(命令寄存器)
SLEEPSTA、CLKCONSTA(状态寄存器)
- 让2个高频时钟源起振;
让SLEEPCMD的第2位为0;
2. 等待目标时钟源振荡稳定;
SLEEPSTA寄存器的第6位为1表示32M 时钟源稳定,如果为0表示还没有稳定
- 超过63微秒延时
- 不分频输出
把寄存器CLKCONCMD的低3位 设置为000,表示不分频输出
- 选中目标高频时钟源作为系统主时钟;
把寄存器CLKCONCMD的第6位 清0,设置32M作为系统主时钟
6. 确认一下当前工作的系统时钟是不是所选的高频时钟;
如果读CLKCONSTA这个寄存器的第6位为0,表示32M的时钟源已经作为了当前的系统主时钟,程序可以往下运行了。
例子
验证工作32MHz的模块和16MHz的模块从0数到9的的速度关系
默认为16MHz的程序
void delay()
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<800;j++);
}
void main()
{
char i;
LS164_Cfg();
while(1)
{
for(i=0;i<10;i++)
{
LS164_BYTE(i);
delay();
}
}
}
设置为32MHz的程序
#include<iocc2530.h>
#include"74LS164_8LED.h"
void delayus()
{
char k=63;
while(k--);
}
void delay()
{
int i,j;
for(i=0;i<1000;i++)
for(j=0;j<800;j++);
}
void Init32M()
{
SLEEPCMD &=0xFB;//1111 1011 开启2个高频时钟源
while(0==(SLEEPSTA & 0x40));// 0100 0000 等待32M稳定
delayus();
CLKCONCMD &=0xF8;//1111 1000 不分频输出
CLKCONCMD &=0XBF;//1011 1111 设置32M作为系统主时钟
while(CLKCONSTA & 0x40); //0100 0000 等待32M成功成为当前系统主时钟
}
void main()
{
char i;
LS164_Cfg();
Init32M();
while(1)
{
for(i=0;i<10;i++)
{
LS164_BYTE(i);
delay();
}
}
}