MSP430F169的MCLK为何不能选择XT2?
我在应用MSP430F169时,晶振2用8MHz,MCLK不能选择,而SMCLK可以选择,不清楚原因,请指教!
我的程序:
#include <msp430x16x.h>
void main(void)
{
WDTCTL = WDTHOLD + WDTPW; //关闭看门狗
BCSCTL1 &= ~XT2OFF; //启用XT2
BCSCTL2 = 0;
BCSCTL2 |= SELS + DIVS0; // SMCLK选用XT2,2分频
BCSCTL2 |= SELM1; //MCLK选用XT2
P5SEL = 0x30;
P5DIR = 0x30;
while(1);
}
现象:P5.4输出频率700多KHz,为DCO的频率,随温度变化;P5.5的输出频率为4MHz,令我不明白的是为什么MCLK加载不了XT2,而SMCLK可以,原以为是8MHz高且对电源要求3.6V,换成4MHz,现象对应的性质是相同的,请指教。
//******************************************************************************
// MSP-FET430P140 Demo - Basic Clock, MCLK Sourced from HF XTAL XT2
//
// Description: Proper selection of an external HF XTAL for MCLK is shown
// by first polling the OSC fault until XTAL is sta××e - only then is MCLK
// sourced by XT2. MCLK is on P5.4.
// ACLK= n/a, MCLK= XT2, SMCLK= DCO,
// //* HF XTAL NOT INSTALLED ON FET *//
// //* Min Vcc required varies with MCLK frequency - refer to datasheet *//
//
// MSP430F149
// -----------------
// /|\| XT2IN|-
// | | | XTAL (455k - 8Mhz)
// --|RST XT2OUT|-
// | |
// | P5.4|-->MCLK = XTAL
//
//
// M. Buccini
// Texas Instruments Inc.
// Feb 2005
// Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.21A
//******************************************************************************
#include <msp430x14x.h>
void main(void)
{
volatile unsigned int i;
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P5DIR |= 0x10; // P5.4= output direction
P5SEL |= 0x10; // P5.4= MCLK option select
BCSCTL1 &= ~XT2OFF; // XT2= HF XTAL
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2; // MCLK= XT2 (safe)
for (;;); // Do nothing
}
同意楼上。唯一需要改变一点的就是把for (i = 0xFF; i > 0; i--); // Time for flag to set
改成for (i = 0xFFFF; i > 0; i--); 因为之前做过测试发现 即使跳出
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
这个循环也不能肯定XT2已经稳定 退出这个循环之后 OFIFG还是又可能置位的
LSDFAE51我写的是TI 管方例程,你把FF 改成FFFF没实质性变化,,只不过是你的晶震起振时间太长了。
回TAGE :是的 虽然只是延长了晶振时间 但是已经有实际变化 你可以打开不可屏蔽中断 然后看
2种延时 对进不可屏蔽中断的影响
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0 |= XCAP18PF;
FLL_CTL1 &= ~XT2OFF;
do{
IFG1 &= ~OFIFG;
for(unsigned int t=0xff;t>0;t--);
_NOP();
}
while(IFG1 & OFIFG);
FLL_CTL1 = SELM1; //MCLK-->XT2=4MHz
IE1 |= OFIE;
………………
………………
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0 |= XCAP18PF;
FLL_CTL1 &= ~XT2OFF;
do{
IFG1 &= ~OFIFG;
for(unsigned int t=0xffff;t>0;t--);
_NOP();
}
while(IFG1 & OFIFG);
FLL_CTL1 = SELM1; //MCLK-->XT2=4MHz
IE1 |= OFIE;
………………
………………
}
#pragma vector = NMI_VECTOR
__interrupt void NMI_ISR(void)
{
_NOP(); //可设置断电观察
}
还又种做法是:
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0 |= XCAP18PF;
FLL_CTL1 &= ~XT2OFF;
do{
IFG1 &= ~OFIFG;
for(unsigned int t=0xff;t>0;t--);
_NOP();
}
while(IFG1 & OFIFG);
FLL_CTL1 = SELM1; //MCLK-->XT2=4MHz
for(unsigned int t=0xffff,t>0;t--);
IE1 |= OFIE;
………………
………………
}
虽然只是延时时间不同 但是情况却变了。不妨尝试下
没电路板我也没法试验,我想知道有什么变化,,为什么会有变化?
第一个IE1 |= OFIE;后经常就调到不可屏蔽中断
第2个IE1 |= OFIE;后一般就不会跳到不可屏蔽中断
这个晶振稳定时间跟晶振本身工艺有关系
晶振稳定过程是一个“上下抖动”的过程 它时而置位OFIFG 时而又没有置位OFIFG 所以即使程序能够跳出
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
这个循环 也不意味着 此时IFG & OFIFG 就肯定是0
所以加大延时时间 确保晶振真正完全稳定了 才能说IFG & OFIFG ==0了
加大延时时间 确保晶振真正完全稳定了 ,,这是关键点,,明白了。。
视具体情况而定,也不是说每一块板子都要这样!和晶振的布局也有很大的关系!不管怎样,XT2没有输出可以通过OFIFG来观察,楼主说SMCK可以配置,MCLK不可以配置。也就是说XT2起振了啊!
应该不会有这样的问题啊,在测测应该是可以的。