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; }