ZigBee快速入门03

时钟配置

CC2530时钟特点

  • CC2530在正常运行的时候需要一个高频时钟信号和一个低频的时钟信号
    高频时钟信号,主要供给CPU,保证程序的运行。
    低频时钟信号,主要供给看门狗、睡眠定时器等偏上外设。
  • 时钟信号的来源:
    高频信号有2个,芯片内部的16M RC电路,外接的32M石英晶振
    低频信号也有2个,芯片内部的32K RC电路,外接的32.768K石英晶振。
  • CC2530芯片默认上电的时候,是内部的2个RC电路作为高频和低频的时钟来源
  • 在用串口,特别是无线通信的时候,必须要用32M的石英晶振作为高频时钟来源
  • 高频时钟源特点:
    2高频时钟源可以同时起振产生高频时钟信号;
    而2个低频时钟源,某一时刻只能有1个起振,并且起振的这个时钟源供给CC2530

系统高频时钟源切换

  1. 让2个高频时钟源起振
  2. 等待目标时钟源振荡稳定
  3. 延时63us一小段时间
  4. 不分频输出
  5. 选中目标高频时钟源作为系统主时钟
  6. 确认一下当前工作的系统时钟是不是所选的高频时钟

时钟相关寄存器

时钟系统总览
zg0301
SLEEPCMD寄存器
OSC_PD:高频32MHz和16MHz掉电设置(复位为1)
0:两个振荡器都已上电
1:没有被CLKCONCMD.OSC位选中的掉电

SLEEPCMD寄存器的位76:321:0
名称OSC32K_CALDISOSC_PDMODE[1:0]

SLEEPSTA寄存器

SLEEPSTA寄存器的位76:54:32:10
名称OSC32K_CALDISRST[1:0]CLK32K

CLKCONCMD寄存器

CLKCONCMD寄存器的位765:32:0
名称OSC32KOSCTICKSPD[2:0]CLKSPD

CLKCONSTA寄存器

CLKCONSTA寄存器的位765:32:0
名称OSC32KOSCTICKSPD[2:0]CLKSPD

代码

void Cfg32M() {
    SLEEPCMD &= 0xFB; // 1111 1011   让SLEEPCMD的第2位为0
    while((SLEEPSTA & 0x40) == 0); //0100 0000   SLEEPSTA寄存器的第6位为1表示32M 时钟源稳定
    CLKCONCMD &= 0xF8; //1111 1000   把寄存器CLKCONCMD的低3位设置为000,表示不分频输出
    CLKCONCMD &= 0xBF; //1011 1111   把寄存器CLKCONCMD的第6位 清0,设置32M作为系统主时钟
    while((CLKCONSTA & 0x40) == 1); //0100 0000   如果读CLKCONSTA这个寄存器的第6位为0,表示32M的时钟源已经作为了当前的系统主时钟
    SLEEPCMD |= 0x04; // 0000 0100   16M时钟掉电
}

串口配置

配置步骤

  1. 指定串口的IO位置
  2. 相应IO配置成片上外设功能
  3. 8个数据位,1个停止位,无流控,无校验确立
  4. 设置波特率
  5. 开CPU中断,对应串口接收中断

串口相关寄存器

外设IO引脚映射(CC2530具有2个串口,且每个串口都可以配置选择控制脚)
zg0302
zg0303
外设控制寄存器PERCFG
0:备用位置1,1:备用位置2

PERCFG寄存器的位76543:210
名称T1CFGT3CFGT4CFGU1CFGU0CFG

串口控制和状态寄存器UxCSR(x=0,1)
MODE:模式选择,0表示SPI模式,1表示UART模式
RE:接受使能,0表示接收关闭,1表示接收使能

UxCSR寄存器的位76543210
名称MODERESLAVEFEERRRX_BYTETX_BYTEACTIVE

串口普通控制寄存器UxGCR(x=0,1)

UxGCR寄存器的位7654:0
名称CPOLCPHAORDERBAUD_E[4:0]

串口波特率控制寄存器UxBAUD(x=0,1)

UxBAUD寄存器的位7:0
名称BAUD_M[7:0]

串口收发数据缓冲寄存器UxDBUF(x=0,1)
读:接收数据,写:发送数据

UxDBUF寄存器的位7:0
名称DATA[7:0]

32MHz系统时钟波特率设置
zg0304
TCON寄存器

TCON寄存器的位76543210
名称URX1IFADCIFURX0IFIT1RFERRIFIT0

代码

#include <iocc2530.h>

void Cfg32M(){
    SLEEPCMD &= 0xFB; // 1111 1011
    while((SLEEPSTA & 0x40) == 0); //0100 0000
    CLKCONCMD &= 0xF8; //1111 1000
    CLKCONCMD &= 0xBF; //1011 1111
    while((CLKCONSTA & 0x40) == 1); //0100 0000
    SLEEPCMD |= 0x04; // 0000 0100
}


void Uart0Cfg(){
    PERCFG &= 0xFE; // 1111 1110
    P0SEL |= 0x0C; // 0000 1100

    U0CSR |= 0xC0; //1100 0000

    U0GCR = 11;
    U0BAUD = 216;  //set baudrate

    URX0IE = 1;
    EA = 1;
}

int main()
{
    Cfg32M();
    Uart0Cfg();

    while(1);
}

#pragma vector=URX0_VECTOR
__interrupt void UART0_ISR(){
    char ch;
    URX0IF = 0;   //串口0来数据的标志位,硬件会置1,软件手动清零
    ch = U0DBUF;  //从接收寄存器中取字节存入变量ch

    U0DBUF = ch;  //将变量ch中的值赋给串口0发送寄存器
    while(UTX0IF == 0);
    UTX0IF = 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值