(二),时钟系统
1,msp430能做到超低功耗,合理的时钟模块是功不可没的。但是功能强大的时钟模块设置起来也相对复杂一些。
2,msp430的时钟源有:
(1),外接低频晶振LFXT1CLK:低频模式接手表晶体32768Hz,高频模式450KHz~8MHz;
(2),外接高速晶振XT2CLK:8MHz;
(3),内部数字控制振荡器DCO:是一个可控的RC振荡器,频率在0~16MHz;
(4),超低功耗低频振荡器VLO:不可控,4~20KHz 典型值为12KHz;
3,时钟模块:430的时钟模块有MCLK SMCLK ACLK :
(1),主系统时钟MCLK:提供给MSP430的CPU时钟。可以来自LFXT1CLK XT2CLK DCO VLO可选,默认为DCO。
(2),子系统时钟SMCLK: 提供给高速外设。可以来自LFXT1CLK XT2CLK DCO VLO可选,默认为DCO。
(3),辅助系统时钟ACLK:提供给低速外设。可来自LFXT1CLK VLO。
4,内部的振荡器DCO和VLO提供的时钟频率不是很精确,随外部环境变化较大。
DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。DCO可以用CCS提供的宏定义进行相对比较精确的设置,如下:
DCOCTL = CALDCO_12MHZ; //DCO设为12MHz 这种方法设DCO频率比较精确,实际测得为12.08MHz左右 正弦波
BCSCTL1 = CALBC1_12MHZ;
用这种方法可以设置1,8,12,16MHz
宏定义如下:
#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
5,使用超低功耗低频振荡器VLO可以很大程度地降低系统功耗,下面的例子是设置ACLK为VLO,MCLK为VLO的8分频:
#include
//1延时
//#define CPU_F ((double)16000000)//cpu frequency16000000
#define CPU_F ((double)1630)//cpu frequency1630 //CPU的实际MCLK大约为13.05/8=1.63KHz
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
void main(void)
{
volatile unsigned int i; // Volatile to prevent removal
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL3 |= LFXT1S_2; // LFXT1 = VLO 低频时钟选择为VLO ACLK选为VLO
IFG1 &= ~OFIFG; // Clear OSCFault flag 清除振荡器错误中断标志
__bis_SR_register(SCG1 + SCG0); // Stop DCO SCG1禁止SMCLK SCG0禁止DCO
BCSCTL2 |= SELM_3 + DIVM_3; // MCLK = LFXT1/8
//因为前面已经选择了LFXT1 = VLO 所以MCLK选为VLO 8分频 所以CPU的MCLK大约为1.5KHz
P1DIR = 0xFF; // All P1.x outputs
P1OUT = 0; // All P1.x reset
P2DIR = 0xFF; // All P2.x outputs
P2OUT = 0; // All P2.x reset
P1SEL |= BIT0+BIT4; // P10 P14options 功能选择为外围模块
//p10输出ACLK,来自VLO,p14输出SMCLK, 因为禁止了SMCLK,所以P14脚无波形输出
//VLO典型值为12KHz 实际用示波器测得为:13.05KHz 左右波动
//所以CPU的实际MCLK大约为13.05/8=1.63KHz
for (;;)
{
P1OUT ^= BIT6; // P1.6 闪烁
delay_ms(1000);
}
}
6,如上面的程序所示,其中的延迟函数用那种方法,使用系统的延迟周期函数__delay_cycles(int n); 可以达到比较精确的延迟,如下:
//more_
//1延时
//#define CPU_F ((double)16000000)//cpu frequency16000000
#define CPU_F ((double)12000000)//cpu frequency12000000
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
//2空函数
#define nop() _NOP();
7,系统上电后默认使用的是DCO时钟,DCO默认的频率大概为800KHz,但我用示波器观察的为1.086MHz左右,当DCO设置的过高时,用示波器可以看到波形不再是方波,而是类似于正弦波。