主题中讨论的其他器件:Energia
大家好
我正在使用 Energia IDE (版本0101E0017)、我的 TIvaware 修订版本为2.0.1.11577。 我知道它们是相当旧的版本、但它们过去运行良好。 但是、最近我使用了 UART DMA、发现它在功能上不起作用。 希望大家能帮我解决以下问题:
我无法使用 UART7 DMA 将数据传输到另一个 tm4c123gxl launchpad、未接收到字节、但使用 UART0 DMA 时、可以将正确数量的数据传输到我的笔记本电脑。 这是我的代码。 第一部分是工作正常的 UART0 DMA、第二部分是不工作的 UART7 DMA、第三部分是上传到另一个 LaunchPad 的接收部分。
//在基本模式下使用 uart0 DMA,可以传输数据。 #include #include #include "driverlib/gpio.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "driverlib/udma.h" #include "inc/hw_uart.h" #define TX_buffer_size 256 txBuffer[TX_buffer_size]; // uDMA control strat_zh_zh_clus_clus_zh_clus_cludt_zh_clus_clus_clus_clus_zh_clus_clus_clus_clus_clus_clust_zh_clus_clust_clus_clus_clus_clust_clus_clus_clus_clus_clus_zh_clus_clus_clus_clockt_clus_clus_clus_ 对于(uint32_t ui32Idx = 0;ui32Idx < TX_buffer_size;ui32Idx++) { txBuffer[ui32Idx]= 65;//'A' } UARTConfiguration (); UDMAConfiguration (); } void UARTConfiguration () { SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); SysCtlPeripheralEnable (SYSCTL_Periph_UART0); //SysCtlPeripheralSlepEnable (SYSCTL_Periph_UART0); GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); UARTConfigSetExpClk (UART0_BASE、 SysCtlClockGet ()、115200、UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8); UARTIntEnable (UART0_BASE、UART_INT_TX | UART_INT_RX); UARTEnable (UART0_BASE); UARTDMAEnable (UART0_BASE、UART_DMA_RX | UART_DMA_TX); } void UDMAConfiguration () { SysCtlPeripheralEnable (SYSCTL_Periph_UDMA); //CtlSysPeripheralSlepEnable (SYSCTL_Periph_UDMA); uDMAEnable(); uDMAControlBaseSet (&controlTable[0]); uDMAChannelAssign (UDMA_CH9_UART0TX); uDMAChannelAttributeDisable (UDMA_CH9_UART0TX、UDMA_ATTR_ALTSELECT | UDMA_ATINC_HIGH_PRIOR_REFERITY | UDMA_REF_TR_UART9_UART0TX ;UART9_UART9_UART9_UART9_UART9_AM_UART9_UART9_UART9_UART9_AM_UART9_UART9_UART9_UART9_UART9_UART9_UART9_AM_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART_U uDMAChannelEnable (UDMA_CH9_UART0TX); } void loop (){} //在基本模式下使用 uart7 DMA,不传输任何数据。 #include #include #include "driverlib/gpio.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "driverlib/udma.h" #include "inc/hw_uart.h" #define TX_buffer_size 256 txBuffer[TX_buffer_size]; // uDMA control strat_zh_zh_clus_clus_zh_clus_cludt_zh_clus_clus_clus_clus_zh_clus_clus_clus_clus_clus_clust_zh_clus_clust_clus_clus_clus_clust_clus_clus_clus_clus_clus_zh_clus_clus_clus_clockt_clus_clus_clus_ 对于(uint32_t ui32Idx = 0;ui32Idx < TX_buffer_size;ui32Idx++) { txBuffer[ui32Idx]= 65;//'A' } UARTConfiguration (); UDMAConfiguration (); } void UARTConfiguration () { SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE); SysCtlPeripheralEnable (SYSCTL_Periph_UART7); //SysCtlPeripheralSlepEnable (SYSCTL_Periph_UART7); GPIOPinConfigure (GPIO_PE0_U7RX); GPIOPinConfigure (GPIO_PE1_U7TX); GPIOPinTypeUART (GPIO_Porte _BASE、GPIO_PIN_0 | GPIO_PIN_1); UARTConfigSetExpClk (UART7_BASE、 SysCtlClockGet ()、115200、UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); UARTFIFOLevelSet (UART7_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8); UARTIntEnable (UART7_BASE、UART_INT_TX | UART_INT_RX); UARTEnable (UART7_BASE); UARTDMAEnable (UART7_BASE、UART_DMA_RX | UART_DMA_TX); } void UDMAConfiguration () { SysCtlPeripheralEnable (SYSCTL_Periph_UDMA); //CtlSysPeripheralSlepEnable (SYSCTL_Periph_UDMA); uDMAEnable(); uDMAControlBaseSet (&controlTable[0]); uDMAChannelAssign (UDMA_CH21_UART7TX); uDMAChannelAttributeDisable (UDMA_CH21_UART7TX、UDMA_ATTR_ALTSELECT | UDMA_ATINC_HIGH_PRIOR_REFERITY | UDMA_TR_REQTX;uDMA_TRUART7_UART7_UART1_UART1_UART7_SDR_UART1_UART1_UART1_T1_SDR_UART1_SDR_UART7_TR_END_UART1_SDR_UART1_SDR_UART1_SDR_UART1_UART1_SDR_UART_PREM_TR_TR_TR_TR_UART1_SDR_UART_PREM_ENTR_UART1_UART1_UART1_UART1_UART1_UART7_TR_UART1_UART1_SD_TR_TR_TR_TR_TR_UART7_UART1_UART1_U uDMAChannelEnable (UDMA_CH21_UART7TX); } void loop(){}
//此部件供另一个 Launchpad 从 uart7接收数据,然后通过 uart0将数据发送到笔记本电脑
void setup() { Serial.begin(115200); Serial7.begin(115200); Serial7.setBufferSize(8192,8192); } void loop() { if (Serial7.available ()>0) { char ch = Serial7.read(); serial.write (ch); }
2. 如问题1中所述,即使是正确的数据量也可以传输到笔记本电脑,但有时数据字节会变乱(如图所示)。
乱码数据模式始终为12个字节、字节不会改变其值或位置。 我在基本模式和乒乓模式下进行了一些测试、下面显示了乒乓模式代码。
//乒乓模式,用于 UART 数据发送
#include #include #include "driverlib/gpio.h" #include "driverlib/sysctl.h" #include "driverlib/uart.h" #include "driverlib/udma.h" #include "inc/hw_uart.h" #define pingping_buffer_size 128 字节 pingBuffer[pingpbpbpbpbpbpbpbpbpbag_size]; spragma 2mct_zh_clus_clus_zh_clus_clus_clust_zh_clus_clus_clus_clust_zh_clus_clus_clockt_clus_clusbound_zh_clus_clus_clus_clus_clus_clus_clus_clus_clockt_clus_clus_clus_clus_clus_clusbound_clus_clus_zh_ for (uint16_t i = 0;i < pingpong_buffer_size;i++) { pingBuffer[i]= 65;//'a' pongBuffer[i]= 66;//'B' } UARTConfiguration (); UDMAConfiguration (); } void UARTConfiguration () { SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA); SysCtlPeripheralEnable (SYSCTL_Periph_UART0); //SysCtlPeripheralSlepEnable (SYSCTL_Periph_UART0); GPIOPinConfigure (GPIO_PA0_U0RX); GPIOPinConfigure (GPIO_PA1_U0TX); GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1); UARTConfigSetExpClk (UART0_BASE、 SysCtlClockGet ()、115200、UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE); UARTFIFOLevelSet (UART0_BASE、UART_FIFO_TX4_8、UART_FIFO_RX4_8); UARTIntRegister (UART0_BASE、UART0IntHandler); UARTIntEnable (UART0_BASE、UART_INT_TX | UART_INT_RX); UARTEnable (UART0_BASE); UARTDMAEnable (UART0_BASE、UART_DMA_RX | UART_DMA_TX); } void UDMAConfiguration () { SysCtlPeripheralEnable (SYSCTL_PERIPH_UDMA); //SysCtlPeripheralSleep Enable (SYSCTL_PERIPH_UDMA); uDMAEnable(); uDMAControlBaseSet (&controlTable[0]); uDMAINC 通道分配(UDMA_CH9_UART0TX); uDMAChannelAttributeDisable (UDMA_CH9_UART0TX、UDMA_ATTR_ALL);uDMAChannelControlSet (UDMA_CH9_UART0TX | UARTPRI_SELECT、UART4_UART9_DMA_UART4_UART9_UART9_UART9_UART_DA_UART9_UART9_UART9_UART9_UART9_AM_UART9_UDA_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UDA_UART9_UDA_UART_UART9_UART9_UART9_UART9_UART9_UART9_UART9_UART9_U (void *)(UART0_BASE + UART_O_DR)、sizeof (pongBuffer)); uDMAChannelEnable (UDMA_CH9_UART0TX); } void UART0IntHandler () { uINT32_t DMAMode; UARTIntClear (UART0_BASE、UART_INT_TX | UART_INT_RX); DMAMode = uDMAChannelModeGet (UDMA_CH9_UART0TX | UDMA_PRI_SELECT); if (DMAMode = UDMA_MODE_STOP) { uDMAChannelTransferSet (UDMA_CH9_UART0TX | UDMA_PRI_SELECT、UDMA_MODE_Pingpong、pingBuffer、(void *)(UART0_BASE + UART_O_DR)、sizeof (pingBuffer); } DMAMode = uDMAChannelMode| UART9_UART9_Select (UART9_DMA) if (DMAMode = UDMA_MODE_STOP) { uDMAChannelTransferSet (UDMA_CH9_UART0TX | UDMA_ALT_SELECT、UDMA_MODE_乓、pongBuffer、(void *)(UART0_BASE + UART_O_DR)、sizeof (pongBuffer)); } void 环路(){}
在两种模式下、通过分别更改 pingpong_buffer_size 和 TX_buffer_size 的值、结果如下所示。
| 缓冲器大小 | 基本模式(txBuffer) | 位置 | 乒乓模式(ping 缓冲器) | 位置 | 乒乓模式(乓缓冲器) | 位置 |
| 128 | X (全部为0x65) | X | X (全部为0x65) | X | X (全部为0x66) | X |
| 256 | o | 0x88~0x93 | X (全部为0x65) | X | o | 0x87~0x92 |
| 512 | o | 0x88~0x93 | X (全部为0x65) | X | X (全部为0x66) | X |
| 1024 | X (全部为0x65) | X | X (全部为0x65) | X | X (全部为0x66) | X |
在基本模式下、我发现乱码数据似乎出现在同一位置、因此我将 txBuffer 大小减少到128字节、因为128小于136 (0x88)、乱码数据不应出现。 正如预期的那样,当 txBuffer 大小设置为1024时,这些数据不会显示,也不会显示。 太奇怪了!
在乒乓模式下也发生了类似的情况...
感谢您抽出宝贵的时间阅读本 文档、衷心希望大家能帮您解释这些奇怪的字节、如何发生、如何解决此问题以及 UART7 DMA 为何不起作用。