Thread 中讨论的其他器件:EK-TM4C123GXL
工具/软件:Code Composer Studio
大家好、
我正在研究一个项目、该项目需要在2个 TM4C123G、套件 A 处理电源处理(ADC、PWM 等)、套件 B 通过 RS-485处理 MODBUS 到 PC 之间开发一种通信方法。 目标是经常进行通信、而不中断 A 的电源过程和 B 的 MODBUS 通信、我已经进行了 I2C、SPI 通信。 这两种方法既快速又准确、但仍然存在缺陷、因为 I2C 没有任何 FIFO、SPI 通信很难在不中断的情况下同步。 我发现 uDMA 可以独立处理而不中断主程序、因此我尝试使用 uDMA UART 来使通信数据始终可访问。 我是 UDMA 领域的新手、但我做了一些研究。 目前、我了解 uDMA 的工作方式、遗憾的是、我不知道如何正确设置它。 我尝试修改了我在网上找到的一些代码、但到目前为止没有任何反应(代码附在下面)。
我的想法是、当数据进入任何套件的 Rx 引脚时、它将触发 UDMA、以便所有数据直接进入 UDMA 寄存器并触发一个标志。 在 while (1)循环中、如果该标志处于开启状态、则会处理数据并响应另一个套件(这也是我选择 UART 而不是 I2C 和 SPI 的原因)。 更多详细信息、套件 B 向套件 A 发送一个包含8字节无符号字符的请求包、套件 A 在完成电源处理后将检查该标志。 如果标志打开、套件 A 将收集数据并将16 (或32字节)的 ADC 信息包发送到套件 B。为了满足这些要求、我应该设置哪种模式和数据类型?
使用 UART FIFO 联机以触发 UDMA 的代码。 是否有任何方法可以在不使用 UART FIFO 的情况下将数据直接传输到 UDMA?
谢谢你。
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_ints.h"
#include "inc/hw_uart.h"
#include "driverlib/gpio.h"
#include "driverlib/pin_map.h"
#include "driverlib/ssi.h"
#include "driverlib/sectl.h"
#include "driverlib/static trabme.h"
、#include "driverlib.0"、darm.1u.h、#include "driverlib.0";include "driverlib.0uart.1uart.0";include "driver1.dartal.h、dtrabtore.h、d4、d4、0u.0u.h、tore.h、tore.h、d4、0u.inc
//启用 GPIO 端口 A
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
//启用 DMA
SysCtlPeripheralEnable (SYSCTL_Periph_UDMA);
IntEnable (INT_UDMAERR);
uDMAEnable();
uDMAControlBaseSet (uDMAControlTable);
//启用 UART 0外设
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
//将 A0和 A1设置为 UART 0的 RX 和 TX 引脚
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_1);
//配置 UART (来自 PIOSC 的时钟、115.2k 8-N-1)
UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、115200、(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_LEON));
当 FIFO 处于1/8容量时、//触发中断
UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX1_8、UART_FIFO_RX1_8);
//确保中断是清除的
UARTIntClear (UART0_BASE、(UART_INT_RX | UART_INT_RT | UART_INT_TX | UART_INT_OE | UART_INT_be | UART_INT_PE | UART_INT_FE));
//启用 UART 0
UARTEnable (UART0_BASE);
//在 UART RX 上启用 DMA
UARTDMAEnable (UART0_BASE、UART_DMA_RX);
//
//将 UDMA UART TX 通道的属性置于已知状态。 这些
默认情况下、//应已禁用。
//
uDMAChannelAttributeDisable (UDMA_CHANGE_UART0TX、UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK);
//
//将 UDMA UART RX 通道的属性置于已知状态。 这些
默认情况下、//应已禁用。
//
uDMAChannelAttributeDisable (UDMA_CHANGE_UART0RX、UDMA_ATTR_ALTSELECT | UDMA_ATTR_USEBURST | UDMA_ATTR_HIGH_PRIOR| UDMA_ATTR_REQMASK);
uDMAChannelAttributeEnable (UDMA_CHANGE_UART0TX、UDMA_ATTR_USEBURST);
uDMAChannelControlSet (UDMA_CHANNEL_UART0TX | UDMA_PRI_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_8 | UDMA_DST_INC_NONE | UDMA_ARB_8);
uDMAChannelControlSet (UDMA_CHANNEL_UART0RX | UDMA_PRI_SELECT、UDMA_SIZE_8 | UDMA_SRC_INC_NONE | UDMA_DST_INC_8 | UDMA_ARB_8);
//在此 UART 上启用 DMA 中断
UARTIntEnable (UART0_BASE、UART_INT_DMARX | UART_INT_DMATX);
//在此 UART 上启用中断
IntEnable (INT_UART0);
}
void uartInterruptHandler (void)
{
//如果是 RX 中断
IF (UARTIntStatus (UART0_BASE、TRUE)& UART_INT_DMARX)
{
//在 UART RX 上禁用 DMA,并清除中断
UARTDMADisable (UART0_BASE、UART_DMA_RX);
UARTIntClear (UART0_BASE,UART_INT_DMARX);
}
//如果是 TX 中断
IF (UARTIntStatus (UART0_BASE、TRUE)和 UART_INT_DMATX)
{
//在 UART TX 上禁用 DMA,并清除中断
UARTDMADisable (UART0_BASE、UART_DMA_TX);
UARTIntClear (UART0_BASE,UART_INT_DMATX);
}
}
int main()
{
SysCtlClockSet (SYSCTL_SYSDIV_2_5 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHz);
//初始化 UART
initUART0();
for (;;)
{
/*********
*接收
*
//设置为接收缓冲区
uDMAChannelTransferSet (uDMA_CHANGE_UART0RX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、(void *)(UART0_BASE + UART_O_DR)、&buffer、sizeof (buffer);
//启用 DMA 通道以开始接收
uDMAChannelEnable (UDMA_CHANGE_UART0RX);
//在 UART RX 上启用 DMA
UARTDMAEnable (UART0_BASE、UART_DMA_RX);
/*********
*发送
*
//设置为发送缓冲区
uDMAChannelTransferSet (uDMA_CHANGE_UART0TX | UDMA_PRI_SELECT、UDMA_MODE_BASIC、&buffer、(void *)(UART0_BASE + UART_O_DR)、sizeof (buffer);
//必须首先启用 DMA 通道,否则将立即发生中断
uDMAChannelEnable (UDMA_CHANGE_UART0TX);
//在 UART TX 上启用 DMA
UARTDMAEnable (UART0_BASE、UART_DMA_TX);
while (uDMAChannelIsEnabled (UDMA_CHANGE_UART0RX))
{
//等待响应,然后再发送更多
}
}