MSP430时钟系统详解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// P1.6 关闭 // P1.6 开启
以下将会分析上面 4 个例子的代码细微差别: 个例子的代码细微差别:
首先让我们看一下 msp430x20x2.h 这个文件中的内容, 由于头文件信息量很大这里就只简单 说明和以上四个代码有关的部分,其余请大家自行阅读。 一、WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器(例 1、2、3、4) 头文件中的相关说明如下: #define __MSP430_HAS_WDT__ SFR_16BIT(WDTCTL); #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)
// P1.6 开启 / / P1.6 关闭
4、CPU 运行在 DCO 时钟下: 时钟下: 最慢的频率,我们可以运行 DCO 约在 1MHz(这也是默认速度) 。因此,我们将开始切换 MCLK 到 DCO 下。 在大多数系统中, 你会希望在 VLO 或者是晶振下运行 ACLK。 由于 ACLK 在我们目前的代码是在 VLO 上运行,我们会打开 DCO 运行。
// 清除 OSCFault 标志 // 为可见标志延时
P1OUT = 0; // P1.6 关闭 // __bis_SR_register(SCG1 + SCG0); // 关闭 DCO BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO while(1) { P1OUT = 0x40; _delay_cycles(100); P1OUT = 0; _delay_cycles(5000); } }
1
XT2ቤተ መጻሕፍቲ ባይዱFF: 控制 XT2 振荡器的开启(XT2OFF=0)与关闭(XT2OFF=1)。
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 : COCLK; 1 : XT2CLK/LFXTCLK. DIVM0~1: 选择 MCLK 的分频因子, DIVM=0,1,2,3 对应分频因子为 1,2,4,8. SELM0~1: 选择 MCLK 的时钟源, 0, 1 : COCLK, 2: XT2CLK, 3 : FXT1CL 其它: 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。
3
#include <msp430g2231.h> void main(void) { WDTCTL = WDTPW + WDTHOLD;
// 关闭看门狗定时器
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) { while(1); // If cal const erased, 挂起 } BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; P1DIR = 0x41; P1OUT = 0x01; BCSCTL3 |= LFXT1S_0; while(IFG1 & OFIFG) { IFG1 &= ~OFIFG; _delay_cycles(100000); } // Set range //设置 DCO 模式 // P1.0 和 P1.6 配置输出 // P1.0 开启 // LFXT1 = 32768Hz
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 复位就可以了.
DCO2
DCO1 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
MSP430 时钟系统 时钟系统讲解 系统讲解
MSP430 时钟: 时钟: 1、在 MSP430 单片机中一共有 单片机中一共有三个或四个时钟源 中一共有三个或四个时钟源: 三个或四个时钟源: (1)LFXT1CLK,为低速/高速晶振源,通常接 32.768kHz,也可以接(400kHz~16Mhz); ( 2) XT2CLK, 可选高频振荡器, 外接标准高速晶振, 通常是接 8Mhz, 也可以接 (400kHz~ 16Mhz); (3)DCOCLK,数控振荡器,为内部晶振,由 RC 震荡回路构成; (4)VLOCLK,内部低频振荡器,12kHz 标准振荡器。 2、在 MSP430 单片机内部一共有三个时钟系统 单片机内部一共有三个时钟系统: 三个时钟系统: (1)ACLK,Auxiliary Clock,辅助时钟,通常由 LFXT1CLK 或 VLOCLK 作为时钟源,可 以通过软件控制更改时钟的分频系数; (2)MCLK,Master Clock,系统主时钟单元,为系统内核提供时钟,它可以通过软件从四 个时钟源选择; (3)SMCLK,Sub-Main Clock,系统子时钟,也是可以由软件选择时钟源。 Basic Clock Module Registers(基础时钟寄存器) DCOCTL ——DCO control register BCSCTL1——Basic clock system control 1 BCSCTL2——Basic clock system control 2 BCSCTL3——Basic clock system control 3 IE1——SFR interrupt enable register 1 IFG1——SFR interrupt flag register 1 3、MSP430 的时钟设置包括 3 个寄存器, 个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3 DCOCTL,DCO 控制寄存器,地址为 56H,初始值为 60H
实例分析
1、CPU 运行在 VLO 时钟下: 时钟下: 这是最慢的时钟,在约 12 千赫兹下运行。因此,我们将通过可视化的 LED 闪烁的红色慢慢 地在约每 3 秒钟率。我们可以让时钟系统默认这种状态,设置专门来操作 VLO。我们将不 使用任何 ALCK 外设时钟在此实验室工作,但你应该认识到,ACLK 来自 VLO 时钟。 #include <msp430g2231.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器 P1DIR = 0x40; // P1.6 配置输出 P1OUT = 0; // 关闭 LED BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO IFG1 &= ~OFIFG; // 清除 OSCFault 标志 __bis_SR_register(SCG1 + SCG0); // 关闭 DCO BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = VLO/8
2
while(1) { P1OUT = 0x40; _delay_cycles(100); P1OUT = 0; _delay_cycles(5000); } }
// 开启 LED // 关闭 LED
2、CPU 运行在晶振(32768Hz)时钟下: 时钟下: 晶体频率为 32768 赫兹,约 3 倍的 VLO。如果我们在前面的代码中使用晶振,指示灯应闪 烁大约每秒一次。 你知道为什么 32768 赫兹是一个标准?这是因为这个数字是 2 的 15 次方, 因此很容易用简单的数字计数电路,以每秒一次获得率 ——手表和其他时间时基。认识到 ACLK 来自外部晶振时钟。 #include <msp430g2231.h> 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 计算。
4
#include <msp430g2231.h> void main(void) { WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗定时器 if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) { while(1); // If cal const erased,挂起 } BCSCTL1 = CALBC1_1MHZ; DCOCTL = CALDCO_1MHZ; P1DIR = 0x40; P1OUT = 0; BCSCTL3 |= LFXT1S_2; IFG1 &= ~OFIFG; //__bis_SR_register(SCG1 + SCG0); BCSCTL2 |= SELM_0 + DIVM_3; while(1) { P1OUT = 0x40; _delay_cycles(100); P1OUT = 0; _delay_cycles(5000); } } // Set range // 设置 DCO 模式 // P1.6 配置输出 // P1 关闭 // LFXT1 = VLO // 清除 OSCFault 标志 // 关闭 DCO // MCLK = DCO/8