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.

430G2231外部晶振总变为内部DCO

Other Parts Discussed in Thread: MSP430G2231

TI专家,您好:

我做了个430G2231的小板子,程序如下,但在调试过程中,发现单片机应输出1ms脉冲时,有10%左右概率输出30us左右信号,好象是CPU用的外部32K晶振变成了内部DCO的1M晶振了,但查硬件电源、更换两个32K晶振也没解决问题,不知是否是软件上有点问题,请帮忙指点一下:

电路的功能说明:外部电源上电后,稳压电路稳到3.3V给单片机,单片机从两个外部IO口,接收两路外部触发信号,接收到第一路信号后,延时很短时间就通过一路MOS管给负载放电,接收第二路信号后,延时5S后通过另一路MOS管给第二路负载放电。单片机给MOS管的信号时间均为1ms,但有一定概率1ms变为30us左右,但同时5s的延时没变。

程序:

#include <msp430g2231.h>

#define YANSHI_FD 10000 //10000MS
#define YANSHI_JIESUO 150 //150MS
#define YANSHI_QIBAO 5000 //5000MS
#define OSC_FRE 32768 //OSC :32768HZ

#define JS BIT2 //解锁引脚
#define QB BIT3+BIT4 //起爆引脚
#define PH1 BIT1 //碰合1
#define PH2 BIT0
#define FD1 BIT7 //放电引脚
#define FD2 BIT6
#define FD3 BIT5

unsigned char int_time=0; //INT TIMES
unsigned char fd_delay_flag=0; //放电延时标记

int main( void )
{
unsigned int i;
char *Flash_ptr;
Flash_ptr = (char *) 0x10FC;
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_1MHZ; //CALBC1_1MHZ; // 设置DCO 1MHz
DCOCTL = CALDCO_1MHZ; //CALDCO_1MHZ;
//P1REN |= BIT0+BIT1+BIT2+BIT6+BIT7; //端口上拉电阻使能
P1OUT = 0;
P1DIR |= JS+QB+FD1+FD2+FD3; // 设置 引脚方向
P1DIR &= ~(PH1+PH2);
P1OUT = 0;
//P1OUT |= (BIT7+BIT6);
BCSCTL3|= LFXT1S_0+XCAP_2;
while(IFG1 & OFIFG )
{
IFG1&=~OFIFG;

for(i=0x100;i>0;i--);
}


BCSCTL2 |= SELM_3+SELS;

//P1OUT = 0XFF;
//P1OUT=0;
P1IES |= PH1;
P1IE |= PH1; //碰合1中断允许,下降沿中断
TACTL = MC_0; //停止
TAR = 0;
TACCR0 =(OSC_FRE/8)*YANSHI_FD/1000-1;
TACCTL0 |= CCIE; //允许比较0中断,自动重载
TACTL = TASSEL_1+ID_3+MC_1; //ACLK,8分频,增
_EINT();
for (;;)
{
LPM3;
//P1OUT ^= 0x02; // 翻转P1.0 50ms方波
//i = 10000; // 延时
//do (i--);
//while (i != 0);
}
}

#pragma vector=TIMERA1_VECTOR //解锁定时
__interrupt void Time_jiesuo(void)
{ unsigned int delay_t;
TACTL = MC_0;
P1OUT |= JS;
delay_t=7;
do(delay_t--);
while (delay_t !=0);
P1OUT &= ~JS; //第一路输出点火信号1ms
TACCTL1 &= ~CCIE; //禁止比较1中断,自动重载
}

#pragma vector=TIMERA0_VECTOR //起爆定时
__interrupt void Time_qibao(void)
{ unsigned int delay_t;
TACTL = MC_0;
if ( !fd_delay_flag )
{
P1OUT |= FD1+FD3; //放电1000ms
delay_t=7000;
do(delay_t--);
while (delay_t !=0);
P1OUT |= FD2;
return;
}
P1OUT |= QB;
delay_t=7;
do(delay_t--);
while (delay_t !=0);

P1OUT &= ~QB; //第2路输出点火信号1ms
TACCTL0 &= ~CCIE; //禁止比较0中断,自动重载

//流程结束,自动放电
//P1OUT |= FD1+FD3; //放电1000ms
delay_t=7000;
do(delay_t--);
while (delay_t !=0);
P1OUT |= FD2;
return;
}

#pragma vector=PORT1_VECTOR
__interrupt void P1_INT(void)
{
int_time++;
if ( (P1IFG & PH1)&&(int_time==1) )
{ unsigned int jc_t=3,delay_t=2;
//for(jc_t=2;jc_t>0;jc_t--) //延时800us
//{
// delay_t=2;
// delay_t=2;
//}
if ( P1IN & PH1 )
{
P1IFG=0;
int_time--;
return;
}


P1IE &= ~PH1; //禁止碰合1中断
P1IES |= PH2;
P1IE |= PH2; //碰合2中断允许,下降沿中断
P1IFG=0;
TACTL = MC_0; //停止计数,清除比较0中断允许
TACCTL0 &= ~CCIE;
TAR = 0;
TACCR1 =(OSC_FRE/8)*YANSHI_JIESUO/1000-1;
TACCTL1 |= CCIE; //允许比较1中断,自动重载
TACTL = TASSEL_1+ID_3+MC_1; //ACLK,8分频,增
return;
}
if ( (P1IFG & PH2)&&(int_time==2) )
{ unsigned int jc_t=3,delay_t;
//for(jc_t=2;jc_t>0;jc_t--) //延时800us
//{
// delay_t=2;
// delay_t=2;
//}
if ( P1IN & PH2 )
{
P1IFG=0;
int_time--;
return;
}

P1IES &= ~PH2;
P1IE=0;
P1IFG=0;
TACTL = MC_0;
TAR = 0;
TACCR0 =(OSC_FRE/8)*YANSHI_QIBAO/1000-1;
TACTL = TASSEL_1+ID_3+MC_1; //ACLK,8分频,增
TACCTL0 |= CCIE; //允许比较0中断,自动重载
fd_delay_flag=1;
return;
}
P1IFG=0;
return;
}