初步探讨Zigbee之详细了解系统时钟(+电源管理)

振荡器合时钟

16MHz的内部RC振荡器+32MHz的外部晶振 =>系统主时钟源,RF收发需工作在精度更高的32MHz

32KHz的内部RC振荡器(32.753KHz)+32KHz的外部晶振 32.768KHz)=>为系统提供稳定的时钟信号校准

系统上电默认使用16M内部RC振荡器。


时钟控制命令寄存器CLKCONCMD:

初步探讨Zigbee之详细了解系统时钟(+电源管理)_第1张图片


时钟控制状态寄存器CLKCONSTA:

初步探讨Zigbee之详细了解系统时钟(+电源管理)_第2张图片

注意为只读寄存器

程序:
系统时钟源选择32MHz外部时钟
系统主时钟频率为32MHz
定时器标记输出为1MHz

    CLKCONCMD &= ~0x40; //选择系统时钟源为外部32MHz crystal oscillator          
    while((CLKCONSTA & 0x40) ==0);      //等待晶振稳定为32MHz
    CLKCONCMD &= ~0xCF;           
     //设置系统主时钟频率为32MHZ;
    CLKCONCMD |= 0x28; //定时器标记输出为1MHz 
    SLEEPCMD |= 0x04;//关闭不用的RC振荡器

供电模式

CC2530共有5种供电模式:

1、主动模式:完全功能模式,CPU、外设和RF模块都是 活动的;稳压器数字内核开启,高频振荡器/低频振荡器运行均运行;全神贯注高速工作

2、空闲模式:除CPU停止运行外,其它运行模式同主动模 式;休闲模式

3、PM1模式:稳压器数字内核开启,高频振荡器(内部16MHz、 外部32MHz)不运行,低频振荡器(内部32KHz或者外 部32KHz)运行;系统运行一个掉电序列;可快速唤醒,等待唤醒事件预期时间一般小于3ms;浅睡眠

4、PM2模式:具有较低功耗,稳压器数字内核关闭,高频振荡器不运行,低频振荡器(内部32KHz或者外部32KHz) 运行,除上电复位、外部中断、低频振荡器和睡眠定时器外,其它内部电路全部掉电;深睡眠

5、PM3模式:最低功耗模式,稳压器数字内核关闭,高低频 振荡器都不运行,仅支持复位和IO端口中断功能。昏迷

Main .c

#include
#include "uart.h"
#define LED1 P1_0
#define LED2 P1_1
char buff=0;
int len=0;
char buff1[10];
void uartinit();
void myprintf(char *data);
void clockinit();
void ledinit();
#pragma vector=URX0_VECTOR
__interrupt void URX0_ISR()
{
    URX0IF=0;
    buff=U0DBUF; //放入数据中
}
void main(void)
{   int i;
    clockinit();
    uartinit();
    ledinit();
   while(1) 
   {
     if(buff!=0)
     {
        if(buff!='\0')
       {  
         buff1[len++]=buff;  
       }

      if(buff1[0] == 'c')
       {
         LED1=0;
         LED2=0;
       } 
      if(buff1[0] == 'l')
       {
         LED1=1;
         LED2=1;
       } 
     }
    buff=0;
    len=0;
    for(i=0;i<10;i++)
    {
        buff1[i]=' ';
    }
   // myprintf(buff1);
   }
}
void ledinit()
{
    P1SEL &=~(3<<0);
    P1DIR |= 3; 
}

uart.h

#include
void uartinit();
void myprintf(char *data);
void clockinit();

uart.c

#include "uart.h"
void uartinit()
{
   P0SEL|=0X3C;      //设置为外设功能
   PERCFG&=~(1<<0);    //备用位置1优先
   P2DIR&=~(3<<6);     //设置串口0优先
   U0CSR|=(1<<7);     //使用串口模式
   U0BAUD|=216;        //波特率 57600
   U0GCR|=10;       //U0GCR |=10;

   UTX0IF=0;      //  UTX0IF=0,清除标志位
   U0CSR|=0X40;      //使能接收器
   IEN0|=(1<<2);      //使能串口0中断
   IEN0|=(1<<7);    //开总中断
}

void myprintf(char *data)
{
   while(*data!='\0')
   {
      U0DBUF= *data++;
      while((U0CSR & 0X02)==0);  // UTX0IF 
      //UTX0IF=0;
          U0CSR &=~0X02;
   }
}
void clockinit()
{
  CLKCONCMD &=~(1<<6);
  while((SLEEPSTA & 0X40) ==0);
  CLKCONCMD &=~0X47;
  SLEEPCMD|=0X04;
}

这里就完美的实现了串口接受到数据之后按照字符进行解析

注意使用串口助手波特率的设置!

你可能感兴趣的:(CC2530)