MSP430学习之时钟
在前面的代码中使用晶振,指示灯应闪烁大约每秒一次。你知道为什么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
MSP430时 相关文章:
- MSP430时钟设置及应用总结(11-25)
- MSP430的时钟周期 机器周期 指令周期(11-13)
- Msp430时钟设计与寄存器说明(11-13)
- MSP430 Value Line MCU学习笔记 - 基础时钟模块(11-13)
- MSP430的时钟系统(11-13)
- MSP430时钟分析(11-13)