5744|0

2781

帖子

417

TA的资源

五彩晶圆(中级)

楼主
 

MSP430 学习笔记——MCLK时钟配置攻略 [复制链接]

前言:本文仅仅是我在学习过程中的笔记,只讨论几个以我的学识所认识到的几个问题及解决方案,文中不会涉及过多的技术细节。仅仅翻译TI的技术手册让我觉得索然无味;而且这对于一个信息泛滥的时代来说,copy是在创造更多垃圾,精华在于点到关键之处。

复杂的时钟系统
     相比较于大多数同学(包括我)学习时单片机的启蒙老师51,MSP430的时钟系统算得上是极其复杂了,而且在使用的过程中还需要对相应的基础器进行配置。 以1系为例,时钟信号源有ACLK、SMCLK、MCLK,分别是辅助时钟、用于外围设备的时钟、系统的主时钟。除了MCLK固定用于CPU外,其它一些外设的时钟信号都可以在三个个时钟信号之间选择。而这三套时钟源可有最多三个振荡器(DCO,LFXT1,XT2)产生。DCO是芯片内部自带的数字振荡器,无论如何都能工作;LFXT1(可以工作于高频模式),XT2是用外部晶振控制频率产生的晶体振荡器。为了避免晶体振荡器起振失败,MSP430提供了一套时钟失效检测电路及相关标志。甚至可以在时钟失效的情况下触发中断。
     在了解了上面的基本概念后,相信有一定单片机基础并且肯去读PDF的同学,搞定相关基础器的配置并不是什么难事。但是在实际应用的过程中,MSP430的时系统可不像很多实例程序中那样,配置一番寄存器就能正常工作。在初次配置MSP430单片机时钟系统时,我发现无论如何都无法将MCLK配置为XT2。在后来反复比对TI的英文资料和参考程序后,发现问题出在了时钟失效检测电路之上,只要合理调整时钟的初始化时序便可以解决这个问题。

一不小心就会坑爹的时钟失效检测电路
    我在初始使用MSp430F1612进行实验时,根据TI的示例程序编写了一段配置时钟并缓冲输出的程序,如下。(我的实验板,LFXT1为32.7KHz的钟表晶振,XT2为8MHz晶振)
    DCOCTL = DCO0 + DCO1 ;                    // Max DCO
     BCSCTL1 = RSEL0 + RSEL1;                 // XT2on(第一位赋值0), max RSEL
     BCSCTL2 = SELM1 + SELS;                          // MCLK = XT2 ,SMCLK = XT2   
    //BCSCTL2 |= SELS;                        // SMCLK = XT2
     P5DIR |= 0x70;                            // P5.6,5,4 outputs
     P5SEL |= 0x70;                            // P5.6,5,5 options,引脚的复用功能
    我将MCLK 与 SMCLK 同时配置为 XT2。用示波器观察输出端口时,却发现主时钟MCLK输出的是DCO的频率,而SMCLK输出了XT2的频率。XT2在正常工作的情况下,却不能赋给MCLK。

在时钟失效检测电路的阴影下,配置MCLK
     在1系的User's Guide中对时钟失效检测电路有这样的描述

     根据用户手册中的这一段,时钟失效检测电路能够检测在晶振失振后约50us内启动,并将MCLK的时钟源自动转换为DCO,以保证程序的正常执行。
      而时钟信号的失效会引起失效标志位(OFIFG)的置位,并且在PUC(上电复位)之后失效标志位也会置位。这就不难解释上面的问题了,在单片机刚刚开机的时候,OFIFG是置位了。也就是这个时候,单片机认为晶振是失效的,所以不论你怎么配置寄存器,MCLK都会被强制为DCO。

      最后,用户手册中也给出了将始终MCLK从DCO切换到XT2的标准步骤。
         1、开启晶振。具体为复位XT2OFF位
         2、清除OFIFG位
         3、等待至少50us
         4、检测OFIFG位,如果依然置位,则重复1-4

    因而,在完成相关基本时钟寄存器的配置之后,还需要对时钟失效标志位进行检测和清楚。如下修改程序(添加while循环等待
XT2启振),终于使得程序得以调试通过。
     uchar  i;
      DCOCTL = DCO0 + DCO1 ;                   // Max DCO
      BCSCTL1 = RSEL0 + RSEL1;                 // XT2on(第一位赋值0), max RSEL
      BCSCTL2 = SELM1;                         // MCLK = XT2 ,SMCLK = DCO
      //BCSCTL2 |= SELS;                        // SMCLK = XT2
      P5DIR |= 0x70;                            // P5.6,5,4 outputs
      P5SEL |= 0x70;                            // P5.6,5,5 options,引脚的复用功能
      while ((IFG1 & OFIFG) == OFIFG)           //等待XT2启振
      {
          IFG1 &= ~OFIFG;                         //clear OFIFG, which is preset
          for (i=0;i<200;i++);
       }




分享自:http://t.cn/8F8ImCj
 
点赞 关注(1)
个人签名

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表