1)复位后的时钟情况
系统上电复位后,XT1在LF低频模式,作为XT1CLK的时钟来源,XT1CLK又被选中作为ACLK的时钟源;当XT1无效时,低频模式自动切换为REFO,其它情况切换为DCO;
FLL使能,FLL的参考时钟源FLLREFCLK选中XT1CLK,当XT1无效时,低频模式自动切换为REFO,经过锁频环FLL稳定倍频,分频,稳定频率之后,产生DCOCLK和DCOCLKDIV;
这个时候要注意最关键的,如果连接XT1和XT2的引脚不进行PXSEL的设置,那么这两个时钟源都是无效的,而内部时钟源REFOCLK,VLOCLK,DCOCLK默认都是可用的;并且在单片机复位之后,XT2OFFG,XT1HFOFFG清零,没有故障失效,XT1LFOFFG,DCOCLK置位,产生故障失效,而且在刚打开时钟的时候,这些故障位都会置位,一旦被置位,即使晶振恢复到正常状态也将一直保持置位,直到手动用软件将故障失效标志位清零,清零之后,若晶振故障失效情况仍然存在,晶振故障失效标志位将自动再次被置位;
所以,单片机默认情况下虽然全被配置为XT1CLK,但是因为XT1引脚未配置,并且故障位置位,所以自动切换使用REFO,即:
ACLK =REFOCLK = 32.768Khz;
FLLREFCLK = REFOCLK = 32.768K;
MCLK = SMCLK = DCOCLKDIV =1.048576MHZ;
DCOCLK = 2.097152Mhz;
接下来将时钟信号输出到示波器上验证一下,MCLK输出复用P7.7脚,SMCLK输出复用P2.2脚,ACLK复用P1.0脚,实验板上只引出P1.0和P2.2,所以我们只测试ACLK和SMCLK,可以看到ACLK = 32.86khz,SMCLK = MCLK = 1.05Mhz,LED闪烁频率大约为1hz;
1 #include <msp430.h> 2 3 int main(void) 4 { 5 volatile unsigned int i; //循环变量 6 WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer 7 P4DIR |= (BIT1+BIT7); //P4.7观察现象,P4.1用于示波器观测 8 P4OUT |= (BIT1+BIT7); //输出高电平,点亮LED 9 P1DIR |= BIT0; 10 P1SEL |= BIT0; //P1.0输出ACLK 11 P2DIR |= BIT2; 12 P2SEL |= BIT2; //P2.2输出SMCLK 13 while(1) 14 { 15 P4OUT ^= (BIT1+BIT7); //LED状态取反 16 for(i = 50000;i>0;i--); //delay 17 } 18 }