工具与软件:
您好!
我一直在尝试使用 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_VECTOR
static 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();
}