MSP430 Value Line MCU的时钟系统

文章目录
  1. 1. 关闭看门狗
  2. 2. 时钟系统
  3. 3. 具体编程,对时钟源和系统时钟的配置和使用

关闭看门狗

由于要使用仿真器调试,加断点后MCU被挂起,会导致看门狗被触发而将MCU复位。因此在调试阶段,我们需要先关闭看门狗。关闭看门狗的方法是:

1
WDTCTL = WDTPW + WDTHOLD;

WDTCTL是一个16位的寄存器,顾名思义,就是看门狗的控制寄存器。WDTHOLD是控制看门狗开关的标志位。给WDTHOLD置位即关闭看门狗。但是这个WDTPW是什么呢?查手册得知WDTPW是看门狗的密码,这是一个宏,被定义为了0x5A00,这个密码是干什么用的呢?原来,WDTCTL寄存器是一个非常特殊的寄存器,为了防止程序异常时意外关闭看门狗,对它进行赋值操作时必须将其新值的高8位设为0x5A这个特定的值,也就是“密码”。如果赋值时新值的高8位不是0x5A,会导致MCU立即被复位。总之,对WDTCTL进行任何修改操作时,都要加上WDTPW的值。

时钟系统

对于玩51单片机的人来说,学习MSP430的时钟系统是很痛苦的,也很颠覆的。MSP430为了做到超低功耗,对时钟系统进行了精妙的设计。网上有文章专门讲解MSP430的时钟系统,还有生动的配图。但遗憾的是这些讲解都多多少少的存在问题甚至是错误的。既然说人家讲得不好,我也就斗胆说说自己的理解。对时钟系统最精确的描述当然就是手册里的框图了:

我不喜欢看这种框图,觉得特别复杂,看起来累。但是静下心来看它时,你会发现其实它并不是那么复杂,很多困惑的问题也就迎刃而解了。唯一需要你了解的背景知识是,你必须要认识啥是多路选择器(Mux)。。。

首先,MSP430的时钟系统有这么几个概念。

  1. 时钟源:产生震荡的时钟信号。MSP430中最多有4个时钟源,分别是:

    • DCO(数控晶振)
    • VLO(超低功耗低频晶振)
    • LFXT1(低频外部晶振)
    • XT2(高频外部晶振)。

      在Value Line产品中,并非支持全部的四种时钟源。以MSP430G2231为例,内置了DCO和VLO,XT1可以自己焊接,XT2不支持。

  2. 时钟:供系统设备使用的时钟信号,通常是时钟源的原始信号经过分频后得到。MSP430有3个时钟,分别是:

    • MCLK(主时钟,供CPU核心使用)
    • ACLK(辅助时钟,供外围设备使用)
    • SMCLK(子系统时钟,供外围设备使用)
  3. 每个时钟都可以配置

    • 从指定的时钟源获得信号
    • 对信号进行/1/2/4/8分频
    • 时钟开关

上面的框图我们从中间横向的红线分开看,上面一部分是低频时钟,LFXT1Sx这两个标志位用于选择使用哪个时钟源来驱动系统的低频时钟。蓝色的线就是低频时钟源的输出。下面一部分是高频时钟,红色的细线是高频时钟的输出(对没有XT2的芯片来说)。需要注意的是,这条蓝色线接在LFXT1Sx对应的数据选择器的后面。也就是说,系统只能选择一个低频时钟。比如我选择VLO作为ACLK的时钟源,那蓝色那条线上就是VLO的时钟信号。那即使我有外部晶振,也不能选择LFXT1作为MCLK的时钟源。就是这种机制,很多人没有理解清楚(或者没有表达清楚),致使网上的大部分教程都在说,MCLK是从ACLK和DCO中二选一,这样说是不准确的。因为蓝色的线在ACLK的分频器之前,所以并不受ACLK分频设置的影响,因此蓝色线上跑的并不是ACLK时钟信号,而是ACLK的时钟源信号。

更准确的理解是这样的:MCLK仍然是从DCO、VLO、LFXT1和XT2(如果有的话)中四选一,ACLK仍然是从LFXT1和VLO中二选一,SMCLK仍然可以从DCO和XT2(如果有的话)中二选一(如果没有XT2就在DCO、LFXT1、VLO中三选一)。只不过有一个约束,那就是如果MCLK或者SMCLK想要选择VLO或者LFXT1,那就必须跟ACLK选的一样。

在绝大部分Value Line产品中(以MSP430G2231为例),你可以采用更简单的记法:低频时钟源从LFXT1和VLO中选一个,高频时钟源只有DCO一个。因此对系统时钟(MCLK, ACLK, SMCLK)来说,只有2个时钟源,一个低频一个高频。三个系统时钟都可以选择使用低频时钟源(图中蓝线)或者高频时钟源(图中红线)。

(2012年7月11日勘误:MCLK和SMCLK可以从低频和高频中选一个,而ACLK只能选择低频)

以下内容均以MSP430G2231和MSP430G2553芯片为例,即不存在XT2

具体编程,对时钟源和系统时钟的配置和使用

  1. 低频时钟源配置——寄存器BCSCTL3 (Basic Clock System Control Register 3)
    配置低频时钟的时钟源其实就是修改上面图中的LFXT1Sx,这两个标志位位于BCSCTL3这个8位寄存器的第4、5位。

    //使用频率约为12kHz的VLO作为低频时钟源
    BCSCTL3 |= LFXT1S_2;
    

    头文件中定义了LFXT1S_2,其实就是第4位为1,第5位为0. 含义是使用VLO

    // 使用Launchpad自带的32768Hz外部晶振,电容12.5pF
    BCSCTL3 |= LFXT1S_0 + XCAP_3; 
    

    头文件中定义的LFXTS_0含义是使用外部晶振,同时设置 XCAP_3,含义是晶振的负载电容是12.5pF

  2. 高频时钟源的配置

  3. 系统时钟MCLK的时钟源选择——寄存器BCSCTL2 (Basic Clock System Control Register 2)

    // 清晶振错误标志位
    IFG1 &= ~OFIFG;
    // 不懂。。。
    __bis_SR_register(SCG1 + SCG0);
    //系统时钟选择为低频,/8分频
    BCSCTL2 |= SELM_3 + DIVM_3;
    

版权声明

The Bloom of Youth by KUANG Qi is licensed under a Creative Commons BY-NC-ND 4.0 International License.
况琪创作并维护的锦瑟华年博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于The Bloom of Youth | 锦瑟华年博客( http://kuangqi.me ),版权所有,侵权必究。

本文永久链接:http://kuangqi.me/embedded/the-clock-system-on-msp430g2/