如题,最近在调试msp430f5438a的dma,今天发现一个bug???
如果把下面的语句屏蔽掉,则dma工作正常,如果不屏蔽,则dma就死了,永远不中断了。
//uint8_t j=0;
//for(j=0;j<128;j++)
//{
// while(!(ADC12IFG & BIT0))//等待采样结束
// {
// ;
// }
// DMA_DST_AD0[j] = ADC12MEM0;// Move A1 results, IFG is cleared
//}
具体见程序:
__no_init uint16_t DMA_DST_AD0[2048]; int main(void) { WDTCTL = WDTPW+WDTHOLD; // Stop WDT //ADC设置 P6SEL |=BIT0; // Enable VeREF+ & A/D channel A0 ADC12CTL0 = ADC12ON // 打开ADC内核 +ADC12MSC // 连续采样 +ADC12SHT0_2; // 保持时间为16个cycles ADC12CTL1 = ADC12SSEL_2 // 时钟选择为:MCLK +ADC12DIV_4 // 时钟分频为:4+1=5,即25M/5=5MHz +ADC12SHP // 采样信号源自采样定时器 +ADC12CONSEQ_2; // 单通道多次采样 ADC12MCTL0 = ADC12INCH_0+ADC12EOS; // ref+=AVcc, channel = A0 ADC12CTL0 |= ADC12ENC; // Enable conversions ADC12CTL0 |= ADC12SC; // Start conversion - software trigger ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //如果把下面的这些语句屏蔽掉,dma读取ad值正常,但是放开这些语句,即先 //直接读一次ad值后再用dma读,此时dma就永远不触发了,这是怎么回事? ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// //uint8_t j=0; //for(j=0;j<128;j++) //{ // while(!(ADC12IFG & BIT0))//等待采样结束 // { // ; // } // DMA_DST_AD0[j] = ADC12MEM0;// Move A1 results, IFG is cleared //} //DMA0设置 //触发源选择 DMACTL0 = DMA0TSEL_24; // 通道0 ADC12IFGx triggered //DMA0通道参数设置 DMA0CTL = 0; // 寄存器清零 DMA0CTL = DMADT_4 // 单次重复传输模式 +DMAEN // 使能DMA +DMADSTINCR_3 // 目标地址自增,源地址不变 +DMAIE; // 使能DMA传输完成中断 DMA0SZ = 2048; // DMA0传输大小 __data16_write_addr((uint16_t) &DMA0SA,(uint32_t) &ADC12MEM0); //源地址:ADC12MEM0 __data16_write_addr((uint16_t) &DMA0DA,(uint32_t) &DMA_DST_AD0);//目的地址:DMA_DST[] __bis_SR_register(GIE);//enable interrupts while(1); } //------------------------------------------------------------------------------ // DMA Interrupt Service Routine //------------------------------------------------------------------------------ #pragma vector=DMA_VECTOR __interrupt void DMA_ISR(void) { switch(__even_in_range(DMAIV,16)) { case 0: break; case 2: // DMA0IFG = DMA Channel 0 __no_operation(); break; case 4: break; // DMA1IFG = DMA Channel 1 case 6: break; // DMA2IFG = DMA Channel 2 case 8: break; // DMA3IFG = DMA Channel 3 case 10: break; // DMA4IFG = DMA Channel 4 case 12: break; // DMA5IFG = DMA Channel 5 case 14: break; // DMA6IFG = DMA Channel 6 case 16: break; // DMA7IFG = DMA Channel 7 default: break; } }