Part Number: MSP430FG6426
Hello!
Help to understand a problem. Transfer of the data from ADC by means of DMA does not work at bit setting "Gie".
In the resulted text of the program and a global interrupt disabling//"__bis_SR_register(GIE+LPM0_bits)", all works normally.
At resolution of interruptions the line "__ bis_SR_register (GIE)" is included, the data is not transferred. Interruption arises and is processed. But data migration is not present.
For the test interposed a line "__ bis_SR_register (LPM0_bits)"; in this case works, the data is transferred interruption arises, but to me so does not approach. How it is possible to bypass it? That I do not truly. In slau208q it is told that all should work in any modes. Not clearly, why there is interruption DMA, in the absence of the data?
Text test program:
int main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
//Configuration of the analog unit
OA0CTL0|=OAM;
OA1CTL0|=OAM;
OA0PSW|=PSW0;
OA1PSW|=PSW0;
OA0NSW|=NSW0;
OA1NSW|=NSW0;
P6SEL|=BIT4+BIT5;
P7SEL|=BIT4+BIT5+BIT6+BIT7;
//Ref Configuration
REFCTL0|=REFON+REFOUT;
P5SEL|=BIT0;
//Configuration ADC
CTSD16CTL|=CTSD16REFS;
CTSD16INCTL0|=CTSD16INCH_15+CTSD16GAIN_16;
volatile int AdcWave1 [31];
unsigned int i;
//Configuration DMA
DMACTL0=DMA0TSEL_24; //DMA 0 trigger select CTSD16.
__data20_write_long((unsigned int)&DMA0SA, (unsigned long)&CTSD16MEM0);
__data20_write_long((unsigned int)&DMA0DA, (unsigned long)&AdcWave1);
DMA0SZ = 31;
DMACTL4|=DMARMWDIS;
DMA0CTL|=DMADT_0|DMADSTINCR_3|DMAIE;
DMA0CTL&=~DMAIFG;
DMA0CTL|=DMAEN;
CTSD16CCTL0|=CTSD16SC; //Start ADC
__bis_SR_register(GIE+LPM0_bits); //So works
//__bis_SR_register(GIE); // So not works
}
#pragma vector=DMA_VECTOR
__interrupt void Interrupt_DMA(void)
{
unsigned int mem=DMAIV;
switch (mem){
case 0x0: {break;}
case 0x2: {
DMA0CTL&=~DMAIE;
CTSD16CCTL0&=~CTSD16SC; //Stop ADC
break;
}
case 0x4: {break;}
case 0x6: {break;}
case 0x8: {break;}
case 0xA: {break;}
case 0xC: {break;}
case 0xE: {break;}
case 0x10:{break;}
}
return;
}