如题所示,我在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);
}
}