MSP430x2xx的时钟配置

2019-10-24来源: eefocus关键字:MSP430x2xx  时钟  配置

概述:


本实验的目的是了解用于执行对MSP430 Value Line设备的初始化过程的步骤。在这个练习中,您将编写初始化代码,并运行该设备使用各种时钟资源。


1、写初始化代码


2、运行CPU的MCLK的来源方式:VLO 、32768晶体、DCO


3、主体程序部分


4、观察LED闪光灯速度

工具/原料

 MSP430g2xx


 IAR Embedded Workbench For MSP430 5.2


 MSP-EXP430G2 LaunchPad 实验板用户指南


 MSP-EXP430G2 LaunchPad Experimenter Board User's Guide


 MSP-EXP430G2 LaunchPad Quick Start Guide 


 


 


步骤/方法

      时钟介绍:


1、在MSP430单片机中一共有三个时钟源:


一个LFXT1CLK,为低速/高速晶振源,通常接32。768khz,也可以接(400khz~8Mhz);


一个为XT2CLK,外接标准高速晶振,通常是接8Mhz,也可以接(400khz~8Mhz);     


还有一个叫DCOCLK,为内部晶振,有RC震荡回路构成。


2、在MSP430单片机内部一共有三个时钟系统:


一个为ACLK,通常由LFXT1CLK作为时钟源,可以通过软件控制改时钟的分频系数树;    


一个为MCLK(Main CLK)一听就知道是主时钟单元,为系统内核提供时钟,它可以通过软件从三个时钟源选择;


还有一个为SMCLK,称作辅助主时钟,也是可以由软件选择时钟源。


Basic Clock Module Registers(基础时钟寄存器)


DCO control register


Basic clock system control 1


Basic clock system control 2


Basic clock system control 3


SFR interrupt enable register 1


SFR interrupt flag register 1


3、MSP430的时钟设置包括3个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3



DCOCTL,DCO控制寄存器,地址为56H,初始值为60H


DCO2

DCO1

DCO0

MOD4

MOD3

MOD2

MOD1

MOD0


DCO0~DCO2: DCO Select Bit,定义了8种频率之一,而频率由注入直流发生器的电流定义。


MOD0~MOD4: Modulation Bit,频率的微调。


一般不需要DCO的场合保持默认初始值就行了。


BCSCTL1,Basic Clock System Control 1,地址为57H,初始值为84H


XT2OFF

XTS

DIVA1

DIVA0

XT5V

RSEL2

RSEL1

RSEL0


RSEL0~RSEL2: 选择某个内部电阻以决定标称频率.0最低,7最高。


XT5V: 1。


DIVA0~DIVA1:选择ACLK的分频系数。DIVA=0,1,2,3,ACLK的分频系数分别是1,2,4,8;


XTS: 选择LFXT1工作在低频晶体模式(XTS=0)还是高频晶体模式(XTS=1)。


XT2OFF: 控制XT2振荡器的开启(XT2OFF=0)与关闭(XT2OFF=1)。


正常情况下把XT2OFF复位就可以了。


BCSCTL2,Basic Clock System Control 2,地址为58H,初始值为00H


SEM1

SELM0

DIVM1

DIVM0

SELS

DIVS1

DIVS0

DCOR


DCOR: Enable External Resistor. 0,选择内部电阻;1,选择外部电阻


DIVS0~DIVS1: DIVS=0,1,2,3对应SMCLK的分频因子为1,2,4,8


SELS: 选择SMCLK的时钟源, 0:DCOCLK; 1:XT2CLK/LFXTCLK。


DIVM0~1: 选择MCLK的分频因子, DIVM=0,1,2,3对应分频因子为1,2,4,8.


SELM0~1: 选择MCLK的时钟源, 0,1:DCOCLK, 2:XT2CLK, 3:LFXT1CLK


我用的时候一般都把SMCLK与MCLK的时钟源选择为XT2。


其它:


1。 LFXT1: 一次有效的PUC信号将使OSCOFF复位,允许LFXT1工作,如果LFXT1信号没有用作SMCLK或MCLK,可软件置OSCOFF关闭LFXT1。


2. XT2: XT2产生XT2CLK时钟信号,如果XT2CLK信号没有用作时钟MCLK和SMCLK,可以通过置XT2OFF关闭XT2,PUC信号后置XT2OFF,即XT2的关闭的。


3. DCO振荡器:振荡器失效时,DCO振荡器会自动被选做MCLK的时钟源。如果DCO信号没有用作SMCLK和MCLK时钟信号时,可置SCG0位关闭DCO直流发生器。


4. 在PUC信号后,由DCOCLK作MCLK的时钟信号,根据需要可将MCLK的时钟源另外设置为LFXT1或XT2,设置顺序如下:


(1)清OSCOFF/XT2


(2)清OFIFG


(3)延时等待至少50uS


(4)再次检查OFIFG,如果仍置位,则重复(1)-(4)步,直到OFIFG=0为止。


(5)设置BCSCTL2的相应SELM。


实例分析:


1、CPU运行在VLO时钟下:


这是最慢的时钟,在约12千赫兹下运行。因此,我们将通过可视化的LED闪烁的红色慢慢地在约每3秒钟率。我们可以让时钟系统默认这种状态,设置专门来操作VLO。我们将不使用任何ALCK外设时钟在此实验室工作,但你应该认识到,ACLK来自VLO时钟。


#include


void main(void)


{


WDTCTL = WDTPW + WDTHOLD; 关闭看门狗定时器


P1DIR = 0x40; 配置输出


P1OUT = 0; 关闭LED


BCSCTL3 |= LFXT1S_2;


IFG1 &= ~OFIFG;清除OSCFault 标志


__bis_SR_register(SCG1 + SCG0);关闭 DCO


BCSCTL2 |= SELM_3 + DIVM_3;


while(1)


{


P1OUT = 0x40;开启LED


_delay_cycles(100);


P1OUT = 0; 关闭 LED


_delay_cycles(5000);


}


}


2、CPU运行在晶振(32768Hz)时钟下:


晶体频率为32768赫兹,约3倍的VLO。如果我们在前面的代码中使用晶振,指示灯应闪烁大约每秒一次。你知道为什么32768赫兹是一个标准?这是因为这个数字是2的15次方,因此很容易用简单的数字计数电路,以每秒一次获得率 ——手表和其他时间时基。认识到ACLK来自外部晶振时钟。


#include


void main(void)


{


WDTCTL = WDTPW + WDTHOLD; 关闭看门狗定时器


P1DIR = 0x41;和P1。6配置输出


P1OUT = 0x01;开启P1.0


BCSCTL3 |= LFXT1S_0; 晶振


while(IFG1 & OFIFG)


{


IFG1 &= ~OFIFG; 清除 OSCFault 标志


_delay_cycles(100000); 为可见的标志延时


}


P1OUT = 0;关闭P1


__bis_SR_register(SCG1 + SCG0); 关闭 DCO


BCSCTL2 |= SELM_3 + DIVM_3;


while(1)


{


P1OUT = 0x40; 开启 LED


_delay_cycles(100);


P1OUT = 0; 关闭LED


_delay_cycles(5000);


}


}


3、CPU运行在晶振(32768Hz)和DCO时钟下:


最慢的频率,我们可以运行DCO约在1MHz(这也是默认速度)。因此,我们将开始切换MCLK到DCO下。在大多数系统中,你会希望ACLK上运行的VLO或32768赫兹晶振。由于ACLK在我们目前的代码是在晶体上运行,我们会打开DCO计算。


#include


void main(void)


{


WDTCTL = WDTPW + WDTHOLD; 关闭看门狗定时器


if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)


{


while(1); 挂起


}


BCSCTL1 = CALBC1_1MHZ;


DCOCTL = CALDCO_1MHZ; 设置DCO模式


P1DIR = 0x41;和P1。6配置输出


P1OUT = 0x01; 开启


BCSCTL3 |= LFXT1S_0;


while(IFG1 & OFIFG)


{


IFG1 &= ~OFIFG; 清除OSCFault 标志


_delay_cycles(100000); 为可见标志延时


}


P1OUT = 0; 关闭


// __bis_SR_register(SCG1 + SCG0); 关闭DCO


BCSCTL2 |= SELM_0 + DIVM_3;


while(1)


{


P1OUT = 0x40; 开启


_delay_cycles(100);


P1OUT = 0; 关闭


_delay_cycles(5000);


}


}


4、CPU运行在DCO时钟下:


最慢的频率,我们可以运行DCO约在1MHz(这也是默认速度)。因此,我们将开始切换MCLK到DCO下。在大多数系统中,你会希望在VLO或者是晶振下运行ACLK。由于ACLK在我们目前的代码是在VLO上运行,我们会打开DCO运行。


#include


void main(void)


{


WDTCTL = WDTPW + WDTHOLD;关闭看门狗定时器


if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)


{


while(1); 挂起


}


BCSCTL1 = CALBC1_1MHZ;


DCOCTL = CALDCO_1MHZ; 设置DCO模式


P1DIR = 0x40; 配置输出


P1OUT = 0; 关闭


BCSCTL3 |= LFXT1S_2;


IFG1 &= ~OFIFG;清除 OSCFault 标志


//__bis_SR_register(SCG1 + SCG0); 关闭DCO


BCSCTL2 |= SELM_0 + DIVM_3;


while(1)


{


P1OUT = 0x40; 关闭


_delay_cycles(100);


P1OUT = 0; 开启


_delay_cycles(5000);


}


}‍


以下将会分析上面4个例子的代码细微差别:

首先让我们看一下msp430x20x2.h这个文件中的内容,由于头文件信息量很大这里就只简单说明和以上四个代码有关的部分,其余请大家自行阅读。


一、WDTCTL = WDTPW + WDTHOLD;                // 关闭看门狗定时器(例1、2、3、4)

头文件中的相关说明如下:

/************************************************************

* WATCHDOG TIMER

************************************************************/

#define __MSP430_HAS_WDT__      /* Definition to show that Module is available */

SFR_16BIT(WDTCTL);                /* Watchdog Timer Control */

/* The bit names have been prefixed with "WDT" */

#define WDTIS0                 (0x0001)

#define WDTIS1                 (0x0002)

#define WDTSSEL                (0x0004)

#define WDTCNTCL              (0x0008)

#define WDTTMSEL               (0x0010)

#define WDTNMI                 (0x0020)

#define WDTNMIES               (0x0040)

#define WDTHOLD                (0x0080)

#define WDTPW                  (0x5A00)

这个指令设置密码(WDTPW)和停止位定时器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的辅助下完成。

举例如下:

A、间隔时间由Bit0-2位编码:

1、看门狗的时钟由FSMCLK(假设为1MHz)

#define WDT_MDLY_32         (WDTPW+WDTTMSEL+WDTCNTCL)                         /* 32ms interval (default) */

#define WDT_MDLY_8          (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)                  /* 8ms     " */

#define WDT_MDLY_0_5        (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)                  /* 0.5ms   " */

#define WDT_MDLY_0_064      (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)           /* 0。064ms " */


2、看门狗的时钟由FACLK(假设为32KHz)

#define WDT_ADLY_1000       (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)                 /* 1000ms " */

#define WDT_ADLY_250        (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)          /* 250ms   " */

#define WDT_ADLY_16 (WDTPW+WDTTMSEL+W

[1] [2] [3]
关键字:MSP430x2xx  时钟  配置 编辑:什么鱼 引用地址:http://news.pyfle.com/mcu/ic478217.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:MSP430-时钟系统和GPIO
下一篇:MSP430F149;一、基本时钟

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MSP430X5XX的时钟系统与低功耗模式
引言:全新改版,关于MSP430x5xx时钟系统与低功耗模式介绍。用到低功耗的时候,不得不仔细的看文档,做比较实验,真繁琐。 430系列单片机中有各种时钟信号,第一次接触免不了一头雾水。而且如果想发挥430低功耗的优势,就不得不对它的时钟系统(Unified Clock System)有所了解。 1. 时钟模块总览 这是MSP430X5XX的时钟系统框图。乍一看很复杂,不过简化之后就清楚多了   整个系统主要分为左右两大块,左边是时钟源模块,右边是时钟调整模块。 左边的模块——XT1、内建时钟(DCO)、XT2用来产生时钟源,也就是右边最终输出的时钟信号的基准信号
发表于 2015-11-10
MSP430X5XX的时钟系统与低功耗模式
使用C语言进行单片机电子时钟课程设计
第一章 设计目的及要求1.目的通过对电子时钟系统进行编程与Protues仿真,进一步掌握单片机的组成,P1、P0、P2、P3口的应用,蜂鸣器的应用,定时中断程序的编写及应用,对之前学习的单片机课程进行回顾与应用;初步掌握Protues仿真方法以及用keil软件编写程序的方法。2.题目与要求本次课程设计的题目为:电子时钟的设计,其具体要求为:(1)能实现时、分、秒的显示;(2)能实现12、24小时制的切换;(3)能设定时间;(4)能设定闹钟;整个系统要设计键盘和显示器,利用单片机内部时钟完成定时器的定时设计。第二章 理论基础1.AT89C52芯片AT89C52芯片的引脚图如图1所示。图1 AT89C52芯片引脚其中主要应用到的引脚口
发表于 2019-12-06
使用C语言进行单片机电子时钟课程设计
STM8S内部时钟切换问题解决
/************************************************************************************************************************************ Name    : STM8S内部时钟切换问题解决* Author  : MingMing* Release : 2013/12/28* Update  : 2013/12/29* E-mail  : clint.wang@foxmail.com
发表于 2019-12-05
STM8S内部时钟切换问题解决
基于STM8的IIC协议--实例篇--时钟模块(DS3231)读取
1. 综述  由上篇博客可知道IIC协议如何用代码实现,本篇博客就不涉及协议内容,只讲解如何使用。  本次的实验传感为:DS3231(时钟模块),对于时钟模块的具体信息我也就不多介绍,大家可以自行度娘,具体功能无非就是让单片机中能够起到获取时间的作用。该模块是可以由IIC协议去驱动的,再加上所要的操作也是比较简单,部分刚接触IIC协议的小伙伴可以拿来练手的一个模块。2. 明确任务顺序  个人习惯,在每驱动一个新传感的时候,我会将我要完成的传感分为几个任务点。接下来就展示一下我在写DS3231模块时的任务栏。  一.硬件部分     1.完成排针焊接     2.
发表于 2019-12-04
基于STM8的IIC协议--实例篇--时钟模块(DS3231)读取
单片机电子时钟和led流水灯的结合(仿真+程序)
这是一个基于定时器的电子时钟,以前总是觉得数码管和LED挺简单的,谁知道组合起来还是有些困难的,但还是一一的解决了程序中的bug,新手也可以借鉴一下,感觉还挺有趣的。如果发现程序中有什么bug可以回帖相互探讨一下。单片机源程序如下:#include<reg52.H>#include<intrins.H>#define uchar unsigned char#define uint unsigned intuchar code huayang1[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf};  
发表于 2019-12-03
单片机电子时钟和led流水灯的结合(仿真+程序)
stm8时钟切换
STM8的时钟系统相较于STM32,没有那么复杂,从时钟树上可以看到全貌,如图主时钟源可以选择4种时钟源:HSE(1-24MHZ)、HSI(16M)、LSI(128K)和最大24M的外部高速时钟。系统复位后,默认使用HSI的8分频作为主时钟,因为HSI稳定的时间较短,8分频可保证系统在较差的VDD条件下安全启动。现在将HSI时钟切换到HSEvoid Sys_clk_Init()                         //使用外部16M晶振{//CLK_ICKR |= 0x00;    
发表于 2019-12-02
stm8时钟切换
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 pyfle.com, Inc. All rights reserved
快乐赛车开奖直播 快乐赛车分析软件 吉林快3代理 快乐飞艇如何玩才稳 快乐飞艇 快乐飞艇如何玩才能盈利 快乐赛车全天人工计划 湖南快乐十分走势 吉林快3 快乐赛车注册网址