MSP432 DMA频繁进中断?



如题所示,我在RAM中开辟两块缓冲区,测试使用软件触发方式进行DMA数据传输,在main中第一次触发后,正常进入DMA中断,数据也正确,但是第二次使用串口接收中断再次触发时,虽然也进入DMA中断,但是数据未传输过来,而且在DMA中断中加断点发现函数频繁的进入DMA中断,手册中描述DMA传输完成后,通道禁用了,为什么还会进入中断?

代码如下,请各位指正:

#ifdef ewarm
#pragma data_alignment=256
#else
#pragma DATA_ALIGN(controlTable, 256)
#endif
uint8_t controlTable[256];

uint8_t *p_test_uart0 = (uint8_t*)0x20000600;
void main(void)
{
	 uint16_t i;
	 /* Halting the Watchdog */
	 MAP_WDT_A_holdTimer();
	
	
	 /* Configuring pins for peripheral/crystal usage and LED for output */
	 MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_PJ,
	 				 	 	 GPIO_PIN0 | GPIO_PIN1 | GPIO_PIN2 | GPIO_PIN3, GPIO_PRIMARY_MODULE_FUNCTION);

	 CS_setExternalClockSourceFrequency(32000,48000000);
	 MAP_PCM_setCoreVoltageLevel(PCM_VCORE1);

	 CS_startHFXT(false);
	 /* Starting LFXT in non-bypass mode without a timeout. */
	 CS_startLFXT(false);

	 MAP_CS_initClockSignal(CS_MCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_1);
	 MAP_CS_initClockSignal(CS_SMCLK, CS_HFXTCLK_SELECT, CS_CLOCK_DIVIDER_4);


	 euscia2_init();
	
	 MAP_DMA_enableModule();
	 MAP_DMA_setControlBase(controlTable);

	 MAP_DMA_setChannelControl(UDMA_PRI_SELECT,
	 		            UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_8 | UDMA_ARB_64);
	 MAP_DMA_setChannelTransfer(UDMA_PRI_SELECT, UDMA_MODE_AUTO, (uint32_t *)0x20000600,
			 (uint32_t *)0x20001100, 1024);
	 /* Assigning/Enabling Interrupts */
	 MAP_DMA_assignInterrupt(DMA_INT1, 0);
	 MAP_Interrupt_enableInterrupt(INT_DMA_INT1);

	 /* Enabling DMA Channel Num */
	 MAP_DMA_enableChannel(0);


	 MAP_Interrupt_enableSleepOnIsrExit();
	 MAP_Interrupt_enableMaster();

     for(i=0;i<1000;i++)
     {
    	 *p_test_uart0++ = i;
     }

     p_test_uart0 = (uint8_t*)0x20000600;

     MAP_DMA_requestSoftwareTransfer(0);

	 while(1)
	 {
		 MAP_PCM_gotoLPM0InterruptSafe();
	 }

}
uint_fast8_t dma0=0,dma1=0;
void dma_1_interrupt(void)
{
	uint32_t mode=0,i=0;
	uint8_t *p_test_uart2 = (uint8_t*)0x20001100;
	dma0++;
	mode = DMA_getChannelMode(0);
	if(mode == UDMA_MODE_STOP)
	{
		for(i=0;i<1024;i++)
		{
			*p_test_uart2++ = 0;
		}
		dma1++;
	}
}
void euscia2_isr(void)
{
	uint32_t status;
	uint_fast8_t data;

	status = MAP_UART_getEnabledInterruptStatus(EUSCI_A2_MODULE);
	MAP_UART_clearInterruptFlag(EUSCI_A2_MODULE, status);

	    if(status & EUSCI_A_UART_RECEIVE_INTERRUPT)//REC-ISR
	    {
	    	num0++;
	    	MAP_UART_enableInterrupt(EUSCI_A2_MODULE, EUSCI_A_UART_TRANSMIT_INTERRUPT);
	    	data =  MAP_UART_receiveData(EUSCI_A2_MODULE);
	    	MAP_DMA_requestSoftwareTransfer(0);
	    }
}