多语言展示
当前在线:1645今日阅读:23今日分享:25

cc2530 时钟系统

在初学Zigbee协议栈ZStack时,会接触到操作系统的概念。作为操作系统的心脏,准确的提供时钟尤为关键,下面简要介绍cc2530时钟的设定,学会自由设定系统时钟与低频时钟。
工具/原料
1

cc2530 技术手册

2

IAR Embedded Workbench

方法/步骤
1

首先需要了解cc2530芯片的时钟源,知道主时钟与低频时钟的概念,不清楚的可以先看我的分享《cc2530的时钟(datasheet)》。cc2530时钟源主要是4个:对于高频时钟(系统时钟)可以是外接的32MHz晶振,也可以是内部的16MHz RC振荡器;对于低频时钟(32kHz),可以是外接32.768MHz晶振,也可以是内部的32.768MHz RC振荡器。

2

参考帖子可以知道,石英晶体的精度高,但是耗电大、启动缓慢,而芯片内部自带的RC振荡器虽然精度略低,但启动速度快、耗电低,十分适合在低功耗场合,并且无需外接电子器件就可以工作,降低成本!在上电默认使用的是内部的RC振荡器!

3

为了自由配置所需要的时钟,主要借助于CLKCONCMD.OSC选择系统主时钟,而借助于CLKCONCMD.OSC32K则用于选择芯片32K时钟源!而低功耗模式设置时,需要借助于SLEEPCMD寄存器,在swru191e(cc2530datasheet)中并没有说明SLEEPCMD第二位功能,如下所示:

4

但是参考cc2430芯片的说明书可以发现,对应的SLEEP寄存器则有说明,如下所示,小编的理解是,TI收购Chipcon公司,随之将cc2430 2.4GHz Zigbee解决方案也收入,进一步优化芯片,更新电路IC设计,c2530与之前推出的2430芯片相比,应该具有许多相似之处,可能是cc2530推出不久,说明文档不够详细,当然不排除TI有意隐藏芯片细节的可能,字面的解释就是,当SLEEPCMD.OSC_PD为0时,32MHz晶振与16MHz RC振荡器都会起振:

5

对于SLEEPSTA寄存器中BIT6/BIT5说明在cc2530说明书中也并没有说明,可以参考cc2430说明书中内容,其中第6位XOSC_STB表明外部高速32M晶振是否上电并稳定起振,当稳定时该位为1;同样对于第5位HFRC_STB则表明内部16MHz高速RC振荡器是否起振,并是否稳定,当16MHz RC振荡器稳定时该位为1,如下图所示:

6

而当需要设置系统时钟时,借助于CLKCONCMD寄存器就可以选择芯片主时钟与32K时钟源,当设置稳定后,可以通过CLKCONSTA寄存器中第6位与第7位来反应当前时钟的选择情况,当时钟稳定后会置位相应的位,依此可以判断当前时钟设置情况!

7

此外,当配置完SLEEPCONCMD寄存器后,可以置位OSC_PD来关闭未被选择的高速时钟(16MHz EC振荡器或是32MHz 晶体振荡器),如下所示:

8

作为演示,小编写了一个示例代码用于配置cc2530时钟系统,如下所示:void wg_sys_clk_config(uint8 mclk,uint8 lclk){  uint16 i;    SLEEPCMD &= ~OSC_PD;   /* turn on 16MHz RC and 32MHz XOSC */   /* wait for 32MHz XOSC stable */  while (!(SLEEPSTA & XOSC_STB)||!(SLEEPSTA &HFRC_STB));     asm("NOP");           /* chip bug workaround */  for (i=0; i<504; i++) asm("NOP"); /* Require 63us delay for all revs */    /* Select system clock and the source for 32K clock */  CLKCONCMD = (mclk | lclk);   /* Wait for the change to be effective */   while (CLKCONSTA != (mclk | lclk));     SLEEPCMD |= OSC_PD;   /* turn off the oscillator not used*/ }

9

其中:#ifndef BV#define BV(n)      (1 << (n))#endif/* SLEEPCMD and SLEEPSTA bit definitions */#define OSC_PD     BV(2)  /* 0: Both oscillators powered up and stable                           * 1: oscillators not stable */#define XOSC_STB   BV(6)  /* XOSC: powered, stable=1 */#define HFRC_STB   BV(5)  /* HFRC: powerd , stable=1 */

推荐信息