原创 MSP430F5418学习笔记----UCS时钟模块配置

2009-8-25 14:28 7123 13 17 分类: MCU/ 嵌入式

引言:一年前开始用TI公司的x14x系列超低功耗单片机MSP430F149,感觉与普通的51系列相比,各个外设的功能强大了一些,使用起来没有很大的区别,但有一个重要的区别就是外部晶振需要正确配置才能使用。现在在用TI的x54x系列的MSP430F5418芯片,发现它的各个外设的集成度更高了(比如所有的外部时钟和内部时钟由一个Unified Clock System(UCS)模块统一管理,内部Uart,IIC,SPI之类的串行接口由Universal Serial Communication Interfaces(USCI)模块统一管理),使用起来更灵活了,由此带来的影响就是配置起来也就更麻烦了。(呵呵,要想拥有更强大的功能,还不得花更多的精力去研究它的使用方法?)


 


刚刚才把F5418的UCS模块调通,特此庆祝一番~~


 


动手之前,首先要阅读TI提供的430x54x Family User Guide(slau208d)和MIXED SIGNAL MICROCONTROLLER,了解一下这种全新的芯片的时钟模块的框图,有个整体把握:


点击看大图



下面是我翻译的MIXED SIGNAL MICROCONTROLLER第18页对UCS的介绍(觉得翻译不好可别拍砖哦):


 


 


@振荡器和系统时钟 (MIXED SIGNAL MICROCONTROLLER, P18)


在MSP430x5xx家族的器件中,时钟系统由统一时钟系统Unified Clock System(UCS)模块提供,它包含了一个32KHz钟表石英晶体(XT1 LF Mode),一个内部低功率,低频率震荡器(VLO),一个内部平衡的低频震荡器(REFO),一个集成的内部数字可控震荡器(DCO),和一个高频石英晶体振荡器(XT1 HF模式或XT2).这个UCS模块的设计符合了系统对低成本和低功耗的要求,它包含数字锁频环(FLL),通过连接一个数字的调制器,使DCO频率稳定成一个可编程倍数的钟表石英晶体频率.其内部DCO提供了一个快速开启的时钟源,并能够在低于5us内稳定.
统一时钟系统模块提供了如下时钟信号:
·Auxiliary辅助时钟(ACLK),可由32KHz钟表晶体,高频晶体,内部低频振荡器(VLO),平衡的低频振荡器(REFO)或内部数字控制振荡器(DCO)提供.
·Main系统时钟(MCLK),供CPU使用,信号提供与ACLK相同.
·Sub-Main系统子时钟(SMCLK),供外设模块使用,信号提供与ACLK相同.
·ACLK/n,由ACLK分频后缓冲输出,分频系数可为1,2,4,8,16,32.


 


当你不做任何时钟配置时,你仍然可以像使用普通单片机一样正常使用它,那么它是时钟默认是怎么配置的呢?这时候你就得了解USC模块的默认配置了,这部分在430x54x Family User Guide中第64页有讲解。我的翻译:


 


@Unified Clock System(UCS)操作---430x54x Family User Guide slau208d,P64


在上电清除信号(PUC)之后,UCS模块的默认配置是:
·XT1 低频模式被选择为XT1CLK时钟的振荡器。XT1CLK被选择为ACLK的时钟源。
·DCOCLKDIV作为MCLK的时钟源。
·DCOCLKDIV作为SMCLK的时钟源。
·FLL(锁频环)运行被使能,XT1CLK作为FLL参考时钟,即FLLREFCLK。
·XIN和XOUT引脚被设置为通用IO时,XT1保持禁能直到IO口置为XT1操作模式。
·如果XT2IN和XT2OUT引脚被设置为通用IO,XT2被禁能。
在初始状态,FLL以XT1为参考时钟的运行默认使能,但XT1被禁止。要使能XT1,相应管脚的PSEL位必须置位。当一个32.768KHz的晶振用作XT1CLK时,出错的控制逻辑电路直接造成REFOCLK作为ACLK的时钟源,因为XT1不会立即稳定。一旦振荡开始信号被获取到了,FLL就使MCLK和SMCLK稳定到1.048576MHz,f(DCO)=2.097152MHz。
状态寄存器控制位(SCG0,SCG1,OSCOFF和CPUOFF)配置MSP430的运行模式,还使能或禁能UCS模块的部分功能(参考系统复位,中断,运行模式等章节)。寄存器UCSCTL0到UCSCTL8配置UCS模块。


 


废话别太多,下面直接看程序:


 


如果想将MCLK、SMCLK的时钟源设为外部高速晶振(我接的是16MHz),在初始化时加入以下程序段:



  //使用XT2振荡器
 P5SEL |= BIT2 + BIT3;      //配置管脚为晶振输入
   UCSCTL6 &= ~XT2OFF;              //打开XT2振荡器
   do
   {
     UCSCTL7 &= ~(XT2OFFG;         //清除振荡器XT2失效标志
  SFRIFG1 &= ~OFIFG;                      // 清除振荡器失效标志
  //上面这句必须有,否则起振了也不会分配成功
   }
   while (UCSCTL7 & XT2OFFG);        //判断XT2是否起振
 UCSCTL6 &= ~XT2DRIVE0;    //设置驱动电流最小以降低功耗
   UCSCTL4 |= SELM__XT2CLK + SELS__XT2CLK;     //选择MCLK、SMCLK为XT2
 //UCSCTL5 |= DIVS__2;      //SMCLK设为2分频


 

如果想让外部的XT1,XT2和内部DCO同时使用,并从端口输出以便于测试,连接图示意(参考ti例程)
//                MSP430F5418
//             -----------------
//        /|\ |              XIN|-
//         |  |                 | 32kHz
//         ---|RST          XOUT|-
//            |                 |
//            |                 |
//            |            XT2IN|-
//            |                 | HF XTAL or Resonator (add capacitors)
//            |           XT2OUT|-
//            |                 |
//            |             P1.0|--> ACLK = 32kHz Crystal Out
//            |                 |
//            |             P1.6|--> SMCLK = High Freq Xtal or Resonator Out
//            |                 |
//            |             P2.0|--> MCLK = Default DCO Frwequency
//            |                 |
//            |                 |



在初始化是加入以下程序段:



  P1DIR = BIT6 + BIT0;                // 
  P1SEL = BIT6 + BIT0;                //  配置管脚为时钟 SMCLK, ACLK输出
  P2DIR = BIT0;                  // 
  P2SEL = BIT0;                  //  配置管脚为时钟 MCLK输出
 
  P5SEL |= 0x0C;                            // 配置管脚为晶振XT2输入
  P7SEL |= 0x03;                            // 配置管脚为晶振XT1输入


  UCSCTL6 &= ~(XT1OFF + XT2OFF);            // 打开XT1,XT2振荡器
  UCSCTL6 |= XCAP_3;                        // 为XT1加载内部电容


  // 循环直到XT1,XT2 和 DCO 稳定起振
  do
  {
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
                                            // 清除振荡器XT2,XT1,DCO失效标志
    SFRIFG1 &= ~OFIFG;                      // 清除振荡器失效标志
  }while (SFRIFG1&OFIFG);                   // 判断所有晶振是否起振


  UCSCTL6 &= ~XT2DRIVE0;                    // 根据晶振频率减小XT2驱动电流以降低功耗
  UCSCTL4 |= SELA__XT1CLK + SELS__XT2CLK;  


 // 选择SMCLK时钟源为XT2, ACLK时钟源为XT1,MCLK默认为DCO/2



 


 

文章评论4条评论)

登录后参与讨论

用户377235 2014-2-6 10:09

谢谢楼主,学习了!

chen_zs2012_704941858 2013-4-17 00:07

恩恩,正在学习MSP430F5438

用户377235 2013-4-16 17:41

非常感谢了楼主,程序写的很好。补充一点,在判断失效循环中,必须加入延时等待,否则程序会一直死在里面。

用户1649556 2011-7-21 20:11

学习中~
相关推荐阅读
用户1453845 2011-09-08 19:40
stm8s参考手册上未说明的细节
1,字编程(Word programming)时,地址必须4字节对齐,从首地址开始,4字节连续装载后自动开始编程过程。说明:例如要写入u16(16位无符号整形)类型的数据0x1234到0x4005地址...
用户1453845 2011-01-26 09:23
ST-LINK 仿真器修复
    ST-LINK损坏,可能是无意将+12V电源线接到了仿真器TVCC引出线上了。表现的症状是能正常连接电脑,能出现可移动磁盘,但接到目标板时会造成目标板一直处于复位状态,仿真时弹出错误30001...
用户1453845 2009-08-29 16:38
MSP430x54x学习笔记--硬件乘法器MPY
硬件乘法器MPY:(平台:MSP430F5418) ·16位乘法器使用方法:     1.无符号数相乘 result="n1"*n2。第一操作数n1(16位无符号)赋给MPY寄存器,第二操作数n2(1...
用户1453845 2009-07-11 01:04
"TI"杯电赛芯片ADS7886读取成功!
         一直为这个芯片的程序烦心,6个脚的芯片,无须设置基准电压,没有寄存器的设置,没有指令的输入,没有任何外围电路.        串行传输,两根控制线(CS和SCLK),一根数据线(SD...
用户1453845 2008-08-21 00:16
基于MSP430的红外遥控器解码
          遥控发射器专用芯片很多,根据编码格式可以分成两大类,这里我们以运用比较广泛,解码比较容易的一类来加以说明,现以日本NEC的uPD6121G组成发射电路为例说明编码原理(一般家庭用的...
我要评论
4
13
关闭 站长推荐上一条 /2 下一条