MSP430系列微控制器的时钟模块_3A概要

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第3章MSP430系列微控制器的时钟系统
目标
通过本章的学习,应掌握以下知识
时钟的概念
时钟源的分类和特点
寄存器的概念
MSP430系列微控制器的时钟系统
位运算操作符
利用逻辑运算实现位寻址
自主工作的MSP430微控制器芯片
时钟信号的频率稳定度
引言
图2.8的程序示例led_8.c和图2.28中的程序示例main.c只能通过硬件开发工具进行单步仿真来观察发光二极管的工作,不能将完成编辑、调试的程序下载到芯片使其自主运行,这是因为程序运行的速度太快。

如果每次向并行数字输入/输出端口P1发送一次数据,插入一段等待时间,例如1s,这样将能够清楚地观察到发光二极管的显示情况。

微控制器的工作是在一个被称为时钟的周期方波信号同步下进行的。

每来一个这样的方波信号,微控制器执行一条指令。

指令执行速度,即程序的执行速度,是与时钟频率成正比例的,因此如果希望利用编写程序,通过执行程序获得希望的时间延迟,那么需要首先知道系统的时钟频率。

执行程序需要的时钟周期数量乘上时钟周期的数值就获得时间延迟的具体值。

本节将介绍MSP430系列微控制器的时钟系统组成和工作过程。

驱动时钟系统工作的振荡器具有多种类型,它们具有各自的特点。

MSP430系列微控制器可以使用具有电路结构简单、工作频率容易调整的RC可至10^-3振荡器,也可以使用具有高频率稳定度的晶体振荡器。

如图1.1所示,MSP430系列微控制器通过存储器地址总线(MAB)和数据总线(MDB)与程序存储模块、数据存储模块以及各种外围设备模块连接起来,并采用统一的CPU指令和寻址模式。

各种外围设备模块在这里被等效为“寄存器”这样的一种特殊存储器。

向寄
1
存器写入数据能够实现对外围设备模块工作的控制,从寄存器读取数据能够获得外围设备模块的工作结果。

MSP430系列微控制器的时钟系统
MSP430x2xx系列芯片的时钟系统
MSP430x2xx系列微控制器的时钟系统方框图如图3.1所示。

图3.1 MSP430系列芯片的时钟系统方框图
MSP430x2xx系列微控制器的时钟系统具有4种时钟信号源:内部数控振荡器(DCO)、内部低功耗振荡器(VLO)、低频振荡器(LFXT1)和高频振荡器(XT2)。

这些时钟信号源被用来产生芯片内部使用的3种时钟信号:主时钟信号(MCLK)、子时钟信号(SMCLK)和辅助时钟信号(ACLK)。

主时钟信号(MCLK)支持芯片CPU的工作,子时钟信号(SMCLK)和辅助时钟信号(ACLK)支持芯片内部外围模块的工作。

数控振荡器(DCO)的工作可以不需要外部器件的支持,因此降低了电路的复杂程度,但是它的工作原理是基于RC振荡器,工作频率的稳定度不高。

内部低功耗振荡器(VLO)提供12kHz固定的时钟信号。

低频振荡器(LFXT1)和高频振荡器(XT2)都需要一个外部晶体谐振电路,但是具有较高的工作频率稳定度。

采用2个晶体谐振电路的目的是能够
2
让一个工作在较高的工作频率,另一个则工作在较低的工作频率。

使用较高的工作频率可以获得高速度的信号处理;使用较低的工作频率可以降低芯片功耗。

并不是每一种芯片都支持全部4种时钟信号源。

例如MSP430G2231芯片不支持高频振荡器(XT2),也不支持低频振荡器(LFXT1)的高频模式。

时钟系统能够通过向一些被称作为寄存器的等效存储单元写入数据来选择时钟信号源。

时钟系统还具有一些能够改变时钟信号源频率的寄存器。

时钟系统的相关寄存器
MSP430系列微控制器芯片的管脚具有多种功能,通过对相关寄存器进行设置能够实现需要的功能。

时钟系统也具有多种信号源,如何使用其中的一种?数控振荡器(DCO)的工作频率可以调整,如何进行调整?同样,这些问题也可以通过对相关寄存器进行设置就能够实现。

进一步讲,具有冯·诺依曼结构计算机的工作可以理解为从某个地址读取指令,或者将计算结果送往某个地址。

CPU对MSP430系列微控制器内部功能模块的控制也可以理解为向它写入数据,或者从其读取数据。

为了区别通常的程序存储器和数据存储器的访问,把对这些芯片内部功能模块的访问称作为对寄存器的访问。

CPU通过向相应的寄存器写入数据控制对应的芯片内部功能模块的工作,从相应的寄存器读出数据获得对应的芯片内部功能模块的工作结果。

配置系统时钟涉及状态寄存器(SR)、中断使能寄存器1(IE1)、中断标志寄存器1(IFG1)、数控振荡器(DCO)控制寄存器(DCOCTL)、系统时钟控制寄存器1(BCSCTL1)、系统时钟控制寄存器2(BCSCTL2)和系统时钟控制寄存器3(BCSCTL3)。

这里状态寄存器(SR)、中断使能寄存器1(IE1)和中断标志寄存器1(IFG1)不属于时钟系统模块,但是它们的一些内容影响到时钟系统模块的工作。

下面的寄存器介绍内容包括寄存器中每一位的位地址、位名称、操作方式、复位值以及每一位的功用。

操作方式表示对位可以进行读和写操作,或者仅能进行读操作,或者仅能进行写操作。

对仅能进行写操作的位进行读操作将获得一个随机数。

对仅能进行读操作的位进行写操作不起作用,也有可能产生不可预见的事情,因此应该尽量避免。

复位的目的是使得微控制器从一种约定的工作状态下开始工作。

复位值就是复位动作对寄存器初始状态的指定值,即对MSP430系列微控制器的各种外围模块初始工作状态的指定。

对寄存器的复位值应当给予足够地重视,这些数值对外围模块的工作设置具有很大的影响。

经常需要改变寄存器中某一位的状态,但是MSP430系列微控制器不支持位寻址,即不能对位直接进行操作,本节将介绍利用逻辑运算实现位寻址。

3
状态寄存器(SR)是属于CPU的一个寄存器,这个寄存器的一些数据位影响到MSP430微控制器系统时钟模块的工作状态。

状态寄存器中与时钟系统相关的位包括SCG1、SCG0、OSCOFF和CPUOFF。

这里只讨论这些位的功能。

SCG1:系统时钟控制位1
0 SMCLK开启
1 SMCLK关闭
SCG0:系统时钟控制位0
0 DCO开启
1 DCO关闭
OSCOFF:晶体振荡器工作控制位
0 LFXT1晶体振荡器开启
1 LFXT1晶体振荡器关闭
CPUOFF:CPU工作控制位
0 CPU开启
1 CPU关闭
4
中断使能寄存器1(IE1)的位OFIE影响到MSP430微控制器的系统时钟模块的工作状态。

OFIE:晶体振荡器出错中断使能位
0 不使能
1 使能
“使能”的功用相当于一个开关。

当处于使能状态时,该使能对应的电路功用将被激活;当处于不使能状态时,该使能对应的电路功用将被关闭,就像这个电路不存在一样。

中断标志寄存器1(IFG1)位OFIFG表征MSP430微控制器的系统时钟模块的工作状态。

这个寄存器与前面2个寄存器不同,它不是控制相关电路的工作,而仅是显示相关电路的工作状态。

OFIFG:晶体振荡器出错中断标志位
0 无中断产生
1 有中断产生
MSP430微控制器加电时的复位信号会置位OFIFG。

在使能相应中断的情况下将引起中断,因此必要时需要在用户程序中将位OFIFG清零。

5
DCOx:这里的x可以取0、1或者2。

这3位用来在系统时钟控制寄存器1(BCSCTL1)的位Rselx选定的频率范围内,选择数控振荡器(DCO)的8个工作频率之一。

MODx:这里的x可以取0到4中的任意1个数。

这5位用来微调数控振荡器(DCO)的工作频率,但当DCO=7时,即DCOx的3位全为1,该功能无效。

MSP430微控制器中的数控振荡器(DCO)是该系列器件的特色之一。

使用这个振荡器作为时钟信号源将不需要添加任何外部器件,同时这个时钟信号源的工作频率还能够通过用户程序进行调整。

XT2OFF:高频振荡器(XT2)开关控制
0 高频振荡器(XT2)开
1 高频振荡器(XT2)关
XTS:低频振荡器(LFXT1)工作模式选择
0 低频振荡器(LFXT1)低频模式
1 低频振荡器(LFXT1)高频模式
DIVAx:辅助时钟(ACLK)分频系数
Bit5 Bit4
DIVA1 DIVA0
0 0 1
0 1 2
1 0 4
1 1 8
这项功能的物理含义为在时钟信号传输的路径上插入了一个分频电路。

改变位
DIVAx的数值将改变分频电路的分频系数,达到改变时钟信号频率的目的。

6
Reslx:数控振荡器(DCO)内部电阻选择。

这里的x可以取0到3中的任意1个数,获得16种不同阻值的电阻。

数控振荡器(DCO)属于RC振荡器,改变电阻的数值能够改变振荡器的工作频率。

SELMx:主时钟(MCLK)的时钟源选择
Bit7 Bit6
SELM1 SELM0
0 0 数控振荡器(DCO)
0 1 数控振荡器(DCO)
1 0 高频振荡器(XT2)/ 当XT2不支持,为VLOCLK
1 1 低频振荡器(LFXT1)/ VLOCLK
MSP430系列微控制器包括多个子系列,MSP430x2xx属于这其中的一个。

MSP430G2231和MSP430F2619都属于MSP430x2xx子系列。

本书里所有寄存器的说明兼顾了MSP430x2xx子系列中的所有芯片。

DIVMx:主时钟(MCLK)分频系数
Bit5 Bit4
DIVM1 DIVM0
0 0 1
0 1 2
1 0 4
1 1 8
SELS:子系统时钟(SMCLK)的时钟源选择
0 数控振荡器(DCO)
1 高频振荡器(XT2)
DIVSx:子系统时钟(SMCLK)分频系数
7
Bit2 Bit1
DIVS1 DIVS0
0 0 1
0 1 2
1 0 4
1 1 8
DCOR:数控振荡器(DCO)电阻选择
0 内部
1 外部
数控振荡器(DCO)属于RC振荡器,改变电阻的数值能够改变振荡器的工作频率。

数控振荡器(DCO)既可以使用MSP430微控制器芯片内部的电阻,通过用户程序配置系统时钟控制寄存器1(BCSCTL1)中的位Reslx选择不同的内部电阻;也可以使用指定管脚连接的外部电阻。

如果外部电阻采用电位器,调整电位器就能够连续地改变数控振荡器(DCO)的工作频率。

XT2Sx:XT2时钟范围选择
Bit7 Bit6
XT2S1 XT2S0
0 0 0.4~1MHz晶体振荡器
0 1 1~3MHz晶体振荡器
1 0 3~16MHz晶体振荡器
1 1 0.4~16MHz外部时钟源
高频振荡器(XT2)需要一个外部晶体器件。

这个晶体器件的最高谐振频率为16MHz。

根据具体使用晶体的谐振频率需要完成XT2Sx的设置。

最后一种选择为采用一个完整的信号源,例如实验室的信号产生器,作为时钟源时的设置。

8
LFXT1Sx:低频时钟源选择和LFXT1时钟范围选择(受XTS/BCSCTL1控制)
Bit5 Bit4
LFXT1S 1 LFXT1S 0
XTS=0
0 0 32768Hz晶体在LFXT1
0 1 保留
1 0 VLOCLK
1 1 外部时钟源
XTS=1
0 0 0.4~1MHz晶体振荡器
0 1 1~3MHz晶体振荡器
1 0 3~16MHz晶体振荡器
1 1 0.4~16MHz外部时钟源
XCAPx:LFXT1晶体振荡器内部电容选择(仅适用于XTS=0。

当XTS=1时,应选择00)
Bit3 Bit2
XCAP1 XCAP0
0 0 1pF
0 1 6pF
1 0 10pF
1 1 12.5pF
XT2OF:XT2时钟失效标志
0 无
1 有
LFXT1OF:LFXT1时钟失效标志
0 无
1 有
注意,MSP430G2231芯片不支持高频振荡器(XT2),不支持低频振荡器(LFXT1)的高频模式。

数字控制振荡器(DCO)频率的测量
MSP430系列微控制器复位以后,主时钟信号(MCLK)和子时钟信号(SMCLK)的9
驱动信号都默认采用数字控制振荡器(DCO),分频系数默认1,因此这2个时钟信号的频率就是数字控制振荡器(DCO)的工作频率。

图1.2所示的MSP430G2231芯片管脚排列图显示管脚6,即并行输入/输出端口P1的管脚P1.4,也可以用做子时钟信号(SMCLK)的输出管脚,这样通过测量该管脚输出信号的频率就能够获得数字控制振荡器(DCO)的工作频率。

MSP430F2619芯片管脚16,同样为并行输入/输出端口P1的管脚P1.4,也同样是可以用做子时钟信号(SMCLK)的输出管脚。

数字控制振荡器(DCO)的工作频率可以调整以满足具体工作的需要。

频率的调整通过前面介绍的数控振荡器(DCO)控制寄存器(DCOCTL)和系统时钟控制寄存器1(BCSCTL1)的位Reslx来实现。

数字控制振荡器(DCO)的工作频率与相关寄存器中控制位的关系如图3.2所示。

图3.2 数字控制振荡器(DCO)的工作频率与相关寄存器中控制位的关系图
图3.2显示系统时钟控制寄存器1(BCSCTL1)的位RSELx可以指定数字控制振荡器(DCO)工作于16个频率段的其中一个。

数控振荡器(DCO)控制寄存器(DCOCTL)的位DCOx在指定频率段内的8个频率子段中选择一个。

图中没有显示的数控振荡器(DCO)控制寄存器(DCOCTL)的位MODx在指定频率子段中实现的进一步调整。

MSP430系列微控制器中每一种芯片的数据手册都给出在一定工作电压和环境温度情况下,一些寄存器内容对应的工作频率,但是需要注意数控振荡器(DCO)属于RC振荡器,它的工作频率受工作电压、环境温度等很多因素的影响。

数据手册中给出的数控振荡器(DCO)的工作频率仅供参考。

在完成应用系统的硬件电路设计以后,采用实际测量的数控振荡器(DCO)工作频率数值,再给予合适的调整将使得系统工作得更精确。

程序示例 3.1用来实现数控振荡器(DCO)工作频率的调整。

通过测量实际的工作频率就可以确定控制数控振荡器(DCO)工作频率的相关寄存器的具体取值。

程序示例3.1
10
// 程序名称:sysclk_dco
// 程序功能:SMCLK 使用DCO,分频比1,使用管脚SMCLK 输出时钟信号
#include <MSP430.h> // 包含名称定义的对应地址或数据的头函数
void main(void) // 主函数
{
WDTCTL=WDTPW+WDTHOLD; // 关闭看门狗
// P1.4 管脚配置
P1SEL|=BIT4; // 位P1SEL.4 置位,设置P1.4 管脚为外围功能管脚
P1DIR|=BIT4; // 位P1DIR.4 置位,设置P1.4 管脚为输出管脚// DCO 频率调整
BCSCTL1&=~RSEL3; // 位RSEL3 清零
BCSCTL1&=~RSEL2; // 位RSEL2 清零
BCSCTL1|=RSEL1; // 位RSEL1 置位
BCSCTL1|=RSEL0; // 位RSEL0 置位
DCOCTL&=~DCO2; // 位DCO2 清零
DCOCTL|=DCO1; // 位DCO1 置位
DCOCTL|=DCO0; // 位DCO0 置位
while(1) // 重复执行
{
}
}
程序示例3.1中首先完成输出信号频率与数字控制振荡器(DCO)的工作频率一样的子时钟信号(SMCLK)输出管脚的配置,然后完成确定数字控制振荡器(DCO)的工作频率相关寄存器的设置。

MSP430系列微控制器的时钟模块属于它的外围模块之一。

外围模块的工作不需要CPU进行全程控制,一旦完成对这些外围模块的配置,它们将独立工作。

程序示例3.1中在完成数字控制振荡器(DCO)工作频率相关寄存器的设置以后,程序就进入 while(1) // 重复执行
{
}
在这个程序段中,CPU什么都不做,但是这时MSP430系列芯片的时钟模块一直工作,使得子时钟信号(SMCLK)输出管脚,P1.4,一直输出子时钟信号(SMCLK),这个信号的频率等于数字控制振荡器(DCO)的工作频率。

11
修改数字控制振荡器(DCO)的工作频率相关寄存器的内容将可以调整它的工作频率。

程序示例3.1没有涉及到利用位MODx对频率的进一步的调整。

位寻址功能的实现
msp430g2231.h
图2.12的Embedded Workbench for MSP430开发软件工作窗口,在工作区“Workspace”的文件“Files”栏目中将自动出现选择好目标芯片对应头文件“msp430g2231.h”。

图2.27 Code Composer TM Studio开发软件的工作窗口,工程管理栏目“Project Explorer”的“Includes”中将包含MSP430系列微控制器的所有芯片对应的声明寄存器名称与地址对应关系、寄存器位名称与数值关系的头文件,例如这里的“msp430g2231.h”。

头文件“msp430g2231.h”的“STANDARD BITS”栏目的内容如下
#define BIT0 (0x0001u)
#define BIT1 (0x0002u)
#define BIT2 (0x0004u)
#define BIT3 (0x0008u)
#define BIT4 (0x0010u)
#define BIT5 (0x0020u)
#define BIT6 (0x0040u)
#define BIT7 (0x0080u)
#define BIT8 (0x0100u)
#define BIT9 (0x0200u)
#define BITA (0x0400u)
#define BITB (0x0800u)
#define BITC (0x1000u)
#define BITD (0x2000u)
#define BITE (0x4000u)
#define BITF (0x8000u)
这里定义了16个符号常量,BIT0~BITF。

这个部分内容存在于MSP430系列微控制器所有芯片对应的头文件。

上面每一个符号常量代表一个16位数据,这个数据中只有1位为1,其余的全部为0。

程序示例3.1实现数控振荡器(DCO)工作频率调整部分,即对相关寄存器的配置部分,也出现了一些符号常量。

它们也在头文件“msp430g2231.h”中被定义,位于头文件的“Basic Clock Module”栏目。

该栏目的部分内容如下
12
…………
#define DCOCTL_ (0x0056u) /* DCO Clock Frequency Control */
DEFC( DCOCTL , DCOCTL_)
#define BCSCTL1_ (0x0057u) /* Basic Clock System Control 1 */
DEFC( BCSCTL1 , BCSCTL1_)
#define BCSCTL2_ (0x0058u) /* Basic Clock System Control 2 */
DEFC( BCSCTL2 , BCSCTL2_)
#define BCSCTL3_ (0x0053u) /* Basic Clock System Control 3 */
DEFC( BCSCTL3 , BCSCTL3_)
#define MOD0 (0x01) /* Modulation Bit 0 */
#define MOD1 (0x02) /* Modulation Bit 1 */
#define MOD2 (0x04) /* Modulation Bit 2 */
#define MOD3 (0x08) /* Modulation Bit 3 */
#define MOD4 (0x10) /* Modulation Bit 4 */
#define DCO0 (0x20) /* DCO Select Bit 0 */
#define DCO1 (0x40) /* DCO Select Bit 1 */
#define DCO2 (0x80) /* DCO Select Bit 2 */
…………
上面内容的第一段定义了MSP430系列微控制器时钟系统的相关寄存器名称和地址之间的联系,第二段定义了数控振荡器(DCO)控制寄存器(DCOCTL)中每1位的名称和对应数值之间的关系。

在程序中使用这些符号常量比使用地址,或者数据,阅读起来直观,而且物理意义明显。

统一这些寄存器名称和寄存器内包含的位名称便于互相交流。

建议在程序编辑中使用这些名称,不要使用地址和数据。

利用逻辑位运算实现位寻址功能
程序示例3.1希望使用管脚P1.4输出子时钟信号SMCLK,在这个时钟信号是由数字控制振荡器(DCO)直接驱动时,通过测量子时钟信号SMCLK的频率就能够获得数字控制振荡器(DCO)的工作频率。

使用管脚P1.4输出子时钟信号SMCLK,需要对管脚进行相关的配置,语句
P1SEL|=BIT4; // 位P1SEL.4 置位,设置P1.4 管脚为外围功能管脚
P1DIR|=BIT4; // 位P1DIR.4 置位,设置P1.4 管脚为输出口13
实现管脚P1.4用作外围模块管脚、输出方向的配置。

这里实现管脚配置的方法与图2.8和图2.28中程序示例采用的方法不同。

采取不同方法的原因是前面的程序示例希望将P1端口的所有管脚配置为同样的功能,这里只希望对管脚P1.4进行配置,而且还不希望影响P1端口的其它管脚的配置状态。

MSP430系列芯片不支持位寻址,因此不能只对某一个独立的数据位进行操作。

现在需要采用字节寻址的方法对字节中的某一位进行操作,同时不影响其它位的状态。

程序示例3.1就介绍了这种方法。

采用字节寻址实现位寻址需要使用与、或、非三种逻辑运算。

MSP430系列微控制器开发软件中,与运算操作符为“&”,与运算表达式和运算结果的一个例子为
0b10101010 & 0b11110000 = 0b10100000
表达式中数据前缀“0b”表示数据为2进制格式,数据前缀“0x”表示数据为16进制格式,10进制的数据不用添加前缀。

运算结果显示,任意数据位和“1”进行“与”运算,它的数值将保持不变;任意数据位和“0”进行“与”运算,它的数值将为0。

如果希望将一个字节中的某一位清零,同时保持这个字节中的其它位数值不变,这样只需将这个字节和一个特定的数进行“与”运算,这个数对应于希望为0的位取“0”,其它位“全部取1”。

或运算操作符为“|”,或运算表达式和运算结果的一个例子为
0b10101010 | 0b11110000 = 0b11111010
运算结果显示,任意数据位和“1”进行“或”运算,它的数值将为1;任意数据位和“0”进行“或”运算,它的数值将保持不变。

如果希望将一个字节中的某一位置位,同时保持这个字节中的其它位数值不变,这样只需将这个字节和一个特定的数进行“或”运算,这个数对应于希望为1的位取“1”,其它位“全部取0”。

非运算操作符为“~”,非运算表达式和运算结果的一个例子为
~0b11110000 = 0b00001111
运算结果显示,“非”运算使得每位的状态取反。

非运算操作符“~”为单目操作符,它只需要1个操作数。

与运算操作符“&”和或运算操作符“|”都为双目操作符,它们都需要2个操作数。

程序示例3.1使用与、或、非三种逻辑运算,使用字节寻址来实现等效的位寻址,即处理一个数据中的一个指定的位。

它的内容包括清“0”一个指定位,或者置“1”一个指定位。

语句
DCOCTL&=~DCO2; // 位DCO2 清零
实现将数控振荡器(DCO)控制寄存器(DCOCTL)中最高位清0,但是维持其它位不14
变。

符号常量DCO2的内容为“0b10000000”,只有最高位为1,其它为0。

执行这条语句首先对这个数据进行“非”运算,使得数据转换为“0b01111111”,只有最高位为0,其它为1。

接着将这个只有最高位为0的数据与寄存器DCOCTL的内容进行“与”运算,实现最高位清0,维持其它位不变。

语句
DCOCTL|=DCO1; // 位DCO1 置位
实现将数控振荡器(DCO)控制寄存器(DCOCTL)中次高位置1,但是维持其它位不变。

符号常量DCO1的内容为“0b01000000”,只有次高位为1,其它为0。

执行这条语句将这个只有次高位为1,其它为0的数据与寄存器DCOCTL的内容进行“或”运算,实现次高位置1,维持其它位不变。

程序下载
MSP430系列微控制器开发软件不仅支持C语言源程序的编辑、编译、调试,而且还可以完成程序代码向目标芯片的下载。

向目标芯片的下载指令代码也被称作为芯片编程。

实际上,C语言源程序的仿真调试名称“FET Debugger”中FET是Flash Emulation Tool 的缩写,表示这时执行的指令为MSP430芯片内部程序存储器(Flash)中存储的内容。

这也就是说,在进行仿真调试之前,MSP430微控制器芯片已经被下载了指令代码。

将完成编辑和编译的C语言源程序,使用进入程序仿真调试的方法是向MSP430微控制器目标芯片下载程序代码的一种方式。

通过这种方式完成对目标芯片程序代码的下载以后,建议关闭“FET Debugger”调试环境,因为下面需要对目标芯片断电,目标芯片的断电将切断计算机与硬件调试工具之间的通信,可能导致MSP430系列微控制器开发软件的工作异常。

通过使MSP430微控制器芯片断电,再次对MSP430微控制器芯片加电,这样MSP430微控制器芯片将完成复位,然后自动地在下载到芯片内部程序存储器(Flash)中指令代码的控制下工作。

使MSP430微控制器芯片断电,再次对MSP430微控制器芯片加电的目的是完成芯片的复位。

如果电路板上具有复位按键,也可以通过这个按键在关闭“FET Debugger”调试环境以后使MSP430微控制器芯片自动地执行内部程序存储器(Flash)中的指令代码。

例如德州仪器(TI)公司提供给高校的LaunchPad(MSP-ESP430G2)电路板上就具有复位按键。

当复位按键按下时,将使MSP430微控制器芯片的复位管脚接地。

在MSP430微控制器芯片加电情况下,复位管脚的低电平就可以使芯片进入复位状态。

程序示例3.1可以被下载到MSP430微控制器芯片中去自主运行。

使用示波器可以观察到由子时钟信号(SMCLK)输出管脚输出的方波信号。

程序示例 3.1即可以被下载到MSP430G2231芯片,也可以被下载到MSP430F2619芯片。

15
高频振荡器(XT2)频率的测量
MSP430F2619微控制器芯片的时钟模块支持高频振荡器(XT2)信号源。

这个信号源是一个晶体振荡器,需要添加的外部晶体谐振电路如图3.3所示。

MSP430F2619
64-Pin 封装
图3. 3 XT2谐振电路图
图中晶体Cry1的谐振频率的选择范围为0.4~16MHz。

电容C1和C2的推荐值为15pF。

谐振电路应尽量靠近MSP430F2619微控制器芯片的管脚XT2IN和XT2OUT。

使用时钟SMCLK管脚测量高频振荡器(XT2)信号源工作频率的程序示例如下。

这个程序示例可以用于所有支持高频振荡器(XT2)的MSP430x2xx系列芯片。

程序示例3.2
// 程序名称:sysclk_xt2
// 程序功能:SMCLK 使用XT2,分频比1,使用管脚SMCLK 输出时钟信号
#include <MSP430.h> // 包含名称定义的对应地址或数据的头函数
void clkxt2_begin(void); // 声明系统时钟XT2 初始化函数
void main(void) // 主函数
{
WDTCTL=WDTPW+WDTHOLD; // 关闭看门狗
P1SEL|=BIT4; // 设置P1.4 管脚为外围模块管脚
P1DIR|=BIT4; // 设置P1.4 管脚为输出方向
clkxt2_begin ( ); // 系统时钟XT2 初始化
while(1) // 重复执行
{
}
}
16
void clkxt2_begin(void) // 系统时钟XT2初始化函数
{
BCSCTL1&=~XT2OFF; // 开启XT2
BCSCTL1&=~DIVA1; // ACLK 分频比1
BCSCTL1&=~DIVA0;
BCSCTL2|=SELM1; // 选择MCLK 时钟源为XT2CLK
BCSCTL2&=~SELM0;
BCSCTL2&=~DIVM1; // MCLK 分频比1
BCSCTL2&=~DIVM0;
BCSCTL2|=SELS; // 选择SMCLK 时钟源为XT2CLK
BCSCTL2&=~DIVS1; // SMCLK 分频比1
BCSCTL2&=~DIVS0;
BCSCTL3|=XT2S1; // 选择XT2 时钟源频率范围为3--16MHz
BCSCTL3&=~XT2S0;
}
函数clkxt2_begin()可以被用于所有支持高频振荡器(XT2)信号源的MSP430x2xx 系列芯片,在该芯片准备使用高频振荡器(XT2)信号源作为时钟模块的时钟源的情况下,对高频振荡器(XT2)信号源进行设置。

在前面描述时钟模块相关寄存器部分指出,MSP430微控制器加电时的复位信号能够置位中断标志寄存器1(IFG1)的位OFIFG。

该位的置位,在使能相应中断的情况下将引起中断,因此需要在用户程序中,将位OFIFG清零。

在函数clkxt2_begin()添加清零位OFIFG的部分将提高该函数的适应性。

void clkxt2_begin(void) // 系统时钟XT2初始化函数
{
BCSCTL1&=~XT2OFF; // 开启XT2
BCSCTL1&=~DIVA1; // ACLK 分频比1
BCSCTL1&=~DIVA0;
BCSCTL2|=SELM1; // 选择MCLK 时钟源为XT2CLK
BCSCTL2&=~SELM0;
BCSCTL2&=~DIVM1; // MCLK 分频比1
BCSCTL2&=~DIVM0;
BCSCTL2|=SELS; // 选择SMCLK 时钟源为XT2CLK 17
BCSCTL2&=~DIVS1; // SMCLK 分频比1
BCSCTL2&=~DIVS0;
BCSCTL3|=XT2S1; // 选择XT2 时钟源频率范围为3--16MHz
BCSCTL3&=~XT2S0;
do
{
IFG1&=~OFIFG; // 清除振荡器错误标志
_NOP( ); // 产生一个MSP430 系统时钟周期的延时
}
while((IFG1 & OFIFG)!=0); // 如果标志为1,继续等待
}
函数中采用DO—WHILE结构的循环语句确保标志OFIFG清除,即首先进行清除标志OFIFG,然后进行检测,如果没有清除,再次清除标志OFIFG,直到完成。

循环语句中调用函数
_NOP( ); // 产生一个MSP430 系统时钟周期的延时这个函数是属于MSP430微控制器开发软件提供的一个函数,它可以直接使用,不用进行任何声明。

执行这个函数的目的为花费1个CPU时钟MCLK周期的时间,即引入1个CPU时钟MCLK周期的时间等待。

这里使用这个函数是考虑硬件电路的工作需要时间,因此先清除标志OFIFG,然后等一下再检测工作结果。

时钟源DCO和XT2工作频率的对比
将MSP430微控制器芯片的子时钟信号(SMCLK)输出管脚配置为输出时钟信号SMCLK功能,选择时钟信号SMCLK的驱动信号源为数字控制振荡器(DCO),或者高频振荡器(XT2),这样测量SMCLK输出管脚的信号就可以获得上述驱动信号源的工作情况。

现在实验室的很多数字示波器都具有测量信号频率的功用。

例如在高校实验室中广泛使用的Tektronix TDS1012示波器,频率测量显示值具有6位有效数字。

使用德州仪器(TI)公司提供给高校的LaunchPad(MSP-ESP430G2)电路板,目标芯片采用MSP430G2231,向芯片下载程序示例3.1,即程序sysclk_dco.c。

在程序示例3.1中,设置RSEL=7;DCO=3。

这个取值就是MSP430微控制器芯片数字控制振荡器(DCO)工作频率的复位值。

由Tektronix TDS1012示波器测量到数字控制振荡器(DCO)的工作频
18。

相关文档
最新文档