晶振与时钟
cc2530有一个内部系统时钟,或者说是主时钟。系统时钟源是16Mhz的RC晶振或是32MHz晶体震荡器。利用CLKCONCMD特殊功能寄存器可以控制时钟。
此外,芯片还有一个32KHz时钟源可以是RC振荡器或是晶体振荡器,同样也可以用CLKCONCMD寄存器控制。
其中只读寄存器CLKCONSTA可以用来获得当前时钟状态。高精度的晶体振荡器或是低功耗的RC振荡器都可以成为振荡器的选择,需要注意的是:RF接收器要求使用32MHz晶体振荡器。如下图所示即为时钟结构图:
晶体振荡器
在芯片内部,有2个高频振荡器,一个是32MHz的晶体振荡器,另一个是16MHz的RC晶振。32MHz晶振的启动时间对于某些应用显得有些长,因此芯片可以先在16MHz RC晶振上运行,直到晶体振荡器稳定。16MHzd的RC振荡器比晶体振荡器消耗更少能量,但是精度而言比晶体振荡器差一些,并且不能作为RF传输的运行时钟。
此外,芯片还有2个低频振荡器分别是32KHz的晶体振荡器与32KHz的RC振荡器。其中,32KHz XOSC设计运行在32.768KHz频率上,并且为需要时间准确的系统提供了一个稳定的时钟信号。校验后,32KHz的RCOSC在32.753KHz频率上运行。
需要注意的是校验只能在32MHz XOSC使能的情况下才被允许。与32KHz XOSC 振荡器相比,32KHz的RC振荡器更适宜于较少成本与能耗。
请注意:这2个32KHz的振荡器不能同时使用。
系统时钟
系统时钟来自于所选择的系统时钟源,可以是32MHz的XOSC(晶体振荡器)或者是16MHz的RCOSC(RC振荡器).寄存器CLKCONCMD中OSC位选择系统时钟源,需要指出的是,如果要用RF传输,那么32MHz的晶体振荡器必须被选择作为主时钟并且稳定。
改变CLKCONCMD中的OSC位并不能立刻改变系统时钟,只有当CLKCONSTA寄存器中的OSC位与CLKCONCMD中OSC位相同时才能起作用。这归因于对拥有稳定的时钟的需求优先于改变时钟源。此外,CLKCONCMD中的CLKSPD位如同镜子一样反映CLKCONCMD.OSC位。
当32MHz XOSC晶振选为系统时钟并且稳定之后,16MHz RC振荡器进行校验,例如CLKCONSTA寄存器的OSC位从1变为0。
32KHz时钟选择如上所述,在器件上有2个32KHz时钟源,在复位之后默认会使能32KHz的RC振荡器,并作为32KHz的时钟源,32KHz的RC振荡器能耗小,但与32KHz的晶体振荡器相比精度上差许多。被选择的32KHz时钟源用于驱动休眠时钟,为看门狗产生滴答时钟,并可以用作定时器TIM2的闸门(strobe)用来计算休眠定时器的休眠时间。定时器控制寄存器中OSC32K位用于选择振荡器,作为32KHz的时钟源。CLKCONCMD寄存器的OSC32K位可以随时写入。振荡器在活跃的系统时钟源之前是不会起作用的。当系统时钟从16MHz改变为32MHz的晶体振荡器(CLKCONCMD.OSC从1到0)一旦32KHz RC振荡器被选中了它的的校验就启动了并且被执行。在校准期间,32MHz晶体振荡器的一个分频量会被使用。32KHzRCOSC振荡器校准后的结果是它会工作在32.753kHz上。32kHz RC振荡器校准时间可能要2ms时间来完成。可以设置SLEEPCMD.OSC32K_CALDIS位设置为1的话,会关闭校准。在校准结束时,会在32KHz时钟源上产生一个额外的脉冲,会导致睡眠定时器增加1。注意:当切换到32KHz晶体振荡器后和从32KHz晶体振荡器被设置的PM3模式唤醒时,振荡器稳定到准确频率的时间在500 ms以上。睡眠定时器、看门狗定时器和时钟损失探测器在32KHz晶体振荡器稳定之前不能使用。
cc2530时钟源主要是4个:对于高频时钟(系统时钟)可以是外接的32MHz晶振,也可以是内部的16MHz RC振荡器;对于低频时钟(32kHz),可以是外接32.768kHz晶振,也可以是内部的32.768kHz RC振荡器。
参考帖子可以知道,石英晶体的精度高,但是耗电大、启动缓慢,而芯片内部自带的RC振荡器虽然精度略低,但启动速度快、耗电低,十分适合在低功耗场合,并且无需外接电子器件就可以工作,降低成本!在上电默认使用的是内部的RC振荡器!
为了自由配置所需要的时钟,主要借助于CLKCONCMD.OSC选择系统主时钟,而借助于CLKCONCMD.OSC32K则用于选择芯片32K时钟源!
而低功耗模式设置时,需要借助于SLEEPCMD寄存器,在swru191e(cc2530datasheet)中并没有说明SLEEPCMD第二位功能,如下所示:
但是参考cc2430芯片的说明书可以发现,对应的SLEEP寄存器则有说明,如下所示,小编的理解是,TI收购Chipcon公司,随之将cc2430 2.4GHz Zigbee解决方案也收入,进一步优化芯片,更新电路IC设计,c2530与之前推出的2430芯片相比,应该具有许多相似之处,可能是cc2530推出不久,说明文档不够详细,当然不排除TI有意隐藏芯片细节的可能,字面的解释就是,当SLEEPCMD.OSC_PD为0时,32MHz晶振与16MHz RC振荡器都会起振振
:
对于SLEEPSTA寄存器中BIT6/BIT5说明在cc2530说明书中也并没有说明,可以参考cc2430说明书中内容,其中第6位XOSC_STB表明外部高速32M晶振是否上电并稳定起振,当稳定时该位为1;同样对于第5位HFRC_STB则表明内部16MHz高速RC振荡器是否起振,并是否稳定,当16MHz RC振荡器稳定时该位为1,如下图所示:
而当需要设置系统时钟时,借助于CLKCONCMD寄存器就可以选择芯片主时钟与32K时钟源,当设置稳定后,可以通过CLKCONSTA寄存器中第6位与第7位来反应当前时钟的选择情况,当时钟稳定后会置位相应的位,依此可以判断当前时钟设置情况!
此外,当配置完SLEEPCMD寄存器后,可以置位OSC_PD来关闭未被选择的高速时钟(16MHz EC振荡器或是32MHz 晶体振荡器)(可能是第三位写1,来实现此功能对于CC2530),如下所示
作为演示,小编写了一个示例代码用于配置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*/ }
其中:#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 */
cc2530有一个内部系统时钟,或者说是主时钟。系统时钟源是16Mhz的RC晶振或是32MHz晶体震荡器。利用CLKCONCMD特殊功能寄存器可以控制时钟。
此外,芯片还有一个32KHz时钟源可以是RC振荡器或是晶体振荡器,同样也可以用CLKCONCMD寄存器控制。
其中只读寄存器CLKCONSTA可以用来获得当前时钟状态。
CLKCONCMD:时钟频率控制寄存器。
D7 |
D6 |
D5~D3 |
D2~D0 |
32KHZ时间振荡器选择 |
系统时钟选择 |
定时器输出标记 |
系统主时钟选择 |
D7位为32KHZ时间振荡器选择,,0为32KRC震荡,1为32K晶振。默认为1。
D6位为系统时钟选择。0为32M晶振,1为16M RC震荡。当D7位为0时D6必须为1。
D5~D3为定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。默认为001。需要注意的是:当D6为1时,定时器频率最高可采用频率为16MHZ。
D2~D0:系统主时钟选择:000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。当D6为1时,系统主时钟最高可采用频率为16MHZ。
CLKCONSTA:时间频率状态寄存器。
D7 |
D6 |
D5~D3 |
D2~D0 |
当前32KHZ时间振荡器 |
当前系统时钟 |
当前定时器输出标记 |
当前系统主时钟 |
D7位为当前32KHZ时间振荡器频率。0为32KRC震荡,1为32K晶振。
D6位为当前系统时钟选择。0为32M晶振,1为16M RC震荡。
D5~D3为当前定时器输出标记。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为 1MHZ,110为500KHZ,111为250KHZ。
D2~D0为当前系统主时钟。000为32MHZ,001为16MHZ,010为8MHZ,011为4MHZ,100为2MHZ,101为1MHZ,110为500KHZ,111为250KHZ。
高精度的晶体振荡器或是低功耗的RC振荡器都可以成为振荡器的选择,需要注意的是:RF接收器要求使用32MHz晶体振荡器。如下图所示即为时钟结构图:
在芯片内部,有2个高频振荡器,一个是32MHz的晶体振荡器,另一个是16MHz的RC晶振。32MHz晶振的启动时间对于某些应用显得有些长,因此芯片可以先在16MHz RC晶振上运行,直到晶体振荡器稳定。16MHzd的RC振荡器比晶体振荡器消耗更少能量,但是精度而言比晶体振荡器差一些,并且不能作为RF传输的运行时钟。
此外,芯片还有2个低频振荡器分别是32KHz的晶体振荡器与32KHz的RC振荡器。其中,32KHz XOSC设计运行在32.768KHz频率上,并且为需要时间准确的系统提供了一个稳定的时钟信号。校验后,32KHz的RCOSC在32.753KHz频率上运行。
需要注意的是校验只能在32MHz XOSC使能的情况下才被允许。与32KHz XOSC 振荡器相比,2KHz的RC振荡器更适宜于较少成本与能耗。
请注意:这2个32KHz的振荡器不能同时使用。如下所示即为系统时钟控制寄存器CLKCONCMD中部分控制位:
系统时钟来自于所选择的系统时钟源,可以是32MHz的XOSC(晶体振荡器)或者是16MHz的RCOSC(RC振荡器).寄存器CLKCONCMD中OSC位选择系统时钟源,需要指出的是,如果要用RF传输,那么32MHz的晶体振荡器必须被选择作为主时钟并且稳定。
改变CLKCONCMD中的OSC位并不能立刻改变系统时钟,只有当CLKCONSTA寄存器中的OSC位与CLKCONCMD中OSC位相同时才能起作用。这归因于对拥有稳定的时钟的需求优先于改变时钟源。此外,CLKCONCMD中的CLKSPD位如同镜子一样反映CLKCONCMD.OSC位。
当32MHz XOSC晶振选为系统时钟并且稳定之后,16MHz RC振荡器进行校验,例如CLKCONSTA寄存器的OSC位从1变为0。
32KHz时钟选择
如上所述,在器件上有2个32KHz时钟源,在复位之后默认会使能32KHz的RC振荡器,并作为32KHz的时钟源,32KHz的RC振荡器能耗小,但与32KHz的晶体振荡器相比精度上差许多。被选择的32KHz时钟源用于驱动休眠时钟,为看门狗产生滴答时钟,并可以用作定时器TIM2的闸门(strobe)用来计算休眠定时器的休眠时间。定时器控制寄存器中OSC32K位用于选择振荡器,作为32KHz的时钟源。
CLKCONCMD寄存器的OSC32K位可以随时写入。振荡器在活跃的系统时钟源之前是不会起作用的。当系统时钟从16MHz改变为32MHz的晶体振荡器(CLKCONCMD.OSC从1到0)一旦32KHz RC振荡器被选中了它的的校验就启动了并且被执行。在校准期间,32MHz晶体振荡器的一个分频量会被使用。32KHzRCOSC振荡器校准后的结果是它会工作在32.753kHz上。32kHz RC振荡器校准时间可能要2ms时间来完成。可以设置SLEEPCMD.OSC32K_CALDIS位设置为1的话,会关闭校准。在校准结束时,会在32KHz时钟源上产生一个额外的脉冲,会导致睡眠定时器增加1。注意:当切换到32KHz晶体振荡器后和从32KHz晶体振荡器被设置的PM3模式唤醒时,振荡器稳定到准确频率的时间在500 ms以上。睡眠定时器、看门狗定时器和时钟损失探测器在32KHz晶体振荡器稳定之前不能使用。
定时器滴答值产生器
CLKCONCMD.TICKSPD寄存器控制timer1、timer3和timer4的全局预分频。预分频的值设置范围在0.25MHz和32MHz之间。
需要注意的是如果CLKCONCMD.TICKSPD显示的频率高于系统时钟,则在CLKCONSTA.TICKSPD中的实际的预分频值表明是和系统时钟的值是一样的。
数据滞留
在PM2和PM3电源模式中,绝大多数的内部电路关闭了,然而,SRAM中任保留它的内容,内部寄存器的值也会保留。
保留数据的寄存器是CPU的寄存器、外部寄存器和RF寄存器,除非另一些位域值设置的比较特殊。切换到PM2和PM3模式的现象对于软件而已是透明的。
注意在PM3模式下睡眠定时器的值不会保存。
CC2530的时钟模块
(cc2530_datasheet节选翻译如下)
******************************************************************
* 作 者:fulinux
* 转载声明:点击链接
******************************************************************