MSP430F449的MCLK不能选择XT2???

mun0000   2008-9-20 16:08 楼主
最近在一个数据采集器中用到MSP430F449,觉着外部高频晶振的稳定性好,就想利用XT2(4M)作为MCLK,项目做好了,测量结果总是出问题,结果不对,我的采样周期通过定时器控制,调试中发现,采样频率高于一定值之后之后,采样周期并不随定时器设置改变而是固定到一个值上,反复思考,怀疑是XT2根本就没有选择高频晶振,而是选择了默认的DCO频率。索性不用XT2作为MCLK,而直接用DCO,只不过设置寄存器设置DCO的频率为4M左右,再次下载运行,结果正确。
以前论坛里有个老帖也是关于MCLK不能选择XT2的,但后来似乎是解决了。在这次开发中我遇到了类似的情况,又重新怀疑是不是F449的MCLK设置真的存在BUG???

程序片断:
WDTCTL=WDTPW+WDTHOLD; //Stop WDT

IFG2=0; //Clear Interrupt Flag
IFG1=0;
FLL_CTL0|=XCAP18PF;
FLL_CTL1&=~XT2OFF;
do
{
//IFG1&=~OFIFG;
FLL_CTL0&=~XT2OF;
for(int i=0xff;i>0;i--);
}
while((FLL_CTL0&XT2OF)!=0);
FLL_CTL1|=SELM_XT2+SELS; //实际上MCLK并没有真正选择XT2,为什么?



老帖地址:http://bbs.lierda.com/showthread.php...&highlight=tx2

回复评论 (7)

不会吧,从来没碰到过呀,XT2可以做MCLK的。
点赞  2008-9-20 20:43
//******************************************************************************
// MSP-FET430P440 Demo - FLL+ Output 32k xtal + HF xtal + internal DCO
//
// Description This program demostrates using an external 32khz crystal to
// supply the internal ACLK, and using a high speed crystal or resonator to
// supply SMCLK. The MLCK for the CPU is supplied by the XT2. The 32khz
// crystal connects to pins Xin and Xout. The high frequency crystal or
// resonator connects to pins XT2in and XT2out. The DCO clock is generated
// internally and calibrated by the 32khz crystal. The resulting ACLK is
// brought out on I/O pin P1.5, SMCLK is brought out on P1.4, and MCLK is
// brought out on I/O pin P1.1.
// Note:
// External matching capacitors must be added for the high speed crystal or
// resonator as required.
//
// MSP430F449
// -----------------
// /|\ | XIN|-
// | | | 32kHz
// ---|RST XOUT|-
// | |
// | |
// | XT2IN|-
// | | HF XTAL or resonator (add capacitors)
// | XT2OUT|-
// | |
// | P1.5|--> ACLK = 32khz crystal out:32K
// | |
// | P1.4|--> SMCLK = high freq xtal or resonator out:4M
// | |
// | P1.1|--> MCLK = XT2 frequency :1M???
// | |
// | |
//
// B. Merritt
// Texas Instruments Inc.
// October 2003
// Built with IAR Embedded Workbench Version: 1.26B
// January 2004
// Updated for IAR Embedded Workbench Version: 2.21B
//******************************************************************************
#include "msp430x44x.h"

void main(void)
{
unsigned int i;

WDTCTL = WDTPW + WDTHOLD; // stop watchdog timer
FLL_CTL0|= DCOPLUS+XCAP18PF;
FLL_CTL1 = FLL_CTL1 & ~XT2OFF; // clear bit = high freq xtal on

SCFI0 |= FN_4; // x2 DCO freq, 8MHz nominal DCO
SCFQCTL = 120; // (120+1) x 32768 x 2 = 8 MHz
do // loop until flag is clear
{
FLL_CTL0 = FLL_CTL0 & ~XT2OF; // clear high freq oscillator fault flag
for (i = 50000; i; i--); // delay for crystal to start and FLL to lock
}
while (FLL_CTL0 & XT2OF); // test high freq oscillator fault flag

// if flag remained clear then -
FLL_CTL1|= SELS+SELM_XT2; // switch SMCLK = HF xtal
P1DIR = 0x32; // P1.1, P1.4 & P1.5 to outputs
P1SEL = 0x32; // P1.1, P1.4 & P1.5 functions to output
// MCLK, SMCLK & ACLKm
while(1); // loop in place
}


采用上段程序,无论在先调试还是拔下仿真器,MCLK输出始终约为8MHz,即DCO的振荡频率,而不是XT2的4MHz。我在三块不同的电路板上都试过,结果都一样,MCLK只能选择DCO,而不能选择XT2。这是为什么?

程序能运行并不一定代表时钟的运行情况和寄存器设置保持一致,我觉得绝大多数情况下,由于MCLK不被用来作计算程序执行时间情况下,当设置XT2(如4M)为MCLK时,而实际上MCLK选择了DCO(默认1M左右),开发人员一般感觉不出差别。但当MCLK被用来精计时时,如计算AD采样周期,则很明显会看出错误,因为如果选择了XT2(4M)作为MCLK可以执行完的AD采样,而使用了DCO(默认1M)作为MCLK的可能执行不完。
希望回复的各位一定要以实验结果说话,不要以为程序顺利执行就认为时钟设置没问题。
点赞  2008-9-22 22:46
别急,明天我试一下。
点赞  2008-9-23 22:30
// MCLK = SMCLK = xt2=4MHZ
// ACLK = 32768HZ
#include "msp430x44x.h"

void main(void)
{
unsigned int i;

WDTCTL = WDTPW + WDTHOLD;
FLL_CTL0 = XCAP18PF;
FLL_CTL1 = FLL_CTL1 & ~XT2OFF;

do
{
IFG1 &= ~OFIFG;
for (i = 50000; i; i--);
}while (IFG1 & OFIFG);
FLL_CTL1 = SELS+SELM1;
P1DIR = 0x32;
P1SEL = 0x32;
while(1);
}
程序试一下,拔不拔仿真器都可以的MCLK = SMCLK = XT2 = 4MHZ
点赞  2008-9-24 11:00
你的程序中,有OFIFG标志,表示晶体失效了,虽然MCLK选择了XT2,但由于有晶体失效标志,所以MCU有自动的将MCLK切换到了DCO。这正是430的特色,而不是BUG。
在你的程序:
循环检测XT2晶体失效标志后,再增加IFG1 &= ~OFIFG语句,也是可以的。
点赞  2008-9-24 11:06
引用:

你的程序中,有OFIFG标志,表示晶体失效了,虽然MCLK选择了XT2,但由于有晶体失效标志,所以MCU有自动的将MCLK切换到了DCO。这正是430的特色,而不是BUG。
在你的程序:
循环检测XT2晶体失效标志后,再增加IFG1 &= ~OFIFG语句,也是可以的。
我的程序中没有用IFG1 &= ~OFIFG语句,而只用FLL_CTL0&=~XT2OF清除XT2失效标志也没什么问题啊。我的XT1运行良好,没必要用IFG1 &= ~OFIFG连XT1一块判断啊,再说有时设计时我就根本不接XT1。另外,如果XT2失效,那程序根本出不了循环,会在循环处不断执行,只有在不加循环判断时,实效时MCLK才能完成自动切换。你还确定是我错了吗?
点赞  2008-9-28 08:26
引用:

我的程序中没有用IFG1 &= ~OFIFG语句,而只用FLL_CTL0&=~XT2OF清除XT2失效标志也没什么问题啊。我的XT1运行良好,没必要用IFG1 &= ~OFIFG连XT1一块判断啊,再说有时设计时我就根本不接XT1。另外,如果XT2失效,那程序根本出不了循环,会在循环处不断执行,只有在不加循环判断时,实效时MCLK才能完成自动切换。你还确定是我错了吗?
我确定是你错了,你在仔细看一下用户指南或弄个TI的例程看看。
点赞  2008-9-28 09:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复