将结果从寄存器保存到数组 [1000] 中,无需用户每次输入

问题描述

这是我正在使用的示例代码

#include <msp430.h>

int main(void)
{
    WDTCTL = WDTPW | WDTHOLD;               // Stop WDT

    // GPIO Setup
    P1OUT &= ~BIT0;                         // Clear LED to start
    P1DIR |= BIT0;                          // Set P1.0/LED to output
    P1SEL1 |= BIT1;                         // Configure P1.1 for ADC
    P1SEL0 |= BIT1;

    // disable the GPIO power-on default high-impedance mode to activate
    // prevIoUsly configured port settings
    PM5CTL0 &= ~LOCKLPM5;

    // Configure ADC12
    ADC12CTL0 = ADC12SHT0_2 | ADC12ON;      // Sampling time,S&H=16,ADC12 on
    ADC12CTL1 = ADC12SHP;                   // Use sampling timer
    ADC12CTL2 |= ADC12RES_2;                // 12-bit conversion results
    ADC12MCTL0 |= ADC12INCH_1;              // A1 ADC input select; Vref=AVCC
    ADC12IER0 |= ADC12IE0;                  // Enable ADC conv complete interrupt

    while (1)
    {
        __delay_cycles(5000);
        ADC12CTL0 |= ADC12ENC | ADC12SC;    // Start sampling/conversion

        __bis_SR_register(LPM0_bits | GIE); // LPM0,ADC12_ISR will force exit
        __no_operation();                   // For debugger
    }
}

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYstemS_ICC__)
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
#else
#error Compiler not supported!
#endif
{
    switch(__even_in_range(ADC12IV,ADC12IV_ADC12RDYIFG))
    {
        case ADC12IV_NONE:        break;    // Vector  0:  No interrupt
        case ADC12IV_ADC12OVIFG:  break;    // Vector  2:  ADC12MEMx Overflow
        case ADC12IV_ADC12TOVIFG: break;    // Vector  4:  Conversion time overflow
        case ADC12IV_ADC12HIIFG:  break;    // Vector  6:  ADC12BHI
        case ADC12IV_ADC12LOIFG:  break;    // Vector  8:  ADC12BLO
        case ADC12IV_ADC12INIFG:  break;    // Vector 10:  ADC12BIN
        case ADC12IV_ADC12IFG0:             // Vector 12:  ADC12MEM0 Interrupt
            if (ADC12MEM0 >= 0x7ff)         // ADC12MEM0 = A1 > 0.5AVcc?
                P1OUT |= BIT0;              // P1.0 = 1
            else
                P1OUT &= ~BIT0;             // P1.0 = 0

                // Exit from LPM0 and continue executing main
                __bic_SR_register_on_exit(LPM0_bits);
            break;
        case ADC12IV_ADC12IFG1:   break;    // Vector 14:  ADC12MEM1
        case ADC12IV_ADC12IFG2:   break;    // Vector 16:  ADC12MEM2
        case ADC12IV_ADC12IFG3:   break;    // Vector 18:  ADC12MEM3
        case ADC12IV_ADC12IFG4:   break;    // Vector 20:  ADC12MEM4
        case ADC12IV_ADC12IFG5:   break;    // Vector 22:  ADC12MEM5
        case ADC12IV_ADC12IFG6:   break;    // Vector 24:  ADC12MEM6
        case ADC12IV_ADC12IFG7:   break;    // Vector 26:  ADC12MEM7
        case ADC12IV_ADC12IFG8:   break;    // Vector 28:  ADC12MEM8
        case ADC12IV_ADC12IFG9:   break;    // Vector 30:  ADC12MEM9
        case ADC12IV_ADC12IFG10:  break;    // Vector 32:  ADC12MEM10
        case ADC12IV_ADC12IFG11:  break;    // Vector 34:  ADC12MEM11
        case ADC12IV_ADC12IFG12:  break;    // Vector 36:  ADC12MEM12
        case ADC12IV_ADC12IFG13:  break;    // Vector 38:  ADC12MEM13
        case ADC12IV_ADC12IFG14:  break;    // Vector 40:  ADC12MEM14
        case ADC12IV_ADC12IFG15:  break;    // Vector 42:  ADC12MEM15
        case ADC12IV_ADC12IFG16:  break;    // Vector 44:  ADC12MEM16
        case ADC12IV_ADC12IFG17:  break;    // Vector 46:  ADC12MEM17
        case ADC12IV_ADC12IFG18:  break;    // Vector 48:  ADC12MEM18
        case ADC12IV_ADC12IFG19:  break;    // Vector 50:  ADC12MEM19
        case ADC12IV_ADC12IFG20:  break;    // Vector 52:  ADC12MEM20
        case ADC12IV_ADC12IFG21:  break;    // Vector 54:  ADC12MEM21
        case ADC12IV_ADC12IFG22:  break;    // Vector 56:  ADC12MEM22
        case ADC12IV_ADC12IFG23:  break;    // Vector 58:  ADC12MEM23
        case ADC12IV_ADC12IFG24:  break;    // Vector 60:  ADC12MEM24
        case ADC12IV_ADC12IFG25:  break;    // Vector 62:  ADC12MEM25
        case ADC12IV_ADC12IFG26:  break;    // Vector 64:  ADC12MEM26
        case ADC12IV_ADC12IFG27:  break;    // Vector 66:  ADC12MEM27
        case ADC12IV_ADC12IFG28:  break;    // Vector 68:  ADC12MEM28
        case ADC12IV_ADC12IFG29:  break;    // Vector 70:  ADC12MEM29
        case ADC12IV_ADC12IFG30:  break;    // Vector 72:  ADC12MEM30
        case ADC12IV_ADC12IFG31:  break;    // Vector 74:  ADC12MEM31
        case ADC12IV_ADC12RDYIFG: break;    // Vector 76:  ADC12RDY
        default: break;
    }
}

这是修改后的版本,我无法让它工作。

#include <msp430.h>
int i = 0;
int result[1000];
int main(void)
{
 WDTCTL = WDTPW | WDTHOLD;         // Stop WDT
 // GPIO Setup
 P1OUT &= ~BIT0;              // Clear LED to start
 P1DIR |= BIT0;              // P1.0 output
 P1SEL1 |= BIT1;              // Configure P1.1 for ADC
 P1SEL0 |= BIT1;
 // disable the GPIO power-on default high-impedance mode to activate
 // prevIoUsly configured port settings
 PM5CTL0 &= ~LOCKLPM5;   //////////////////////////////////////////////////////////////// COMMON FOR ALL PURPOSE
 // By default,REFMSTR=1 => REFCTL is used to configure the internal reference
 while(REFCTL0 & REFGENBUSY);       // If ref generator busy,WAIT
 REFCTL0 |= REFVSEL_0 | REFON;       // Select internal ref = 1.2V ///////////////////// FOR ADC12 REF VOLTAGE
                      // Internal Reference ON
 // Configure ADC12
 ADC12CTL0 = ADC12SHT0_2 | ADC12ON;                                 /////////////////// ADC CONfigURATION
 ADC12CTL1 = ADC12SHP;           // ADcclK = ModoSC; sampling timer
 ADC12CTL2 |= ADC12RES_2;         // 12-bit conversion results
 ADC12IER0 |= ADC12IE0;          // Enable ADC conv complete interrupt
 ADC12MCTL0 |= ADC12INCH_1 | ADC12VRSEL_1; // A1 ADC input select; Vref=1.2V
 while(!(REFCTL0 & REFGENRDY));      // Wait for reference generator
                      // to settle
  ADC12CTL0 |= ADC12ENC | ADC12SC;     // Sampling and conversion start
  __bis_SR_register(LPM0_bits + GIE);   // LPM0,ADC10_ISR will force exit

}


 #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYstemS_ICC__)
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(ADC12_VECTOR))) ADC12_ISR (void)
#else
#error Compiler not supported!
#endif
{
 switch (__even_in_range(ADC12IV,ADC12IV_ADC12RDYIFG))
 {
  case ADC12IV_NONE:    break;    // Vector 0: No interrupt
  case ADC12IV_ADC12OVIFG: break;    // Vector 2: ADC12MEMx Overflow
  case ADC12IV_ADC12TOVIFG: break;    // Vector 4: Conversion time overflow
  case ADC12IV_ADC12HIIFG: break;    // Vector 6: ADC12BHI
  case ADC12IV_ADC12LOIFG: break;    // Vector 8: ADC12BLO
  case ADC12IV_ADC12INIFG: break;    // Vector 10: ADC12BIN
  case ADC12IV_ADC12IFG0:         // Vector 12: ADC12MEM0 Interrupt
    if(i = 0; i < 1000; i++){
     //result[i] = ADC12MEM0;
      ADC12CTL0 |= ADC12ENC | ADC12SC; // Sampling and conversion start
    }
    else{
        ADC12CTL0 &= ~ADC12ENC;
    }
   //result = ADC12MEM0;
   //ADC12CTL0 |= ADC12ENC | ADC12SC;
   break;                // Clear cpuOFF bit from 0(SR)
  default: break;
 }
}

所以,这是我正在尝试修改的 ADC 的 MSP430FR6989 示例代码。我想把存入寄存器ADC12MEM0的转换结果保存到int result[1000]中;用 if 语句。但是,我觉得我遗漏了一些部分,它也不会运行我的代码并给出错误消息。

**我最近刚刚从 YouTube 学习 C 语言,我遇到的所有数组教程都使用 printf 和 scanf 来存储来自用户输入的值。就我而言,我不需要用户输入。我需要在没有用户输入的情况下将存储值保存到数组中 1000 次。我在这里缺少什么?我在哪里可以找到有关我的案例的信息?

 case ADC12IV_ADC12IFG0:         // Vector 12: ADC12MEM0 Interrupt
    if(i = 0; i < 1000; i++){
     //result[i] = ADC12MEM0;
      ADC12CTL0 |= ADC12ENC | ADC12SC; // Sampling and conversion start
    }
    else{
        ADC12CTL0 &= ~ADC12ENC;
    }
   //result = ADC12MEM0;
   //ADC12CTL0 |= ADC12ENC | ADC12SC;
   break;                // Clear cpuOFF bit from 0(SR)
  default: break;

解决方法

我会将示例代码的 while (1) 替换为 for (i = 0; i < 1000; i++),即。 e.保留在 main 中循环并在 ADC12_ISR 中一次处理一个转换中断的代码结构。您只需在 result[i] = ADC12MEM0; 之前插入 // Exit from LPM0 and continue executing main