ZigBee-时钟源切换-串口配置

ZigBee-时钟源切换-串口配置

高频时钟源切换步骤:

用到的寄存器:SLEEPCMD,SLEEPSTA,CLKCONCMD,CLKCONSTA

1.让两个高频时钟源同时起震,让SLEEPCMD的第2位=0(把没用的时钟源关掉)

2.等待目标时钟源震荡稳定,SLEEPSTA寄存器的第6位=1表示32M 时钟源稳定

3.延时一小段时间63us,超过63微秒延时

4.不分频输出,把寄存器CLKCONCMD的低3位 设置为000,表示不分频输出

5.1选中高频时钟源作为系统主时钟,把寄存器CLKCONCMD的第6位 =0,设置32M作为系统主时钟

5.2.确认选没选上(是否设置成功),如果读CLKCONSTA这个寄存器的第6位为0,表示32M的时钟源已经作为了当前的系统主时钟,程序可以往下运行了

6.把没用的时钟源关掉


void InitClock(void)
{
    SLEEPCMD &= ~0x04;
    while(!(SLEEPSTA & 0x40));
    delay();
    CLKCONCMD &= ~0x47;
    while(CLKCONSTA & 0x40);
    SLEEPCMD |= 0x04;
}

串口配置:

以串口0为例

1.指定串口的IO位置。PERCFG第0位=0为备用位置1,P0的23位

2.配置IO为片上外设功能。PXSEL

3.8个数据位,1个停止位,无流控,无校验确立。U0CSR |= 0xC0,先不用关心怎么来的

4.设置波特率。U0GCR = 小数,U0BAUD = 大数,查数据手册,先不用关心怎么计算

5.开总中断,对应串口中断。EA = 1;URX0IE = 1;

6.中断函数写法


void InitUart(void)
{
    PERCFG &= ~0x01;
    P0SEL |= 0x0C;
    U0CSR |= 0xC0;
    U0GCR = 8;
    U0BAUD = 59;
    EA = 1;
    URX0IE = 1;
}

#pragma vector = URX0_VECTOR
__interrupt void InterruptUart(void)
{
    unsigned char ch;
    URX0IF = 0;
    ch = U0DBUF;
    U0DBUF = ch + 1;
    while(UTX0IF==0);
    UTX0IF = 0;
}

你可能感兴趣的:(ZigBee-时钟源切换-串口配置)