微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > MSP430学习之时钟

MSP430学习之时钟

时间:11-13 来源:互联网 点击:

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

#include

void main(void)

{

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

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

P1OUT = 0x01; // 开启P1.0

BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz 晶振

while(IFG1 & OFIFG)

{

IFG1 &= ~OFIFG; // 清除 OSCFault 标志

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

}

P1OUT = 0; // 关闭P1

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

BCSCTL2 |= SELM_3 + divM_3; // MCLK = 32768/8

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); // If cal const erased, 挂起

}

BCSCTL1 = CALBC1_1MHZ; // Set range

DCOCTL = CALDCO_1MHZ; //设置DCO模式

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

P1OUT = 0x01; // P1.0 开启

BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz

while(IFG1 & OFIFG)

{

IFG1 &= ~OFIFG; // 清除OSCFault 标志

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

}

P1OUT = 0; // P1.6 关闭

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

BCSCTL2 |= SELM_0 + divM_3; // MCLK = DCO

while(1)

{

P1OUT = 0x40; // P1.6 开启

_delay_cycles(100);

P1OUT = 0; / / P1.6 关闭

_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); // If cal const erased,挂起

}

BCSCTL1 = CALBC1_1MHZ; // Set range

DCOCTL = CALDCO_1MHZ; // 设置DCO模式

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

P1OUT = 0; // P1关闭

BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO

IFG1 &= ~OFIFG; // 清除 OSCFault 标志

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

BCSCTL2 |= SELM_0 + divM_3; // MCLK = DCO/8

while(1)

{

P1OUT = 0x40; // P1.6 关闭

_delay_cycles(100);

P1OUT = 0; // P1.6 开启

_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)

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

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

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

#defineWDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0) /* 0.064ms " */

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

#defin

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top