上次看到论坛里有人需要CC430的时钟,这篇笔记就是了
大家都知道,单片机工作离不开时钟,在我们熟悉的51单片机里面,就是外部那个11.0592M或者12M的晶振给单片机的CPU和片上外设提供时钟节拍。
430也是一样,但是430的时钟系统比51要先进和复杂很多。
51的时钟源只有一个,来自外部晶振,直接提供给内部工作;而430的时钟是一个专门的模块,至少有3个可选时钟源(CC430有5个),这些基本的时钟源不直接提供给CPU和外设使用,而是经过一些数据选择器和分频器,得到3个有用的时钟信号。430的CPU和片上外设可以根据需要,选择这3个时钟信号中合适的时钟。430的低功耗跟它的时钟系统有很大关系。
CC430的时钟模块叫UCS(Unified Clock System),模块示意图:
CC430中一共有5个时钟源:XT1CLK、VLOCLK、REFOCLK、DCOCLK、XT2CLK
XT1CLK:这是一个低频时钟源,由外部提供,一般是外接32.768kHz的手表晶振,无需外加电容。
VLOCLK:这是一个集成在片上时钟源,低频低功耗,频率典型值是10kHz。
REFOCLK:这也是一个片上时钟源,频率典型值32.768kHz。
DCOCLK:这是一个片上的DCO数控振荡器,可以用片上FLL锁定。
XT2CLK:这是一个高频时钟源,由外部提供,用来给CC430的RF模块提供时钟,一般是外接26MHz晶体振荡器。
其中,片上时钟VLOCLK、REFOCLK不是很精确稳定,会受到温度和电压的影响。一般对精度和稳定性要求不高的应用可以选择片上时钟。
DCOCLK因为有FLL的锁定,所以可以提供非常稳定的时钟。DCOCLK分频之后的时钟DCOCLKDIV一般提供给MCLK和SMCLK。
经过时钟系统出来一般有3个时钟信号:ACLK、MCLK、SMCLK
ACLK: 辅助时钟(Auxillary Clock)
ACLK可由软件选择作为各个外围模块的时钟信号,一般用于低速外设。
MCLK: 主系统时钟(Main System Clock)
MCLK通常用于CPU运行,程序的执行和其他使用到高速时钟的模块。
SMCLK: 子系统时钟(Sub System Clock)
SMCLK通常用于高速外围模块。
ACLK、MCLK、SMCLK这3个时钟信号由时钟模块产生。时钟源可以是上述的5个之一,也可以是DCOCLK分频之后的信号DCOCLKDIV。
FLL用来锁DCOCLK,需要一个参考信号FLLREFCLK,这个信号可以是XT1CLK、REFOCLK、XT2CLK三者之一。
关于FLL,它的作用是和DCO一起,实现锁频环倍频电路。
有两个公式:
fDCOCLK=D*(N+1)*(fFLLREFCLK/n);
fDCOCLKDIV=(N+1)*(fFLLREFCLK/n);
D和N通过寄存器设置,具体含义见图FLLD和FLLN处,n代表对FLLREFCLK的分频系数,通过FLLREFDIV设置。
讲到这里,可能还不是很清楚,说一个误解:很多人刚开始用430,设计电路的时候,时钟部分在XT1处接一个32.768kHz的晶振,然后上电,发现系统可以工作,就OK了。
这就导致了想当然地跟51联系在一起,只要外部加一个晶振,系统就可以工作了,只是51加的是12MHz的,430加的是32.768的。为什么加32.768呢?哦,别人都是32.768,我是参考的。
其实不是的,没有这么简单,430内部有很多时钟,是要进行选择和配置的,上电就可以工作是因为它时钟系统工作在默认配置下。
拿CC430举例,系统上电之后,时钟系统默认是这样的:
ACLK选择XT1CLK作为时钟源,也就是外部的32.768kHz晶振,如果外部没有接晶振,那么自动切换到片上时钟源REFOCLK上;
MCLK和SMCLK选择内部的DCOCLKDIV作为时钟源;而FLL的参考时钟则是XT1CLK。
所以,默认状态下,ACLK是32.768kHz,而MCLK和SMCLK是1.048576MHz。
那具体如何配置CC430的时钟呢,这又牵扯到配置寄存器的问题,UCS模块一共有9个配置寄存器:UCSCTL0--UCSCTL8。
其中UCSCTL0-- UCSCTL1设置DCO的相关参数,包括MOD和DCORSEL等。
UCSCTL2-- UCSCTL3设置FLL相关参数,包括FLLD和FLLN还有FLL参考时钟等。
UCSCTL4设置ACLK、MCLK、SMCLK分别选择哪一个时钟源。
UCSCTL5设置ACLK、MCLK、SMCLK选择各自的时钟源后,对时钟源的分频。
UCSCTL6设置使能或禁止某个时钟源。
UCSCTL7是各种错误标志。
UCSCTL8暂时用不到,这是时钟模块的另外一个功能,比如说在某一级低功耗下,ACLK、MCLK、SMCLK某些个时钟被关闭了,但是如果这个时候,某个外设需要用到它们,那么它们仍然可以提供时钟给外设,并且它们被关闭的标志位不变。
另外,430支持时钟输出,当配置好时钟之后可以把ACLK、MCLK、SMCLK输出到相应管脚,用示波器可以验证配置的正确与否。
下面通过具体的范例来说明:
假设我们要配置FLL的参考时钟为REFOCLK,那么我们需要配置UCSCTL3寄存器,UCSCTL3寄存器具体如下图所示:
SELREF具体是bit6--bit4:
我们从上图可以看出,如果要选择REFOCLK作为FLL的参考时钟,那么bit6--bit4要设为010。配置的时候只要把它或上去就行了,0000 0000 0010 0000
好了,我们可以这样写UCSCTL3 |= 0x0020;
因为有cc430头文件的存在,程序写起来就可以很方便,不需要配置的时候写很多莫名其妙的数字。
UCSCTL3 |= SELREF_2; //等效于上面那句
如果不需要分频的话,写成UCSCTL3 = SELREF__REFOCLK;也是可以的。
因为在头文件里是这么定义的:
再假设我们需要配置ACLK的时钟源是REFOCLK,那么:
UCSCTL4 |= SELA_2; 即可,如果不信,可以按照上面的步骤验证一下。
http://infineonic.org/bbs/article_1077_197599.html