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.

MSP430的ADC10能不能从低功耗模式中唤醒呢

Other Parts Discussed in Thread: MSP430G2553

和同学讨论ADC10时遇到一个问题,使用序列通道时,好像不能从进行低功耗模式也不能判断ADC10IFG标志位, 只有第一次进了中断,以后就不进中断了,这是什么问题?

但是我如果用延时的话结果又能进中断,下面是程序,哪位大神帮我看下有什么问题,谢谢了

#include <msp430g2553.h>

int temp[2];
void main(void)
{

WDTCTL = WDTPW + WDTHOLD;

ADC10CTL1 |= CONSEQ_1; //设置通道
ADC10CTL0 |= SREF_1 + REFON + REF2_5V;//设置参考电压2.5V
ADC10CTL1 |= ADC10SSEL_1 + SHS_0; //使用ADC10SC,选择ADC10OSC时钟
ADC10CTL1 |= INCH_1; //选择通道
ADC10AE0 = BIT0 + BIT1; //使能通道
ADC10CTL0 |= ADC10ON + ADC10SHT_2 + ADC10IE + MSC; //开启ADC10和选择采样时间中断使能
__enable_interrupt();

ADC10DTC0 = ADC10CT;
ADC10DTC1 = 2;


while(1)
{
while(1 == (ADC10BUSY & ADC10CTL1));//判断忙
ADC10SA = (int)temp;
ADC10CTL0 &= ~ENC;
ADC10CTL0 |= ADC10SC + ENC;
// LPM0; //使用低功耗模式或判断中断标志位的话,只有第一次能进,
//以后就进不去中断了,程序一直死循环
__delay_cycles(100000);//如果用这个延时的话,程序是能进入中断的
while(0 == (ADC10CTL0 & ADC10IFG));
// ADC10CTL0 &= ~ADC10IFG;

}
}

#pragma vector = ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
LPM0_EXIT;
}

  • 你好,请参考官方代码范例,尽量在官方代码上修改。

    int main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop WDT
    ADC10CTL1 = INCH_3 + CONSEQ_1; // A3/A2/A1, single sequence
    ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE;
    ADC10DTC1 = 0x03; // 3 conversions
    ADC10AE0 |= 0x0E; // P1.3,2,1 ADC10 option select
    P1DIR |= 0x01; // Set P1.0 output

    for (;;)
    {
    ADC10CTL0 &= ~ENC;
    while (ADC10CTL1 & BUSY); // Wait if ADC10 core is active
    ADC10SA = 0x200; // Data buffer start
    P1OUT |= 0x01; // P1.0 = 1
    ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start
    __bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit
    P1OUT &= ~0x01; // P1.0 = 0
    }
    }

    // ADC10 interrupt service routine
    #pragma vector=ADC10_VECTOR
    __interrupt void ADC10_ISR(void)
    {
    __bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR)
    }

  • 我发现我的问题了, ADC10DTC0 = ADC10CT; 我的这一句是多余的,有这一句它就在不停的转换,不会产生中断。。 谢谢您的例程