BLE开发笔记——时钟和晶振

一个系统运行要稳定,其时钟必须稳定,学习CC2541开发,应该了解时钟的配置,需要了解时钟的寄存器:CLKCONCMD和CLKCONSTA,CMD,command,是用于配置时钟;STA,state,看状态的,用来检测是否配置成功。为了低功耗的设置,还应该了解SLEEPCMD和SLEEPSTA这两个寄存器,与时钟的电源相关的,本文讲一下时钟的初始化。

有关这四个寄存器的详细信息在 BLE开发——CC2541寄存器整理 里有列出来,这里就不再说明。

这里根据我自己的情况,需要将系统主时钟配置为32M外部晶振,要借助CLKCONCMD.OSC配置,选择32K时钟源为内部RC振荡器,要借助CLKCONCMD.OSC32K。再者就是配置工作模式,只需关心其中有关时钟的配置即可,SLEEPCMD.OSC_PD,这里要说明的是SLEEPCMD.OSC_PD为0时会开启所有振荡器电源,能保证32MHz晶振和16MHz RC振荡器都能起振,通过检查SLEEPSTA.XOSC_STB来确定32MHz晶振是否起振。

那么可以按照以下代码实现系统时钟的初始化,根据注释理解过程即可:

void oscInit(void) {
    SLEEPCMD &= ~0x04;                      // 启动所有晶振,SLEEPCMD.OSC_PD设为0
    while (!(SLEEPSTA & 0x40));             // 等待晶振稳定,检查SLEEPSTA.XOSC_STB,确认32MHz外部晶振起振

    CLKCONCMD = (CLKCONCMD & 0x80) | 0x49;  // 使用16M晶振作为主时钟
    while ((CLKCONSTA & ~0x80) != 0x49 );   // 等待主时钟切换到16M晶振

    CLKCONCMD = (CLKCONCMD & ~0x80) ;       // 使用外部32K晶振作为休眠时钟
    while ( (CLKCONSTA & 0x80) != 0 );      // 等待睡眠时钟切换到外部32K晶振

    CLKCONCMD = (CLKCONCMD & 0x80) ;        // 使用32M晶振作为主时钟
    while ( (CLKCONSTA & ~0x80) != 0 );     // 等待主时钟切换到32M晶振

    SLEEPCMD |= 0x04;                       // 关闭未使用的晶振
}

ble

700 字

2015-10-30 11:00 +0800