平台:
Code Composer Studio 6.2.0 + Grace 2.2.0
MSP430G2553 LaunchPad™ Development Kit (MSP-EXP430G2ET)


_  以下大部分内容摘自《LaunchPad口袋实验平台 —— MSP-EXP430G2篇》傅强、杨艳 编著(TI大学计划嵌入式微控制器技术丛书)_

系统时钟概述

  现代单片机的制造工艺都差不多,靠电子元件本身节能的潜力非常有限。单片机的低功耗主要是依靠间歇工作实现的,而间歇工作的方法就是启停系统时钟。如果像普通 51 单片机那样只有一个时钟,关掉时钟意味着单片机全面停工,节能的同时也没法正常使用了。所以出于低功耗的需要,MSP430 单片机工作的系统时钟被分为了 MCLKSMCLK  ACLK 三个,可以根据需要关闭其中的一个几个或全部。
  MCU 内需要时钟的单元包括 CPU 和部分片内外设,三种时钟的功能区别如下:

  1. MCLK:主时钟(Main system Clock) , 专为CPU运行提供的时钟。MCLK频率配置的越高,CPU执行的速度越快。虽然CPU速度越快功耗也越高,但高频率的MCLK可以让CPU工作时间更短。所以正确的低功耗设计并不是要尽量降低MCLK,而是在不用CPU时立刻关闭MCLK。在大部分应用中,需要CPU运算的时间都非常短,所以,间歇开启MCLK (唤醒CPU)的方法节能效果非常明显。
  2. SMCLK:子系统时钟(Sub-main Clock) ,专为一些需要高速时钟的片内外设提供服务,比如定时器和ADC采样等。当CPU休眠时,只要SMCLK开启,定时器和ADC仍可工作(一般待片内外设完成工作后触发中断,唤醒CPU去做后续工作)。
  3. ACLK:辅助时钟(Auxillary Clock),辅助时钟的频率很低,所以即使一直开启功耗也不大,当然关掉也是可以的。辅助时钟可以供给那些只需低频时钟的片内外设,比如LCD控制器,还可用于产生节拍时基,与定时器配合间歇唤醒CPU。

  MCLK、SMCLK 和 ACLK 三者关系用更形象的比喻就是主力部队(MCLK)、先头部队(SMCLK)、警戒哨兵(ACLK)的关系。

  1. 需要用主力部队的时候不多,一般情况都处于休整状态,以节约“给养”(功耗)。
  2. 能只用先头部队解决的问题,就别动用主力,待先头部队完成自己的任务后,再请主力出马。
  3. 当没有实际“敌人”的时候,主力部队和先头部队都可以休整,但是要放上哨兵作为警戒,发现“敌人”可以随时唤醒主力部队。

BCS+模块单元的基本构造

  MCLK、SMCLK 和 ACLK 及其来源构造在 MSP430x2xx 系列单片机中称为 Basic Clock Module+单元,如下图所示。
  下图所示的框图乍一眼看过去异常复杂,需要设置的寄存器多如牛毛。但是我们需要明白一点,单片机的设计者已经把所有能为用户完成的事都做完了,所预留的寄存器是必须由“主人”控制的各种开关。相比于设计实际硬件电路将会遇到的各种问题,没有什么比拨一下开关更简单的事了。在理解单片机设计者的设计意图后,再借助 Grace 配置各种寄存器将事半功倍、胸有成竹。
  下图右侧三个框部分是最终单片机使用的三种时钟,左边表明了这些时钟的可能来源,右侧框中有一系列的来源选择开关、分频控制开关、输出开关。下图左边部分是时钟的可能来源,为了兼顾精度、成本和方便使用,时钟的来源分成 3 大类,即低频振荡器、 高频(石英晶体)振荡器(目前 MSP430G 系列单片机不支持)和数控振荡器。
在这里插入图片描述

  点击 “Device Overview(设备概述) “链接,可查看可供配置的外围模块(以蓝色描述)。
在这里插入图片描述
在这里插入图片描述
  其中带底色框图部分可以用鼠标点击,是可由用户配置的资源。当前有 3 个模块上有✔,分别是时钟(Oscillators Basic Clock System+),P1 口(Port P1),看门狗(Watchdog WDT+),表明目前默认配置并启用了这 3 个模块的资源。点击其他带底色框模块,即可对选中模块进行配置。
  在上图中有一个电源下拉框,默认显示 1.8V,有初学者认为这个地方设多少伏将来单片机“内部”就会变出多少电压来,这个观点的因果关系是错的。实际单片机供电是多少伏,框里就应该选多少伏,Grace 有必要知道单片机的实际供电电压,因为在低电压情况下,某些外设不能使用,Grace 会自动屏蔽配置该外设的功能。
在这里插入图片描述
  我们点击时钟进行配置,如下图所示,默认勾选 Enable Clock in my configuration(在我的配置中启用时钟),然后就会出现 Overview、Basic User、Power User、Register 四个按钮。默认是停留在Overview 状态,所以下图中 Overview 是灰色不可点击的。

时钟-概览

在这里插入图片描述
该介绍机翻如下:

介绍

  基本时钟模块+(BCS+)支持低系统成本和超低功率消耗。使用三个内部时钟信号,用户可以选择性能和低功耗的最佳平衡。在完全的软件控制下,BCS+可以被配置为在没有任何外部元件的情况下工作,使用一个外部电阻,使用一个或两个外部晶体,或使用谐振器。
  BCS+集成了一个振荡器故障安全功能,可检测LFXT1和XT2的振荡器故障。如果相应的晶体振荡器被打开且运行不正常,则晶体振荡器故障位LFXT1OF和XT2OF被置位。只要故障条件存在,故障位就一直被置位,如果启用的振荡器功能正常,则自动清除。
  当检测到振荡器故障(LFXT1OF或XT2OF)时,OFIFG振荡器故障标志被置位。如果OFIE被置位,OFIFG请求一个NMI中断。当中断被允许时,OFIE自动被重置。OFIFG标志必须由软件来清除。故障的来源可以通过检查各个故障位来确定。
  如果检测到为MCLK供电的晶体振荡器有故障,MCLK会自动切换到DCO作为其时钟源。

Basic User 模式

  在点击了 Basic User 后,如下图所示,我们进入了基础配置模式。这个模式更贴切的说是“傻瓜”模式。从图中我们可看到,只要下拉菜单,便可完成时钟的配置,完全没有多余的废话。
在这里插入图片描述
  对于希望快速上手的初学者,可以使用 Grace 的 Basic User 模式配置时钟,瞬间即可完成。如下图所示,DCO 频率可设为 1/8/12/16MHz,这 4 个频率经过出厂校准,比较准确。如果没焊外部手表晶振,低频信号源选择 12kHz 内部振荡器, 焊了手表晶振就选32.768kHz。
在这里插入图片描述

Power User 模式

  点击 Power User ,如下图所示,可配置的选项骤然增多。这是大概知晓 BCS+原理的半熟练工用的图形化配置模式,注意到右下角还包括对中断服务子函数内调用的“中断事件函数”的配置。
在这里插入图片描述
部分内容机翻 该系统使用一个低频振荡器。频率可在4kHz至20kHz之间变化。见具体的设备数据表。
Note 1
  通过启用中断处理程序,Grace在src文件夹内的InterruptVectors init.c文件中生成了一个完全工作的中断服务程序。用户可以在ISR的指定区域内插入代码,并且代码被保留下来。当用户禁用中断处理程序时,用户插入的代码会保留在文件的底部,如果用户重新启用中断处理程序,会自动重新插入。用户也可以手动删除这些代码,当它不再…
Note 2
  手动配置DCO频率可能会导致+/-10%的频率偏差。预先校准的DCO有+/-3%的频率偏差。更多信息见数据表。
Note 3
  根据系统上升时间设置一个以毫秒为单位的延迟值,以确保不违反VCC与MCLK的关系。强烈建议在设置非默认的系统时钟频率时,确保系统的正常启动。

在这里插入图片描述
  为了进一步理解 BCS+的结构,结合上图中标注的 10 个知识点,下面分 10 个小结来讲解。

1. 数控振荡器 DCO

  MSP430G 系列单片机目前只能通过内部数控振荡器 DCO 来获得高频时钟,将来可能推出支持高频外部晶振的型号。
  DCO 的原理实际是一个开环控制的振荡器,DCO 模块内置系列(振荡)电阻,供选择频率范围(RSELx 共 4 位,16 档),也就是 RSELx 管粗调。接下来是对振荡频率进行分频(DCOx 有 3 位,共 8 档,档位步进约 10%),也就是 DCOx 负责细调。振荡频率范围和分档的设定示意图见下图。
在这里插入图片描述
  粗调和细调仍不满足要求怎么办?例如上文提到 DCOx 每档频率步进约 10%,如果我想频率只递增 5%怎么办?为了得到更多的频率,MSP430 单片机引入了小数分频的概念。如下图所示,利用混频器 Modulator,可以交替输出 DCOx 和 DCOx+1 两种频率,如果按 1:1 比例,就相当于输出了 DCOx+0.5 这一档频率。
在这里插入图片描述
  混频器当然也可以不按 1:1 混频,寄存器 MODx 共 5 位,用于设定两种频率在 32 个脉冲中所占比例,混频后的完整周期(32 个 CLK)可由如下公式表示:



t=(32MODx)tDCO+MODxtDCO+1

  大家可能会好奇这样得到的“等效”频率的时钟能用吗?答案是当然有用,可以用于配置通讯的波特率。如果 MODx 设定值不为 0,显然经混频得到的振荡波形在示波器上看将会“抖动”,对于时钟瞬时稳定度要求高的场合应避免使用混频

2. 出厂预校正频率

  DCO 与一些型号 MSP430 配置的数字锁频环(FLL)不同,DCO 并不是一个带反馈的振荡器,而开环输出频率的误差很大。也就是说 RSELx 的粗调和 DCOx 的细调都是非线性的。如何保证 DCO 输出频率精度呢?在出厂时,每一块单片机都校正了 4 个频率值(1/8/12/16MHz),将这 4 个频率值的校验参数(RSELx/DCOx/MODx 的取值)存在了单片机片内 Flash 的 Info A 段中。
  在如下BCS+初始化配置代码中,设置 DCO 为 1MHz,实际就是调取出厂校验参数CALBC1_1MHZ 和 CALDCO_1MHZ。

 void BCSplus_init(void) {
 ...
 BCSCTL1 = CALBC1_1MHZ; /* Set DCO to 1MHz */
 DCOCTL = CALDCO_1MHZ;
 ...
}

  既然是校验参数,那么每一块单片机会都不一样, MSP430G2553 单片机的 DCO 校验参数 CALBC1_xMHz 和 CALDCO_xMHz 在 Flash ROM 中的地址如下表所示。1 个字中的高 8 位用来存储 CALBC1_xMHz 参数,将来用于配置 BCSCTL1 寄存器。1 个字中的低 8 位用来存储 CALDCO_xMHz 参数,将来用于配置 DCOCTL 寄存器。

  1. MSP430 可以直接读写 1 个字(2 个字节,因为 MSP430 的 CPU 是 16 位的)。
  2. 也可以只读写其中一个字节(寻址到字节)。
  3. 但是不能直接读取 1 位(不能寻址到位)。
    在这里插入图片描述

  在上表中最后一栏是基址和偏移地址(Tag Address and Offset),当我们对一段连续的内存进行操作时,往往采用宏定义基址,再操作偏移地址的方法来增加程序的可靠性(有了基址,就不易发生误写其他内存段的情况)和可读性(偏移地址都很小,容易看出规律)。
  我们还可以在 CCS 软件中查看单片机的校验参数值,插上 LaunchPad 开发板,建立任何一个工程运行仿真,然后可以在 Registers 中的 Calibration_Data 中找到 CALDCO_xMHz 和CALBC1_xMHz 的各个 Value 值。由于 Flash 储存器的值是可以被人为改写的,将来大家在学习 Flash 控制器的时候,很可能误操作将 Calibration_Data 数据删除。所以建议大家将自己手头 G2 中的 Calibration_Data 记下来,保存备用,万一删除,还可以想办法恢复。
在这里插入图片描述
  Grace 代码在配置 DCO 为 xMHz 前,有一句代码:“if (CALBC1_xMHZ != 0xFF)”,这是用于判断 Flash 中校验参数还在不在(Flash 一旦被擦除,所有位都是 1),防止误操作用的。

3. 低频振荡器 VLO

  为了尽可能节约成本和简化外部电路,MSP430x2xx 内部还集成了一个低频振荡器VLO,用于取代 32.768kHz 手表晶振。低频振荡器的标称值是 12kHz,它与 DCO 一样,实际频率受温度和供电电压影响(范围 4kHz~20kHz)。
  VLO 一般用于对频率精度要求不高的场合。

4. 内部匹配电容

  用过 51 单片机的读者知道,晶振引脚上可能需要接电容才能正常工作。还是基于节约成本简化电路的目的,当使用外部晶振时,可以由单片机内部提供可选的 1/6/10/12.5pF 晶振电容

5. 延时启动

  随供电电压的不同,MSP430 单片机的最高工作频率是不一样。下图表示运行程序(读 Flash ROM)和编程(擦写 Flash ROM)时所需的供电电压与 CPU 频率的关系。例如,MSP430 最低可以 1.8V 供电,但此时的工作频率最高为 6MHz,并且只能运行程序,不能擦 写 Flash ROM。
在这里插入图片描述
  单片机刚上电时,VCC 是逐渐达到额定值的,如果在 VCC 很低的时候将 MCLK 设置频率很高就会与上图所示的限定条件相冲突。设置数 ms 的延时,等待 VCC 达到额定值再配置 MCLK 频率就可以解决这个问题。具体代码为:

if (CALBC1_8MHZ != 0xFF) 
{
	 /* Adjust this accordingly to your VCC rise time */
	 __delay_cycles(10000); //等待VCC达到额定值
	 DCOCTL = 0x00;
	 BCSCTL1 = CALBC1_8MHZ; /* Set DCO to 8MHz */
	 DCOCTL = CALDCO_8MHZ;
 }

 

<a id=”6MCLK114”>6. 自动选择 MCLK 源

 

  MCLK 的时钟是提供给 CPU 的,如果没有 MCLK 单片机就是“死的”。所以,MSP430中有一个智能机制,不管软件设定的 MCLK 时钟源是什么,最终 CPU 总会找一个“正常”的时钟使自己先“活过来”。这就是自动选择 MCLK,此功能不需要设置,强行派送的。

<a id=”7116”>7. 时钟输出

  理论上 MSP430 单片机的 3 个时钟 MCLK、SMCLK、ACLK 都可以对外输出,但是有的单片机受 IO 口数量的限制,没有预留 CLK 输出口。比如 MSP430G2553 单片机,预留了SMCLK、ACLK 输出口,但是没有 MCLK 输出口

8. 振荡器失效中断

  当配置了使用外部晶振,而外部晶振没有正常工作(无振荡、或振荡频率不够高),单片机有一个保护机制,MCLK 将会自动切换到使用内部 DCO 工作。同时,XT2OF 或LFXT1OF 两个错误标识位将会置位(MSP430G2553 没有高频晶振对应的 XT2OF),可以引发一个中断告知用户该事件,除非外部振荡器恢复正常,否则错误标识位将一直保持。判断失效的频率范围视具体型号而不同。

9. 中断事件处理函数

  在 Grace 中,可以直接命名一个中断事件处理函数,这个函数将来会出现在中断服务子函数中,这种写法的可读性高。因为中断函数本身很分散(甚至在不同文件中),写在中断中的代码总是难于阅读的,所以中断中尽量只写事件处理函数的“空壳”,而把实际中断事件处理函数汇集到一个文件中,集中阅读。

#pragma vector=NMI_VECTOR
__interrupt void NMI_ISR_HOOK(void) 
{
	/* Oscillator fault interrupt handler */
	BCS_OF();
	/* No change in operating mode on exit */
}

 

<a id=”10132”>10. 退出中断后的节能选项

  MSP430 中,进出中断前后的节能设置可以在中断服务子函数中修改。Grace 提供了快捷修改的方法,直接在下拉菜单中选择即可。

Registers 模式

  点击 Registers ,如下图所示,所有 BCS+(时钟)相关的寄存器豁然在列。这些寄存器有的是用鼠标勾选,有的组合需要鼠标下拉,但是所有位在鼠标停留时都会有提示。这个模式,属于真正懂 BCS+原理的人才能配置。
在这里插入图片描述

使用Grace改变系统时钟

在这里插入图片描述
  修改配置后,Ctrl+S保存,并点击小锤子
在这里插入图片描述
  经编译后工程中多了 src 文件夹,展开之后我们得到一系列 Grace 配置文件,其中 Basic clock system +模块的初始化文件名为 BCSplus_init.c,这就是我们刚刚图形化设置的时钟配置。
在这里插入图片描述
在这里插入图片描述

低功耗模式

  MSP430x2xx 系列单片机的 CPU 共有 5 种工作模式分别为 AM(Active Mode)、LPM0(Low Power Mode 0)、LPM1、LPM2、LPM3,如图 4.9 所示为各种工作模式下的电流值。相比于 Active 工作模式的 300μA,常用的 LPM3(哨兵警戒)模式的电流仅需不到 1μA,而LPM4 模式耗电 0.1μA 比电池漏电流还小,直接可当关机使用。
在这里插入图片描述
  在 MSP430 单片机中,是如何控制低功耗模式的呢?我们花 10 秒钟翻回到下图所示原理框图中,下划线标注了一些开关,这些开关决定了是否停止振荡器,是否关闭输出。
在这里插入图片描述

  1. “停止”和“关闭”,两者的区别是停止振荡器消耗的功率更低。但是, “停止”后若要重新开启振荡器,直到振荡器能稳定输出是需要时间的,这个时间的长短在具体型号的器件说明书中可以查询。
  2. 不停止振荡器,但关闭输出,则可以快速切换到正常输出状态。
  3. 所有这些开关的组合构成了单片机的活动模式(ActiveMode)和另外4种低功耗休眠模式(Low Power Mode),详见下表所示。
    在这里插入图片描述
      所有 4 种模式中,LPM0(主力休眠,先头部队工作)和 LPM3(主力和先头部队都休眠,仅留警戒哨兵)最常用,LPM4 则当关机使用。

直接配置系统时钟

  前面我们学习了如何用 Grace 配置时钟,其实对 MSPG2553 单片机来说,MCLK 和SMCLK 基本就是使用 DCO(没外部高频晶振可用)。有 32.768kHz 手表晶振,则 ACLK 选32.768Hz,没有就选 12kHz 的 VLO。所以,直接代码配置时钟也很方便,直接调用 DCO 出厂校验参数即可。

  1. 将 MSP430G2553 的时钟设置为 MCLK 和 SMCLK 均为 8MHz,ACLK 设为 32.768kHz。
DCOCTL = CALDCO_8MHZ; // 调取出厂校准后存储在Flash中的参数
BCSCTL1 = CALBC1_8MHZ; // BCSCTL3参数默认不用设
  1. 将 MSP430G2553 的时钟设置为 MCLK 和 SMCLK 均为 16MHz,ACLK 设为内部低频振荡器。
DCOCTL = CALDCO_16MHZ; // 调取出厂校准后存储在Flash中的参数
BCSCTL1 = CALBC1_16MHZ;
BCSCTL3 |= LFXT1S1; // 设为内部低频振荡器
  1. 将 MSP430G2553 的时钟设置为 MCLK 和 SMCLK 均为 16MHz,ACLK 设为使用32.768kHz 晶振且 4 分频。
DCOCTL = CALDCO_16MHZ; // 调取出厂校准后存储在Flash中的参数
BCSCTL1 = CALBC1_16MHZ; 
BCSCTL1 |= DIVA_2; // 补充修改 BCSCTL 的 DIVAx 位,4 分频
  1. 将 MSP430G2553 的时钟设置为 MCLK4MHz,SMCLK 为 2MHz,ACLK 设为使用32.768kHz 晶振。
DCOCTL = CALDCO_8MHZ; // 先设为 8MHz
BCSCTL1 = CALBC1_8MHZ; 
BCSCTL2 |= DIVM_1+DIVS_2; // 再对 MCLK 2 分频 ,SMCLK 4 分频