程序是在官方的MSP430FR57xx_adc10_10.c ----ADC10, DMA Sample A2-0, 8-bit Res, Single Sequence, DCO上做了一点点的修改的。原官方的程序能正常运行,我想使用中断的方式读取ADC转换的数据,发现不能正常运行。
程序在仿真的时候只触发了一次中断,不会自动切换到下一通道。看寄存器的值,符合切换 ADC10MSC=1 、 ADC10SHP=1 、x!=0 的条件,但是程序就是不会再触发ADC的中断。
程序:
#include <msp430.h> unsigned int ADC_Result[3]; // ADC conversion result array unsigned char i; int main(void) { WDTCTL = WDTPW+WDTHOLD; // Stop WDT P3DIR |= BIT5 +BIT6 + BIT7; // Set LEDs to output P3OUT |= BIT5 +BIT6 + BIT7; // Configure ADC pins P1SEL0 |= BIT0 + BIT1 + BIT2; P1SEL1 |= BIT0 + BIT1 + BIT2; // Configure ADC10 ADC10CTL0 = ADC10SHT_2 + ADC10MSC + ADC10ON;// 16ADCclks, MSC, ADC ON ADC10CTL1 = ADC10SHP + ADC10CONSEQ_1; // sampling timer, s/w trig.,single sequence ADC10MCTL0 =ADC10INCH_2; // A0,A1,A2(EoS), AVCC reference ADC10IE |= ADC10IE0; // Enable ADC conv complete interrupt for (;;) { i = 2; while (ADC10CTL1 & BUSY); // Wait if ADC10 core is active ADC10CTL0 |= ADC10ENC + ADC10SC; // Sampling and conversion start __bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit if (ADC_Result[0] < 0x1FF) P3OUT &= ~BIT5; // Clear LED off else P3OUT |= BIT5; // Set LED on if (ADC_Result[1] < 0x1FF) P3OUT &= ~BIT6; // Clear LED off else P3OUT |= BIT6; // Set LED on if (ADC_Result[2] < 0x1FF) P3OUT &= ~BIT7; // Clear LED off else P3OUT |= BIT7; // Set LED on } } // 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 { switch(__even_in_range(ADC10IV,12)) { case 0: break; // No interrupt case 2: break; // conversion result overflow case 4: break; // conversion time overflow case 6: break; // ADC10HI case 8: break; // ADC10LO case 10: break; // ADC10IN case 12: ADC_Result[i] = ADC10MEM0; if(i == 0) { __bic_SR_register_on_exit(CPUOFF); } else { i--; } break; default: break; } }