如题,最近在调试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;
}
}