查看: 3207|回复: 1

CC430学习笔记(四)——时钟系统(网友juring作品)

[复制链接]
  • TA的每日心情
    奋斗
    2020-9-28 10:10
  • 签到天数: 1018 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2012-8-24 13:32:45 | 显示全部楼层 |阅读模式
    分享到:
    网友juring作品
    大家都知道,单片机工作离不开时钟,在我们熟悉的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; 即可,如果不信,可以按照上面的步骤验证一下。

    回复

    使用道具 举报

    该用户从未签到

    发表于 2016-5-18 15:49:17 | 显示全部楼层
    没有PDF~[哭]
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条



    手机版|小黑屋|与非网

    GMT+8, 2024-3-29 15:10 , Processed in 0.126648 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.