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.

新手学习msp430f5310,关于dma问题



学习用dma不太明白的是我的while循环,只运行了一次,为什么保存采样数据的数组保存了511个数据;用的是官方给的例程;adc10和dma的配置没有改

  • #include <msp430.h>
    
    unsigned int ADC_Result[512];
    unsigned int i = 0;
    int main(void)
    {
    
      WDTCTL = WDTPW | WDTHOLD;                 // Stop WDT
       P6SEL = BIT1;
      // Configure ADC10 - pulse sample mode; software trigger; 
      ADC10CTL0 = ADC10SHT_2 | ADC10ON | ADC10MSC; // 16ADCclks, ADC on
      ADC10CTL1 = ADC10SHP | ADC10CONSEQ_2;     // pulse sample mode, rpt single ch
      ADC10CTL2 = ADC10RES;                     // 10-bits of re;solution
      ADC10MCTL0 = ADC10INCH_1;                 // AVCC ref, A1
      
      // Configure DMA (ADC10IFG trigger)
      DMACTL0 = DMA0TSEL_24;                    // ADC10IFG trigger
      __data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC10MEM0);
                                                // Source single address  
      __data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &ADC_Result[0]);
                                                // Destination array address  
      DMA0SZ = 512;                              // 64 conversions 
      DMA0CTL = DMADT_4 | DMADSTINCR_3 | DMAEN | DMAIE; // Rpt, inc dest, word access, 
                                                // enable int after 64 conversions  
      while(1)
      {
        ADC10CTL0 |= ADC10ENC | ADC10SC;        // Sampling and conversion start
        __bis_SR_register(CPUOFF | GIE);        // LPM0, ADC10_ISR will force exit
        
        i++;
        
     }  
    }
    
    #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
    #pragma vector=DMA_VECTOR
    __interrupt void DMA0_ISR (void)
    #elif defined(__GNUC__)
    void __attribute__ ((interrupt(DMA_VECTOR))) DMA0_ISR (void)
    #else
    #error Compiler not supported!
    #endif
    {
      switch(__even_in_range(DMAIV,16))
      {
        case  0: break;                         // No interrupt
        case  2: 
          // sequence of conversions complete
          __bic_SR_register_on_exit(CPUOFF);
          ADC10CTL0 &= ~ADC10ENC;               // Disable ADC conversion
          P4OUT ^= BIT3;
          break;                                // DMA0IFG
        case  4: break;                         // DMA1IFG
        case  6: break;                         // DMA2IFG
        case  8: break;                         // Reserved
        case 10: break;                         // Reserved
        case 12: break;                         // Reserved
        case 14: break;                         // Reserved
        case 16: break;                         // Reserved
        default: break; 
      }   
    }
    

    这是代码

  • DMA0SZ = 512

    这个程序DMA0传输大小设置为了512


  • 要理解DMA的机制,对于你的历程来说,是由AD采样触发DMA事件,当DMA事件积累到一定数量,才产生DMA中断,通知处理器去处理数据

    对于你的程序DMA0SZ=512;来说也就是产生了512次DMA事件后才中断处理器