工具与软件:
您好!
我一直在尝试使用 DMA 进行高速的大型数据传输、而且在使用 DMA 的中断时遇到了问题。
我的程序正在尝试向配置为 UART 模式的 eUSCI A0模块发送缓冲区(9638字节)。 本身的 UART 配置
因为我能够使用串行电缆通过它向我的 PC 发送数据。
我制作了两个简单的测试函数来使用 DMA 发送相同的缓冲区、一个函数使用标志轮询、另一个函数使用 DMA 的中断。 下面是代码:
static void dma_send(const uint8_t *buf, size_t len){ DMACTL0 = DMA0TSEL_17; // UCA0TXIFG DMA0SA = (uint32_t)buf; DMA0DA = (uint32_t)(&UCA0TXBUF); DMA0SZ = len; DMA0CTL = ( DMADT_0 // single transfer mode | DMADSTINCR_0 // destination addess fixed | DMASRCINCR_3 // source address incremented | DMADSTBYTE | DMASRCBYTE | DMALEVEL // trigger type: level detection ); hw_toggle_led1(); DMA0CTL |= DMAEN; while (!(DMA0CTL & DMAIFG)); hw_toggle_led1();}PLACE_INTERRUPT(isr_dma)#pragma vector=DMA_VECTORstatic void __interrupt isr_dma(void){ __low_power_mode_off_on_exit(); switch (__even_in_range(DMAIV, DMAIV_DMA0IFG)) { case DMAIV_DMA0IFG: { DMA0CTL &= ~DMAIE; break; } }}static void dma_send_irq(const uint8_t *buf, size_t len){ DMACTL0 = DMA0TSEL_17; // UCA0TXIFG DMA0SA = (uint32_t)buf; DMA0DA = (uint32_t)(&UCA0TXBUF); DMA0SZ = len; DMA0CTL = ( DMADT_0 // single transfer mode | DMADSTINCR_0 // destination address fixed | DMASRCINCR_3 // source address incremented | DMADSTBYTE | DMASRCBYTE | DMALEVEL // trigger type: level detection | DMAIE // enable interrupts ); hw_toggle_led1(); DMA0CTL |= DMAEN; __low_power_mode_0(); hw_toggle_led1();}