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(基础时钟寄存器)
DCO control register
DCOCTL
Basic clock system control 1
BCSCTL1
Basic clock system control 2
BCSCTL2
Basic clock system control 3
BCSCTL3
SFR interrupt enable register 1
IE1
SFR interrupt flag register 1
IFG1
3、MSP430的时钟设置包括3个寄存器,DCOCTL、BCSCTL1、BCSCTL2、BCSCTL3
DCOCTL,DCO控制寄存器,地址为56H,初始值为60H
DCO2
DCO1
DCO0
MOD4
MOD3
MOD2
MOD1
MOD0
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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闪烁的红 {MOD}慢慢地在约每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
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 <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);
}
}
首先让我们看一下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)
这个指令设置密码(WDTPW)和停止位定时器(WDTHOLD),所有的WatchDog配置都需要在WDTPW的辅助下完成。
举例如下:
A、间隔时间由Bit0-2位编码:
1、看门狗的时钟由FSMCLK(假设为1MHz)
#define WDT_MDLY_32 (WDTPW+WDTTMSEL+WDTCNTCL)
#define WDT_MDLY_8 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS0)
#define WDT_MDLY_0_5 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1)
#define WDT_MDLY_0_064 (WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1+WDTIS0)
2、看门狗的时钟由FACLK(假设为32KHz)
#define WDT_ADLY_1000 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL)
#define WDT_ADLY_250 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS0)
#define WDT_ADLY_16 (WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1)
B、看门狗模式——在过期时间后重启:
1、看门狗的时钟由FSMCLK(假设为1MHz)
#define WDT_MRST_32 (WDTPW+WDTCNTCL)
#define WDT_MRST_8 (WDTPW+WDTCNTCL+WDTIS0)
#define WDT_MRST_0_5 (WDTPW+WDTCNTCL+WDTIS1)
#define WDT_MRST_0_064 (WDTPW+WDTCNTCL+WDTIS1+WDTIS0)
2、看门狗的时钟由FACLK(假设为32KHz)
#define WDT_ARST_1000 (WDTPW+WDTCNTCL+WDTSSEL)
#define WDT_ARST_250 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS0)
#define WDT_ARST_16 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1)
#define WDT_ARST_1_9 (WDTPW+WDTCNTCL+WDTSSEL+WDTIS1+WDTIS0)
P1OUT = 0; // P1关闭 (例1、2、3、4)
其中DIR 和P1OUT分别配置IO口的方向和输出值,这里不在赘述,请参考手册。
三、BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO (例1和例4)
BCSCTL3 |= LFXT1S_0; // LFXT1 = 32768Hz (例2和例3)
#define __MSP430_HAS_BC2__
SFR_8BIT(DCOCTL);
SFR_8BIT(BCSCTL1);
SFR_8BIT(BCSCTL2);
SFR_8BIT(BCSCTL3);
#define MOD0 (0x01)
#define MOD1 (0x02)
#define MOD2 (0x04)
#define MOD3 (0x08)
#define MOD4 (0x10)
#define DCO0 (0x20)
#define DCO1 (0x40)
#define DCO2 (0x80)
#define LFXT1OF (0x01)
#define XT2OF (0x02)
#define XCAP0 (0x04)
#define XCAP1 (0x08)
#define LFXT1S0 (0x10)
#define LFXT1S1 (0x20)
#define XT2S0 (0x40)
#define XT2S1 (0x80)
#define XCAP_0 (0x00)
#define XCAP_1 (0x04)
#define XCAP_2 (0x08)
#define XCAP_3 (0x0C)
#define LFXT1S_0 (0x00)
#define LFXT1S_1 (0x10)
#define LFXT1S_2 (0x20)
#define LFXT1S_3 (0x30)
#define XT2S_0 (0x00)
#define XT2S_1 (0x40)
#define XT2S_2 (0x80)
#define XT2S_3 (0xC0)
四、__bis_SR_register(SCG1 + SCG0); // 关闭 DCO
__bis_SR_register()是在intrinsics.h这个头文件中定义了,实现的功能是将SR中的位置零。
关于头文件中的代码作用
#ifdef __cplusplus
extern "C"
{
#endif
#ifdef __cplusplus
}
#endif
一般用于将C++代码以标准C形式输出(即以C的形式被调用),这是因为C++虽然常被认为是C的超集,但是C++的编译器还是与C的编译器不同的。C中调用C++中的代码这样定义会是安全的。
BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = 32768/8
BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO
BCSCTL2 |= SELM_0 + DIVM_3; // MCLK = DCO/8
MSP430中有如下定义:
#define RSEL0 (0x01)
#define RSEL1 (0x02)
#define RSEL2 (0x04)
#define RSEL3 (0x08)
#define DIVA0 (0x10)
#define DIVA1 (0x20)
#define XTS (0x40)
#define XT2OFF (0x80)
#define DIVA_0 (0x00)
#define DIVA_1 (0x10)
#define DIVA_2 (0x20)
#define DIVA_3 (0x30)
#define DIVS0 (0x02)
#define DIVS1 (0x04)
#define SELS (0x08)
#define DIVM0 (0x10)
#define DIVM1 (0x20)
#define SELM0 (0x40)
#define SELM1 (0x80)
#define DIVS_0 (0x00)
#define DIVS_1 (0x02)
#define DIVS_2 (0x04)
#define DIVS_3 (0x06)
#define DIVM_0 (0x00)
#define DIVM_1 (0x10)
#define DIVM_2 (0x20)
#define DIVM_3 (0x30)
#define SELM_0 (0x00)
#define SELM_1 (0x40)
#define SELM_2 (0x80)
#define SELM_3 (0xC0)
六、BCSCTL1 = CALBC1_1MHZ; //设置值 (例3、4)
#ifndef __DisableCalData
SFR_8BIT(CALDCO_16MHZ);
SFR_8BIT(CALBC1_16MHZ);
SFR_8BIT(CALDCO_12MHZ);
SFR_8BIT(CALBC1_12MHZ);
SFR_8BIT(CALDCO_8MHZ);
SFR_8BIT(CALBC1_8MHZ);
SFR_8BIT(CALDCO_1MHZ);
SFR_8BIT(CALBC1_1MHZ);
#endif
关于SFR_8BIT的相关说明:
External references resolved by a device-specific linker command file
(外部引用解决的特定于设备的连接器命令文件)
#define SFR_8BIT(address) extern volatile unsigned char address
#define SFR_16BIT(address) extern volatile unsigned int address
一周热门 更多>