This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/EK-TM4C1294XL:TM4C1294NCPDT 使用 UART3发送的 DMA、DMA 被发送以完成中断、但在发送完成后、始终对中断进行编程。

Guru**** 2478765 points
Other Parts Discussed in Thread: TM4C1294NCPDT

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/691257/ccs-ek-tm4c1294xl-tm4c1294ncpdt-used-uart3-sent-dma-the-dma-is-sent-to-complete-the-interrupt-but-after-the-sent-is-completed-program-into-the-interruption-all-the-time

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:TM4C1294NCPDT

工具/软件:Code Composer Studio

TM4C1294NCPDT 使用 UART3发送的 DMA、DMA 被发送以完成中断、但在发送完成后、始终对中断进行编程。

void InitUART3Transfer (void)
{
uint_fast16_t ui16Idx;

//
//用简单的数据模式填充 TX 缓冲区。
//
for (ui16Idx = 0;ui16Idx < UART_TXBUF_SIZE;ui16Idx++)
{
g_ui8TxBuf[ui16Idx]= ui16Idx;
}
//
启用 UART 使用的 GPIO 外设。
//
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//
启用 UART 外设,并将其配置为即使 CPU
//处于睡眠状态也能运行。
//
ROM_SysCtlPeripheralEnable (SYSCTL_Periph_UART3);
ROM_SysCtlPeripheralSleep Enable (SYSCTL_Periph_UART3);
//
为 UART 模式配置 GPIO 引脚。
//
ROM_GPIOPinConfigure (GPIO_PA4_U3RX);
ROM_GPIOPinConfigure (GPIO_PA5_U3TX);
ROM_GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_4 | GPIO_PIN_5);
//
配置 UART 通信参数。
//
ROM_UARTConfigSetExpClk (UART3_base、g_ui32SysClock、115200、
UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE);

//
将 TX 和 RX 触发阈值设置为4。
此时、// uDMA 控制器将使用此信号来发出何时应传输更多数据的信号。
将配置// uDMA TX 和 RX 通道,以便
在 UART 准备好传输更多数据时以突发方式传输4 //个字节。
//
ROM_UARTFIFOLevelSet (UART3_base、UART_FIFO_TX4_8、UART_FIFO_RX4_8);

//
启用 UART 以进行操作,并为 TX
//和 RX 通道启用 UDMA 接口。
//
ROM_UARTEnable (UART3_base);
ROM_UARTDMAEnable (UART3_base、UART_DMA_RX | UART_DMA_TX);

ROM_uDMAChannelAssign (UDMA_CH16_UART3RX);
ROM_uDMAChannelAssign (UART17_UART3TX);

//
//将 UDMA UART3RX 通道的属性置于已知状态。
默认情况下、这些//应已禁用。
//
ROM_uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_UART3RX、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIORY |
UDMA_ATTR_REQMASK);

//
配置
UART RX 主控制结构的控制参数// 主控制结构用于
乒乓接收的"A"//部分。 传输数据大小为8位、
//源地址不会增加、因为它将从
//寄存器读取。 目的地址增量是字节8位字节。
//仲裁大小设置为4以匹配 RX FIFO 触发阈值。
//如果可能,UDMA 控制器将使用4字节突发传输。 这个
//比单字节传输更有效。
//
ROM_uDMAChannelControlSet (UDMA_SEC_CHANNEL_UART3RX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_NONE | UDMA_DST_INC_8 |
UDMA_ARB_4);

//
配置
UART RX 通道的替代控制结构的控制参数。 备用控制结构体用于
乒乓接收的"B"//部分。 配置与
//主/A 控制结构相同。
//
rom_uDMAChannelControlSet (UDMA_SEC_CHANNE_UART3RX | UDMA_ALT_SELECT、
UDMA_SIZE_8 | UDMA_SRC_NONE | UDMA_DST_INC_8 |
UDMA_ARB_4);

//
设置 UART RX 主控
件的传输参数//结构。 模式设置为乒乓模式、传输源为
// UART 数据寄存器、目标为接收"A"缓冲器。
//传输大小设置为与缓冲区大小匹配。
//
ROM_uDMAChannelTransferSet (UDMA_SEC_CHANNEL UART3RX | UDMA_PRI_SELECT、
UDMA_MODE_PINGONG、
(void *)(UART3_base + UART_O_DR)、
g_ui8RxBufA、sizeof (g_ui8RxBufA)/


设置 UART 控制
结构/交换参数/ 模式设置为乒乓模式、传输源为
// UART 数据寄存器、目标为接收"B"缓冲器。
//传输大小设置为与缓冲区大小匹配。
//
ROM_uDMAChannelTransferSet (UDMA_SEC_CHANGE_UART3RX | UDMA_ALT_SELECT、
UDMA_MODE_Pingpong、
(void *)(UART3_base + UART_O_DR)、
g_ui8RxBufB、sizeof (g_ui8RxBufb)/


将已知通道属性置于 UART1/ UART1/状态。
默认情况下、这些//应已禁用。
//
ROM_uDMAChannelAttributeDisable (UDMA_SEC_CHANGE_UART3TX、
UDMA_ATTR_ALTSELECT |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_USEBURST |
UDMA_ATTR_REQMASK);

//
设置 UDMA TX 通道的 USEBURST 属性。 这将
//强制控制
器在将数据从// TX 缓冲区传输到 UART 时始终使用突发。 这比
默认的允许单次或突发传输的总线用法//更有效。
//
// ROM_uDMAChannelAttributeEnable (UDMA_SEC_CHANGE_UART3TX、UDMA_ATTR_USEBURST);

//
配置 UART TX 的控制参数。 uDMA UART TX
//通道用于将数据块从缓冲区传输到 UART。
//数据大小为8位。 源地址增量为8位字节
//、因为数据来自缓冲区。 由于
数据将被写入 UART 数据寄存器、所以目的增量为//无。
//仲裁大小设置为4、与 UART TX FIFO 触发
//阈值匹配。
//
rom_uDMAChannelControlSet (UDMA_SEC_CHANNEL_UART3TX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_8 | UDMA_DST_INC_NONE
|
UDMA_ARB_4);

//
设置 UDMA UART TX 通道的传输参数。 这将
//配置传输源和目标以及传输大小。
//使用基本模式是因为外设正在进行 UDMA 传输
//请求。 源是 TX 缓冲区、目的是 UART
//数据寄存器。
//
ROM_uDMAChannelTransferSet (UDMA_SEC_CHANNE_UART3TX | UDMA_PRI_SELECT、
UDMA_MODE_BASIC、g_ui8TxBuf、
(void *)(UART3_base + UART_O_DR)、
sizeof (g_ui8TxBuf)


、g_ui8TxBuf)、(void *)/ UARTx/立即开始传输/ UDMA 通道。
一旦通道被启用、外设将
//发出一个传输请求并且数据传输将开始。
//
ROM_uDMAChannelEnable (UDMA_SEC_CHANGE_UART3RX);
ROM_uDMAChannelEnable (UDMA_SEC_CHANGE_UART3TX);

//
启用 UART DMA TX/RX 中断。
//
ROM_UARTIntEnable (UART3_base、UART_INT_DMARX | UART_INT_DMATX);// UART_INT_DMATX

//
启用 UART 外设中断。
//
ROM_IntEnable (INT_UART3);
}

void UART3IntHandler (void)
{
uint32_t ui32Status;
uint32_t ui32Mode;

//
读取 UART 的中断状态。
//
ui32Status = ROM_UARTIntStatus (UART3_base、1);

//
清除任何挂起状态、即使由于没有启用 UART
//中断、应该没有挂起状态。 如果启用了 UART 错误中断、那么
//这些中断可能在这里发生并且应该被处理。 由于 UDMA
用于 RX 和 TX、因此不应
启用这两个中断中的任何一个。
//
ROM_UARTIntClear (UART3_base、ui32Status);

//
检查 DMA 控制表以查看乒乓"A"传输是否
//完成。 "A"传输使用接收缓冲器"A"和主
//控制结构体。
//
ui32Mode = ROM_uDMAChannelModeGet (UDMA_SEC_CHANNE_UART3RX | UDMA_PRI_SELECT);

//
如果主控制结构体指示停止、则表示"A"
//接收缓冲区已完成。 UDMA 控制器仍应将
//数据接收到"B"缓冲区中。
//
if (ui32Mode = udma_mode_stop)
{
//
递增计数器以指示数据已接收到缓冲区 A 中。在
//实数应用中,此函数将用于向主线程发出
//数据已接收的信号,以便主线程可以处理数据。
//
g_ui32RxBufACount++;

//
使用主
//控制结构为"A"缓冲区设置下一个传输。 当进入"B"缓冲区的持续接收被
//完成时、UDMA 控制器将切换回此缓冲区。 此
//示例重复使用缓冲区 A,但更复杂的应用程序可以
//使用一组旋转的缓冲区来增加
//主线程在
重复使用缓冲区之前必须处理缓冲区中数据的时间。
//
rom_uDMAChannelTransferSet (UDMA_SEC_CHANGE_UART3RX | UDMA_PRI_SELECT、
UDMA_MODE_PINGONG、
(void *)(UART3_base + UART_O_DR)、
g_ui8RxBufA、sizeof (g_ui8RxBufpong)
(void *)(void *)(UART3_base + UART2_O_O + UART_O_DR)}


/检查控制表是否
完整/参阅 dma/dma/dma/dma/dma/dma/ "B"传输使用接收缓冲器"B"和副
//控制结构体。
//
ui32Mode = ROM_uDMAChannelModeGet (UDMA_SEC_CHANNE_UART3RX | UDMA_ALT_SELECT);

//
如果副控制结构体指示停止、则表示"B"
//接收缓冲区已完成。 UDMA 控制器仍应将
//数据接收到"A"缓冲区中。
//
if (ui32Mode = udma_mode_stop)
{
//
递增计数器以指示数据已接收到缓冲区 A 中。在
//实数应用中,此函数将用于向主线程发出
//数据已接收的信号,以便主线程可以处理数据。
//
g_ui32RxBufBCount++;

//
使用替代
//控制结构为"B"缓冲区设置下一个传输。 当进入"A"缓冲区的持续接收被
//完成时、UDMA 控制器将切换回此缓冲区。 此
//示例重复使用缓冲区 B,但更复杂的应用程序可以
//使用一组旋转的缓冲区来增加
//主线程在
重复使用缓冲区之前必须处理缓冲区中数据的时间。
//
ROM_uDMAChannelTransferSet (UDMA_SEC_CHANNE_UART3RX | UDMA_ALT_SELECT、
UDMA_MODE_Pingpong、
(void *)(UART3_base + UART_O_DR)、
g_ui8RxBufB、sizeof (g_ui8RxBufb)、(void *




)}/如果已禁用传输、则表示已完成/ DMA 传输。
//
ui32Mode = rom_uDMAIntStatus ();
if (ui32Mode &(1 << UDMA_SEC_CHANNEL UART3TX)
){
ROM_uDMAIntClear (1 << UDMA_SEC_CHANNEL UART3TX);
}