Trip Richert

configure DMA to trigger interrupt end of major loop

Discussion created by Trip Richert on Jul 15, 2014
Latest reply on Jul 15, 2014 by Trip Richert

How do I configure a DMA to trigger the INTMAJOR interrupt on the completion of a major loop?

I am using MQX RTOS on a k60f120 board through CodeWarrior.

 

void dma_ch1_isr( void *user_isr_ptr){ DMA_CINT = DMA_CINT_CINT(0);}

uint16_t dma_dst[16] = {0};

uint16_t dma_src[16] = {0xF, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0xA};

_int_install_isr(16, dma_ch1_isr, NULL);

_bsp_int_init(16, 3, 0, TRUE);

DMAMUX0_CHCFG0 = 0;//use software trigger

DMAMUX1_CHCFG0 = 0;

DMA_TCD0_SADDR = (uint32) &dma_src[0];//source address

DMA_TCD0_SOFF = 2;                                  //src addr ubcr

DMA_TCD0_SLAST = 0;                                //minor loop end decr

DMA_TCD0_DADDR = &dma_dst[0];            //dest address

DMA_TCD0_DOFF = 2;                                 //dest addr incr

DMA_TCD0_DLASTSGA = 0;                       //minor loop end decr

 

DMA_TCD0_NBYTES_MLNO = 8;              //transfer 4 words

 

DMA_TCD0_BITER_ELINKNO = 1;//one major loop iteration

DMA_TCD0_CITER_ELINKNO = 1;

 

DMA_TCD0_ATTR = DMA_ATTR_SSIZE(1) | DMA_ATTR_DSIZE(1);

 

DMA_TCD0_CSR = DMA_CSR_INTMAJOR_MASK; //interrupt after major loop ends

 

DMA_SSRT = DMA_SSRT_SSRT(0);//start DMA

while(!(DMA_TCD0_CSR & DMA_CSR_DONE_MASK)){}//wait for DMA

 

The data transfer is successful if the DMA_CSR_INTMAJOR bit is not set.  The program hangs to "_mqx_idle_task" when the SSRT start bit is set if the DMA_CSR_INTMAJOR bit is set.

Any ideas on what I am doing wrong or a different approach I could use?  If anyone can tell me how to format code blocks in these discussion things, I would appreciate that too.

Outcomes