DMA 到 UART 只传输第一个字节
DMA to UART transmits only the first byte
我正在研究 MSP430 系列控制器,我有一个缓冲区要通过 DMA 在 UART 上发送。
我正在粘贴我的 DMA 配置和代码片段以获取更多信息。
DMACTL0 = DMA0TSEL__UCA0TXIFG;
DMA0SA = &buff;
DMA0DA = &UCA0TXBUF;
DMA0SZ = 64; // Block size in bytes
DMA0CTL = DMADT_1 | DMASBDB| DMASRCINCR_1 | DMAIE| DMALEVEL_L; // Rpt, inc
DMA0CTL|= DMAEN;
我正在填写如下数据。
char buff[64];
buff[0] = 0x64;
buff[1] = 0x23;
buff[2] = 0x65;
buff[3] = 0x31;
当我启动 DMA 传输时,缓冲区得到了传输,但是当我检查终端时,它只显示第一个值“0x64”,没有其他 value.I 正在进行块传输,所以应该传输整个块当 DMA 启动时。
在中断路由中,我正在重置 dma 标志。
我的中断处理程序。
__interrupt void DMA_VECTOR_ISR(void)
{
DMA0CTL &= ~DMAIFG;
DMA_Doneflag = 1;
}
这个 DMA_Doneflag 我已经把它当作布尔值 volatile 并且当 tx 完成时它被重置。
区块传输确实复制了整个区块;它相当于以下内容:
while (!(UCA0IFG & UCTXIFG)) {} // wait for trigger
for (i = 0; i < 64; i++)
UCA0TXBUF = buf[i];
这不是您真正想要的。您需要在每个单字节之前等待触发:
for (i = 0; i < 64; i++) {
while (!(UCA0IFG & UCTXIFG)) {}
UCA0TXBUF = buf[i];
}
这可以通过重复单传输模式来完成(DMADT_4
)。
并且您需要 DMASRCINCR_3
才能实际通过缓冲区。
我正在研究 MSP430 系列控制器,我有一个缓冲区要通过 DMA 在 UART 上发送。
我正在粘贴我的 DMA 配置和代码片段以获取更多信息。
DMACTL0 = DMA0TSEL__UCA0TXIFG;
DMA0SA = &buff;
DMA0DA = &UCA0TXBUF;
DMA0SZ = 64; // Block size in bytes
DMA0CTL = DMADT_1 | DMASBDB| DMASRCINCR_1 | DMAIE| DMALEVEL_L; // Rpt, inc
DMA0CTL|= DMAEN;
我正在填写如下数据。
char buff[64];
buff[0] = 0x64;
buff[1] = 0x23;
buff[2] = 0x65;
buff[3] = 0x31;
当我启动 DMA 传输时,缓冲区得到了传输,但是当我检查终端时,它只显示第一个值“0x64”,没有其他 value.I 正在进行块传输,所以应该传输整个块当 DMA 启动时。 在中断路由中,我正在重置 dma 标志。
我的中断处理程序。
__interrupt void DMA_VECTOR_ISR(void)
{
DMA0CTL &= ~DMAIFG;
DMA_Doneflag = 1;
}
这个 DMA_Doneflag 我已经把它当作布尔值 volatile 并且当 tx 完成时它被重置。
区块传输确实复制了整个区块;它相当于以下内容:
while (!(UCA0IFG & UCTXIFG)) {} // wait for trigger
for (i = 0; i < 64; i++)
UCA0TXBUF = buf[i];
这不是您真正想要的。您需要在每个单字节之前等待触发:
for (i = 0; i < 64; i++) {
while (!(UCA0IFG & UCTXIFG)) {}
UCA0TXBUF = buf[i];
}
这可以通过重复单传输模式来完成(DMADT_4
)。
并且您需要 DMASRCINCR_3
才能实际通过缓冲区。