大家好、我正在运行 Tiva DMA_example (乒乓 UART 接收)、我想知道在接收 DMA 中断时传输了多少字节。 我需要知道它是单次传输还是突发传输、以便处理 DMA 数据缓冲区 A 和 B
在 Tiva DMA 代码示例中断处理程序中:
//
//
// UART1的中断处理程序。 在 DMA 时将发生此中断
//使用 UART1 UDMA 通道完成传输。 它也是如此
//如果外设发出错误信号则触发。 该中断处理程序将会执行
//在接收乒乓缓冲器 A 和 B 之间切换。它还将重新启动 TX
//如果之前的传输完成,则进行 uDMA 传输。 这将保留 UART
//连续运行(将 TX 数据循环回 RX)。
//
//
无效
UART1 IntHandler (空)
{
uint32_t ui32Status;
uint32_t ui32模式;
//
//读取 UART 的中断状态。
//
ui32Status = ROM_UARTIntStatus (UART1_BASE、1);
//
//清除任何挂起状态,即使由于没有 UART,应该没有任何挂起状态
//中断已启用。 如果启用了 UART 错误中断
//这些中断可能在这里发生,应该被处理。 UDMA 的影响
//用于 RX 和 TX、那么这两个中断都不应该
//已启用。
//
ROM_UARTIntClear (UART1_BASE、ui32Status);
//
//检查 DMA 控制表以查看乒乓"A"传输是否为
//完成。 "A"传输使用接收缓冲器"A"和主缓冲器
//控制结构。
//
ui32Mode = ROM_uDMAChannelModeGet (UDMA_CHANGE_UART1RX | UDMA_PRI_SELECT);
//
//如果主控制结构体指示停止,则表示"A"
//接收缓冲完成。 UDMA 控制器仍应接收
//将数据输入"B"缓冲区。
//
if (ui32Mode = uDMA_MODE_STOP)
{
//
//递增计数器以指示数据已接收到缓冲区 A 中
//一个实际应用,此应用将用于向主线程发出信号
//数据已接收,因此主线程可以处理数据。
//
G_ui32RxBufACount++;
//我不知道数据是单次还是突发数据...
//
//使用主缓冲区为"A"缓冲区设置下一个传输
//控制结构。 进入"B"缓冲器的持续接收为时
//完成,UDMA 控制器将切换回这个。 这种情况
//示例重复使用缓冲区 A,但更复杂的应用可能
//使用一组旋转的缓冲区来增加该时间
//主线程必须先处理缓冲区中的数据,然后再处理
//重复使用。
//
ROM_uDMAChannelTransferSet (UDMA_CHANGE_UART1RX | UDMA_PRI_SELECT、
UDMA_MODE_PINGONG、
(void *)(UART1_base + UART_O_DR)、
g_ui8RxBufA、sizeof (g_ui8RxBufA);
}
//
//检查 DMA 控制表以查看乒乓"B"传输是否为
//完成。 "B"传输使用接收缓冲器"B"和副缓冲器
//控制结构。
//
ui32Mode = ROM_uDMAChannelModeGet (UDMA_CHANGE_UART1RX | UDMA_ALT_SELECT);
//
//如果副控制结构体指示停止,则表示"B"
//接收缓冲完成。 UDMA 控制器仍应接收
//将数据输入到"A"缓冲区中。
//
if (ui32Mode = uDMA_MODE_STOP)
{
//
//递增计数器以指示数据已接收到缓冲区 A 中
//一个实际应用,此应用将用于向主线程发出信号
//数据已接收,因此主线程可以处理数据。
//
G_ui32RxBufBCount++;
//
//使用替代设置"B"缓冲区的下一个传输
//控制结构。 接收到"A"缓冲器的时间
//完成,UDMA 控制器将切换回这个。 这种情况
//示例重复使用缓冲区 B,但更复杂的应用程序可以
//使用一组旋转的缓冲区来增加该时间
//主线程必须先处理缓冲区中的数据,然后再处理
//重复使用。
//
ROM_uDMAChannelTransferSet (UDMA_CHANGE_UART1RX | UDMA_ALT_SELECT、
UDMA_MODE_PINGONG、
(void *)(UART1_base + UART_O_DR)、
g_ui8RxBufB、sizeof (g_ui8RxBufB));
}
//
//如果 UART1 DMA TX 通道被禁用,则表示 TX DMA 传输
//完成。
//
if (!ROM_uDMAChannelIsEnabled (UDMA_CHANGE_UART1TX))
{
//
//开始到 UART1 TX 的另一个 DMA 传输。
//
ROM_uDMAChannelTransferSet (UDMA_CHANGE_UART1TX | UDMA_PRI_SELECT、
UDMA_MODE_BASIC、g_ui8TxBuf、
(void *)(UART1_base + UART_O_DR)、
sizeof (g_ui8TxBuf));
//
//必须重新启用 uDMA TX 通道。
//
ROM_uDMAChannelEnable (UDMA_CHANGE_UART1TX);
}
}
在数据表中:
请求类型
μ μDMA 控制器可响应来自外设的两种请求:单次请求或猝发请求。 每个
外设可以支持任一种或两种类型的请求。 单个请求意味着外设
已准备好传输一个数据单元、而猝发请求意味着外设已准备好传输
多个项目。
μ μDMA 控制器的响应会有所不同、具体取决于外设是否为单个
或突发请求。 如果两者都有效、并且 μ μDMA 通道已设置为突发模式
传输、则以猝发请求优先。
数据表第708页:
注:在本例中、外设发出单次请求或猝发请求并不重要。 但对我来说很重要!
由于外设具有在8级触发的 FIFO、因此仲裁数目设置为
如果外设发出猝发请求、那么传输8个字节、就是这样
可以容纳的数据。 如果外设发出单次请求(如果有任何数据)
在 FIFO 中)、然后一次传输一个字节。 如果这对应用很重要
只能在突发模式下进行传输、因此应在中设置通道采用猝发 SET[8]位
DMA 通道采用猝发置位寄存器(DMAUSEBURSTSET)。
我想将 XFERSIZE (传输大小)寄存器置位、但它似乎包含了完成 DMA 周期所需的未完成项(当中断触发时应该为零)。 所以这对我没有帮助。
提前感谢您。