Thread 中讨论的其他器件:EK-TM4C1294XL
您好!
我遇到了使用 DMA 的 UART4问题。
我已按如下方式进行配置:
void configureUARTinterface (void)(空)
{
// UART 初始化
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_UART4);
//
//等待 UART0模块准备就绪。
//
while (!map_SysCtlPeripheralReady (SYSCTL_Periph_UART4))
{
}
//
//将 GPIO PK0和 PK1设置为 UART 引脚。
//
MAP_GPIOPinConfigure (GPIO_PK0_U4RX);
MAP_GPIOPinConfigure (GPIO_PK1_U4TX);
MAP_GPIOPinTypeUART (GPIO_PORTK_base、GPIO_PIN_0 | GPIO_PIN_1);
//
//将 UART 配置为1.000.000、8-N-1操作。
//
MAP_UARTConfigSetExpClk (UART4_base、g_ui32SysClock、1000000、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
MAP_UARTClockSourceSet (UART4_base、UART_CLOCK_SYSTEM);
//
//将 TX 和 RX 触发阈值设置为4。 这将由使用
// uDMA 控制器发出信号,指示何时应传输更多数据。 。
//将配置 uDMA TX 和 RX 通道,以便可以传输4个通道
当 UART 准备传输更多数据时、//以突发方式传输字节。
//
MAP_UARTFIFOLevelSet (UART4_base、UART_FIFO_TX4_8、UART_FIFO_RX4_8);
//为 UART1启用 FIFO
MAP_UARTFIFOEnable (UART4_BASE);
//
//启用 UART 以进行操作,并为两个 TX 启用 UDMA 接口
//和 RX 通道。
//
MAP_UARTEnable (UART4_BASE);
// uDMA 初始化
MAP_UARTDMAEnable (UART4_BASE、UART_DMA_TX);
MAP_UARTDMAEnable (UART4_BASE、UART_DMA_RX);
MAP_uDMAChannelAssign (UDMA_CH18_UART4RX);
MAP_uDMAChannelAssign (UDMA_CH19_UART4TX);
MAP_uDMAChannelAttributeDisable (UDMA_CH18_UART4RX、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);
MAP_uDMAChannelAttributeEnable (UDMA_CH18_UART4RX、UDMA_ATTR_USEBURST);
MAP_uDMAChannelAttributeDisable (UDMA_CH19_UART4TX、
UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST |
UDMA_ATTR_HIGH_PRIOR|
UDMA_ATTR_REQMASK);
MAP_uDMAChannelAttributeEnable (UDMA_CH19_UART4TX、UDMA_ATTR_USEBURST);
MAP_uDMAChannelControlSet (UDMA_CH18_UART4RX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 |
UDMA_ARB_4);
MAP_uDMAChannelControlSet (UDMA_CH19_UART4TX | UDMA_PRI_SELECT、
UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE |
UDMA_ARB_4);
}
使用以下函数、我开始 DMA 传输以传输 UART 消息、并在接收到 UART 消息时设置 DMA 传输。
void sendMessageToMCU (E_MCU_Messages MessageType)
{
uint8_t i;
switch (MessageType)
{
案例 eMCU_MESSAGE_SET_VALUE_AND_POLL:
{
memset (uartTXBuffer、0、sizeof (uartTXBuffer));
uartTXBuffer[0]= 0x01;
memcpy (uartTXBuffer[1]、&SBS10_MCU_Status、sizeof (uSBS10_MCU_Status));
ui32CRC32Result = MAP_CRCDataProcess (CCM0_BASE、(uint32_t *) uartTXBuffer、sizeof (uSBS10_MCU_Status)+ 1、false);
memcpy (&uartTXBuffer[sizeof (uSBS10_MCU_Status)+ 1]、&ui32CRC32Result、2);
(空) SLIPP_eStartEncode (_tSLIPSendBuffer);
对于(I = 0;I < sizeof (uSBS10_MCU_Status)+ 3;i++)
{
(空) SLIPP_eEncode (_tSLIPSendBuffer、uartTXBuffer[i]);
}
(空) SLIPP_eEndEncoding (_tSLIPSendBuffer);
MAP_uDMAChannelTransferSet (UDMA_CH19_UART4TX、
UDMA_MODE_BASIC、tSLIPSendBuffer.pui8Buffer、
(void *)(UART4_base + UART_O_DR)、
tSLIPSendBuffer.ui32BufferPointer);
}
中断;
默认值:
中断;
}
MAP_uDMAChannelEnable (UDMA_CH19_UART4TX);
MAP_uDMAChannelTransferSet (UDMA_CH18_UART4RX、
UDMA_MODE_BASIC、
(void *)(UART4_base + UART_O_DR)、
uartRXBuffer、sizeof (uartRXBuffer));
MAP_uDMAChannelEnable (UDMA_CH18_UART4RX);
//
//启用 UART DMA TX/RX 中断。
//
///map_UARTIntEnable (UART4_base、UART_INT_RX | UART_INT_RT);
//MAP_IntEnable (INT_UART4);
HWREG (UART4_BASE + UART_O_ICR)= UART_ICR_RTIC;
HWREG (UART4_BASE + UART_O_ICR)= UART_ICR_RXIC;
}
我的问题是、配置完成后、在发送(调用第二个函数)后、控制器会永久调用 UART4中断处理程序、并且不可能有常规的程序流、
感谢您的帮助...