历史上的今天
返回首页

历史上的今天

今天是:2024年10月24日(星期四)

正在发生

2019年10月24日 | MSP430x2xx的时钟配置

2019-10-24 来源:eefocus

概述:


本实验的目的是了解用于执行对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+WDTCNTCL+WDTSSEL+WDTIS1)          /* 16ms    " */


B、看门狗模式——在过期时间后重启:

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

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

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

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

#define WDT_MRST_0_064      (WDTPW+WDTCNTCL+WDTIS1+WDTIS0)                    /* 0.064ms " */


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

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

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

#define WDT_ARST_16         (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)                   /* 16ms    " */

#define WDT_ARST_1_9        (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)            /* 1.9ms   " */


二、P1DIR = 0x40;                               // P1.6 配置输出

    P1OUT = 0;                                 // P1关闭      (例1、2、3、4)

其中DIR 和P1OUT分别配置IO口的方向和输出值,这里不在赘述,请参考手册。


三、BCSCTL3 |= LFXT1S_2;                   // LFXT1 = VLO       (例1和例4)

    BCSCTL3 |= LFXT1S_0;                   // LFXT1 = 32768Hz    (例2和例3)

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

* Basic Clock Module

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

#define __MSP430_HAS_BC2__                    

/* Definition to show that Module is available */


SFR_8BIT(DCOCTL);                         /* DCO Clock Frequency Control */

SFR_8BIT(BCSCTL1);                        /* Basic Clock System Control 1 */

SFR_8BIT(BCSCTL2);                        /* Basic Clock System Control 2 */

SFR_8BIT(BCSCTL3);                        /* Basic Clock System Control 3 */

推荐阅读

史海拾趣

Epistar Corp公司的发展小趣事

近年来,随着OLED(有机发光二极管)技术的兴起,LED行业面临着巨大的挑战。Epistar敏锐地意识到了这一点,开始积极调整战略方向,加大在OLED技术领域的研发力度。同时,公司还通过优化产品结构、提高生产效率等措施降低成本、提升竞争力。这些努力使Epistar在OLED技术浪潮中保持了稳健的发展态势。

Free2Move公司的发展小趣事

作为一家电子产品制造企业,Epistar始终关注环保和可持续发展问题。公司积极采用环保材料和生产工艺减少污染排放和能源消耗;同时,Epistar还加强了对废旧产品的回收和处理工作以减少对环境的负面影响。这些努力不仅提升了公司的社会形象也增强了公司的市场竞争力。

得力(deli)公司的发展小趣事

得力公司在国内市场取得成功后,开始积极拓展海外市场。公司在全球建立了多个生产基地和创新研发中心,整合全球人才和资源,为用户提供卓越的产品和服务。同时,得力还注重品牌本土化经营和国际化运营,努力融入当地市场和文化,赢得了全球客户的信赖和认可。

Ferroxcube公司的发展小趣事

随着全球电子行业的竞争日益激烈,Ferroxcube公司意识到,要想保持领先地位,就必须不断创新。于是,公司决定投入巨资建立一个新的研发中心,专注于磁性元件的前沿技术研究。

研发中心的建立吸引了大批优秀的科研人才加入Ferroxcube。在新的研发团队的带领下,公司相继推出了多款具有自主知识产权的新型磁性元件,这些元件在性能、稳定性和可靠性方面都达到了行业领先水平。

其中一款名为“XX磁芯”的产品,凭借其超高的磁导率和极低的损耗,在市场上引起了轰动。这款产品不仅被广泛应用于各类电子设备中,还成为了许多高校和科研机构的研究对象。Ferroxcube因此成为了行业内技术创新的佼佼者。

德艺隆(DEALON)公司的发展小趣事

德艺隆自创立之初,就专注于电子开关、插座和连接器的研发与生产。在创始人陈建新的带领下,公司聚集了一批从业多年的设计开发、生产管理等技术人员。他们日夜兼程,不断攻克技术难关,逐渐在行业内树立了技术领先的地位。一次,公司接到一个要求极高精度的连接器订单,技术人员经过反复试验,最终成功研发出符合要求的连接器,赢得了客户的赞誉,也为公司赢得了更多的市场份额。

ETTINGER公司的发展小趣事

Ettinger,这个源于英国的皮具奢侈品牌,由Gerry Ettinger在1934年创立。自创立之初,Ettinger就致力于提供高品质的皮具产品,凭借其精湛的皮具制作工艺和独特的英格兰式设计风格,逐渐在市场上树立了良好的品牌形象。初期,Ettinger主要专注于手工制作皮具,通过不断提升产品质量和设计水平,赢得了消费者的青睐。

问答坊 | AI 解惑

wap gprs cmwap cmnet 联通wap之间的关系及不同

1.WAP和GPRS有什么区别啊? 严格的说wap和gprs并不能相提并论的机以比较,因为这是两个不同的技术概念。简单的说,wap是一种无线网络应用协议,而gprs是实现wap应用的一种网络传输技术方式。形象的说,wap如果是一封信,gprs就是送信到达的邮车 ...…

查看全部问答>

msgQReceive 接收不到消息?

请问:msgQReceive 接收不到消息? 有可能是哪些原因? -------------------------------- …

查看全部问答>

请教关于IPSM的问题

大侠好:    目前修改了FLASH升级到64M,现在已经可以正常进入BOOT的MAIN中,用以前的PSM也可以进入到CE中,但是分区还是跟以前一样,在CE下可用的只有3M。    现在我将IPSM中唯一可以修改的文件plat_api.c进行修改: 如下 ...…

查看全部问答>

弱弱的问一下:在wince5.0中如何实现对SD卡的驱动?

在wince5.0中如何实现对SD卡的驱动,是不是要以下步骤: 1.在WINCE 项目中添加SD 卡的相关的组建,例如: CATALOG->device drivers->SDIO->SDMemory CATALOG->device drivers->SDIO->SDIO Host->Samsung 2410 SDIO Host CATALOG->device drivers-> ...…

查看全部问答>

问一个arm中断的问题

我的环境:at91rm9200+28F128+dataflash 我运行仿真器时,程序执行起点是__ENTRY,地址是0x20000000,(1)请问这个地址是可变的吗? 1ffffff4        [0xffffffff]   dci      0xffffffff ; ...…

查看全部问答>

关于cpu指令集的问题?

指令集指什么?硬件上的还是软件上的? 如果我自己做一个cpu的话,需要和使用的操作系统之间 在指令集上有什么考虑?…

查看全部问答>

怎么在新话题里面插图片呀?麻烦高手指点一下,谢谢

我想把我的一些原理图弄到新话题里面,请教高手一些问题,但不知道怎么把图片弄进来?  …

查看全部问答>

stm32中延时程序

                                 现在处理器越用性能越强,突然想起一个问题,不知道大家通常在STM32中是怎样写比较准确点的延时程序,如延时 ...…

查看全部问答>

献给新手:解析STM32的库函数

replyreload += \',\' + 1099317; 意法半导体在推出STM32微控制器之初,也同时提供了一套完整细致的固件开发包,里面包含了在STM32开发过程中所涉及到的所有底层操作。通过在程序开发中引入这样的固件开发包,可以使开发人员从复杂冗余的底层寄 ...…

查看全部问答>