This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

msp430f5438a 程序跑飞



void main()
{
WDTCTL = WDT_ADLY_1000; // WDT 250ms, ACLK, interval timer
SFRIE1 |= WDTIE; // Enable WDT interrupt
check_clk();
TA1_Init();
_EINT();
while(1);
}
void check_clk(void)
{
P11SEL |= BIT0+BIT1+BIT2; //
P11DIR = BIT0+BIT1+BIT2; // P11.1-2 to output direction
P5SEL |= 0x0C; // Port select XT2
P7SEL |= 0x03; // Select XT1
UCSCTL6 &= ~(XT1OFF+XT2OFF); // XT1 On
UCSCTL6 |= XCAP_3;
UCSCTL3 |= SELREF_2; // FLLref = REFO
// Since LFXT1 is not used,
// sourcing FLL with LFXT1 can cause
// XT1OFFG flag to set
UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
// Clear XT2,XT1,DCO fault flags
SFRIFG1 &= ~OFIFG; // Clear fault flags
_NOP();_NOP();_NOP();_NOP();_NOP();
_NOP();_NOP();_NOP();_NOP();_NOP();
}while (SFRIFG1&OFIFG); // Test oscillator fault flag

UCSCTL6 &= ~(XT2DRIVE0+XT1DRIVE_3); // Decrease XT2 Drive according to
UCSCTL4 |= SELS_5 + SELM_5+SELA_0; // SMCLK=MCLK=XT2
UCSCTL5 |= DIVPA_0+DIVS_0+DIVM_0; // SMCLK=MCLK=XT2
}
#pragma vector = WDT_VECTOR //看门狗定时器
__interrupt void WDT_ISR(void)
{
fre=flag*65535+TA1R;
flag=0;
TA1R=0;
}

void TA1_Init()
{
TA1CTL=TASSEL_0+MC_1+TACLR;
TA1CCR0=65535;
TA1CCTL0|=CCIE;
P2SEL|=BIT0;
}

在这程序在全速运行时会跑飞,单步调试时可以正常通过初始化函数,然后再点全速运行的时候又会跑飞。  跑飞(两个中断都进不去)

但是当我把红色语句改成UCSCTL5 |= DIVPA_0+DIVS_0+DIVM_1; // SMCLK=MCLK=XT2 ,

整个程序有可以正常运行。

求解释,这个问题?

  • 你好,

    请问你的XT2外部晶振的频率是多少?另外,可以试试先把XT2的驱动能力设置到最大,有可能是因为XT2的驱动能力过小,无法驱动你外接晶振的频率。

  • qiang liu2,

    这两句的主要区别就是 MCLK source divider选择不一样,一个是MCLK=XT2, 一个是MCLK=XT2/2。而你程序中采用默认core level 0,最高只能支持MCLK约为8MHz, 要是再高的话,需要提高Vcore, 其Vcc也得达到相应值,不能太低。具体值需要查看数据手册。请问你的XT2多大?是不是超过了8MHz?而一半正好小于8MHz?

    为了达到性能和功耗的最佳匹配,MSP430F5xxx系列的PMM非常灵活,有4个level的核电压,分别可以支持逐步升高的CPU主频,需要的供电电压也逐步提高。示意图如下图,如果想要使得CPU达到最高的25MHz,则需要先将Vcore升至level3,当然此时的供电电压Vcc必须在2.4V~3.6V之间。即主频增高,则需要供电Vcc足够高,Vcore level够,当然,此时功耗也在提高。

    具体数据请查看对应datasheet。同时,TI也提供了‘MSP430F5xx and MSP430F6xx Core Libraries’来帮助用户简化控制,请从http://www.ti.com/lit/zip/slaa448下载源代码,并从网上下载对应文档。


  • 怎么把XT2的驱动能力设置到最大呢??

  • 如果我XT2外接25MHz,旁边的两个电容是22pF,电源管理已经改好,XT2的驱动能力也已经改好,输出的波形如下,请问这样的波形正常?谢谢各位为我耐心地做下解答!

  • Zhenpeng Mo,

    Zhenpeng Mo 说:
    怎么把XT2的驱动能力设置到最大呢??

    如下图所示,将UCSCTL6寄存器中的XT2DRIVE设置为对应XT2频率响应的驱动能力。

  • Zhenpeng Mo,

    不知你的输出波形是如何观看的?是直接用示波器接在XT2上看的,还是现将其设置为系统时钟,后将其从对应管脚引出再用示波器观看的?更推荐第二种,因为第一种有可能会导致晶体停振,尤其当晶体是低频晶体时,25MHz高频晶体的话,稳定性会好一些。

    从波形上看,是正确的。频率约为25MHz.

  • 谢谢你的解答,我是采用的后者,驱动能力的修改也已经通过查询用户手册已经修改好,谢谢你的耐心解答