MSP430F1232中断学习

ADC10中断:

和定时器一样,ADC10也有中断请求的能力,如果不使用DCT(ADC10DCT1=0),当转换结果装载到ADC10MEM时,ADC10中断标志位即ADC10IFG置1。如果使用DCT,当DCT设定的所有转换完成之后,中断标志为置1。


大概过程是这样的:

    //对于中断来说,当每次两个整个数据块都传递完成时,中断标志置1,此时产生中断,让CPU跳出低功耗状态,继续执行进入低功耗后续没有执行的代码

    //又继续使能AD转换,CPU又进入低功耗状态,由于AD转换独立于CPU,当转换完成时再次进入中断,跳出低功耗,这样不断进入跳出,实现低功耗。

    //所以低功耗跳出之后,以下应该写串口传输的代码,将转换完的数字量给USART

int main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
  ADC10CTL1 = INCH_1 + CONSEQ_1;            // A1/A0, single sequence
  ADC10CTL0 = ADC10SHT_1 + MSC + ADC10ON + ADC10IE + REFON + REF2_5V;     //时钟源分频+连续
  ADC10DTC1 = 0x02;                         // 2 conversions
  ADC10AE |= 0x03;                          // P2.1,0 ADC10 option select

  for (;;)
  {
    ADC10CTL0 &= ~ENC;
    while (ADC10CTL1 & BUSY);               // Wait if ADC10 core is active
    ADC10SA = 0x200;                        // Data buffer start
    ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
    __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
    //AD把两路转换完成,给了ADC10SA,控制将长度为2的数据块放到某个地址中,那么可以从地址中取出转换完成的数据
    //一个块放着两个转换完的数据,每个转换完的数据长度是2个字节,因为MEM长度是16位,一个地址是一个字节,现在的地址是在0x200的基础上加4
    //但是这个地址是个什么意思不太明白
    //对于中断来说,当每次两个整个数据块都传递完成时,中断标志置1,此时产生中断,让CPU跳出低功耗状态,继续执行上面的for循环
    //继续开始转换,由于AD转换独立于CPU,所以CPU又进入低功耗状态,当转换完成时再次跳出低功耗,这样不断进入跳出,实现低功耗。
    //所以低功耗跳出之后,以下应该写串口传输的代码,将转换完的数字量给USART
    //....
  }
}

// ADC10 interrupt service routine
#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR (void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC10_VECTOR))) ADC10_ISR (void)
#else
#error Compiler not supported!
#endif
{
    __bic_SR_register_on_exit(CPUOFF);      // Clear CPUOFF bit from 0(SR)
}

你可能感兴趣的:(单片机)