×
嵌入式 > 嵌入式开发 > 详情

MSP430学习心得---时钟

发布时间:2020-06-15 发布时间:
|

时钟初始化和GPIO

 

概述:

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

1、写初始化代码

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

3、主体程序部分

4、观察LED闪光灯速度

MSP430时钟

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

(1)LFXT1CLK,为低速/高速晶振源,通常接32.768kHz,也可以接(400kHz~16Mhz);

(2)XT2CLK,可选高频振荡器,外接标准高速晶振,通常是接8Mhz,也可以接(400kHz~16Mhz);

(3)DCOCLK,数控振荡器,为内部晶振,由RC震荡回路构成;

(4)VLOCLK,内部低频振荡器,12kHz标准振荡器。

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

(1)ACLK,Auxiliaryxa0Clock,辅助时钟,通常由LFXT1CLK或VLOCLK作为时钟源,可以通过软件控制更改时钟的分频系数;

(2)MCLK,Masterxa0Clock,系统主时钟单元,为系统内核提供时钟,它可以通过软件从四个时钟源选择;

(3)SMCLK,Sub-Mainxa0Clock,系统子时钟,也是可以由软件选择时钟源。

Basicxa0Clockxa0Modulexa0Registers(基础时钟寄存器)

DCOxa0controlxa0registerxa0DCOCTL

Basicxa0clockxa0systemxa0controlxa01xa0BCSCTL1

Basicxa0clockxa0systemxa0controlxa02xa0BCSCTL2

Basicxa0clockxa0systemxa0controlxa03xa0BCSCTL3

SFRxa0interruptxa0enablexa0registerxa01xa0IE1

SFRxa0interruptxa0flagxa0registerxa01xa0IFG1

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

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

DCO2DCO1DCO0MOD4MOD3MOD2MOD1MOD0

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

MOD0~MOD4:xa0Modulationxa0Bit,频率的微调。

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

BCSCTL1,Basicxa0Clockxa0Systemxa0Controlxa01,地址为57H,初始值为84H

XT2OFFXTSDIVA1DIVA0XT5VRSEL2RSEL1RSEL0

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

XT5V:xa01.

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

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

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

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

BCSCTL2,Basicxa0Clockxa0Systemxa0Controlxa02,地址为58H,初始值为00H

SEM1SELM0DIVM1DIVM0SELSDIVS1DIVS0DCOR

DCOR:xa0Enablexa0Externalxa0Resistor.xa00,选择内部电阻;1,选择外部电阻

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

SELS:xa0选择SMCLK的时钟源,xa00:DCOCLK;xa01:XT2CLK/LFXTCLK.

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

SELM0~1:xa0选择MCLK的时钟源,xa00,1:DCOCLK,xa02:XT2CLK,xa03:LFXT1CLK

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

其它:

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

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

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

4.xa0在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

voidxa0main(void)

{

WDTCTLxa0=xa0WDTPWxa0+xa0WDTHOLD;xa0//xa0关闭看门狗定时器

P1DIRxa0=xa00x40;xa0//xa0P1.6xa0配置输出

P1OUTxa0=xa00;xa0//xa0关闭LED

BCSCTL3xa0|=xa0LFXT1S_2;xa0//xa0LFXT1xa0=xa0VLO

IFG1xa0&=xa0~OFIFG;xa0//xa0清除OSCFaultxa0标志

__bis_SR_register(SCG1xa0+xa0SCG0);xa0//xa0关闭xa0DCO

BCSCTL2xa0|=xa0SELM_3xa0+xa0DIVM_3;xa0//xa0MCLKxa0=xa0VLO/8

while(1)

{

P1OUTxa0=xa00x40;xa0//xa0开启LED

_delay_cycles(100);

P1OUTxa0=xa00;xa0//xa0关闭xa0LED

_delay_cycles(5000);

}

}

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

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

#include

voidxa0main(void)

{

WDTCTLxa0=xa0WDTPWxa0+xa0WDTHOLD;xa0//xa0关闭看门狗定时器

P1DIRxa0=xa00x41;xa0//xa0P1.0xa0和P1.6配置输出

P1OUTxa0=xa00x01;xa0//xa0开启P1.0

BCSCTL3xa0|=xa0LFXT1S_0;xa0//xa0LFXT1xa0=xa032768Hzxa0晶振

while(IFG1xa0&xa0OFIFG)

{

IFG1xa0&=xa0~OFIFG;xa0//xa0清除xa0OSCFaultxa0标志

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

}

P1OUTxa0=xa00;xa0//xa0关闭P1

__bis_SR_register(SCG1xa0+xa0SCG0);xa0//xa0关闭xa0DCO

BCSCTL2xa0|=xa0SELM_3xa0+xa0DIVM_3;xa0//xa0MCLKxa0=xa032768/8

while(1)

{

P1OUTxa0=xa00x40;xa0//xa0开启xa0LED

_delay_cycles(100);

P1OUTxa0=xa00;xa0/xa0/xa0关闭LED

_delay_cycles(5000);

}

}

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

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

#include

voidxa0main(void)

{

WDTCTLxa0=xa0WDTPWxa0+xa0WDTHOLD;xa0//xa0关闭看门狗定时器

ifxa0(CALBC1_1MHZxa0==0xFFxa0||xa0CALDCO_1MHZxa0==xa00xFF)

{

while(1);xa0//xa0Ifxa0calxa0constxa0erased,xa0挂起

}

BCSCTL1xa0=xa0CALBC1_1MHZ;xa0//xa0Setxa0range

DCOCTLxa0=xa0CALDCO_1MHZ;xa0//设置DCO模式

P1DIRxa0=xa00x41;xa0//xa0P1.0xa0和P1.6配置输出

P1OUTxa0=xa00x01;xa0//xa0P1.0xa0开启

BCSCTL3xa0|=xa0LFXT1S_0;xa0//xa0LFXT1xa0=xa032768Hz

while(IFG1xa0&xa0OFIFG)

{

IFG1xa0&=xa0~OFIFG;xa0//xa0清除OSCFaultxa0标志

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

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

}

P1OUTxa0=xa00;xa0//xa0P1.6xa0关闭

//xa0__bis_SR_register(SCG1xa0+xa0SCG0);xa0//xa0关闭DCO

BCSCTL2xa0|=xa0SELM_0xa0+xa0DIVM_3;xa0//xa0MCLKxa0=xa0DCO

while(1)

{

P1OUTxa0=xa00x40;xa0//xa0P1.6xa0开启

_delay_cycles(100);

P1OUTxa0=xa00;xa0/xa0/xa0P1.6xa0关闭

_delay_cycles(5000);

}

}

4、CPU运行在DCO时钟下:

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

#include

voidxa0main(void)

{

WDTCTLxa0=xa0WDTPWxa0+xa0WDTHOLD;xa0//xa0关闭看门狗定时器

ifxa0(CALBC1_1MHZxa0==0xFFxa0||xa0CALDCO_1MHZxa0==xa00xFF)

{

while(1);xa0//xa0Ifxa0calxa0constxa0erased,挂起

}

BCSCTL1xa0=xa0CALBC1_1MHZ;xa0//xa0Setxa0range

DCOCTLxa0=xa0CALDCO_1MHZ;xa0//xa0设置DCO模式

P1DIRxa0=xa00x40;xa0//xa0P1.6xa0配置输出

P1OUTxa0=xa00;xa0//xa0P1关闭

BCSCTL3xa0|=xa0LFXT1S_2;xa0//xa0LFXT1xa0=xa0VLO

IFG1xa0&=xa0~OFIFG;xa0//xa0清除xa0OSCFaultxa0标志

//__bis_SR_register(SCG1xa0+xa0SCG0);xa0//xa0关闭DCO

BCSCTL2xa0|=xa0SELM_0xa0+xa0DIVM_3;xa0//xa0MCLKxa0=xa0DCO/8

while(1)

{

P1OUTxa0=xa00x40;xa0//xa0P1.6xa0关闭

_delay_cycles(100);

P1OUTxa0=xa00;xa0//xa0P1.6xa0开启

_delay_cycles(5000);

}

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
一只老鸟的嵌入式ARM学习心得