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.

[参考译文] TM4C1294NCPDT:与 DMA 配合使用时、UART RX 中断被永久触发

Guru**** 2348500 points
Other Parts Discussed in Thread: EK-TM4C1294XL
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/911869/tm4c1294ncpdt-uart-rx-interrupt-permanently-triggered-when-using-with-dma

器件型号:TM4C1294NCPDT
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中断处理程序、并且不可能有常规的程序流、

感谢您的帮助...

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

    抱歉、

    中断仅在启用时发生、行也是如此

       ///map_UARTIntEnable (UART4_base、UART_INT_RX | UART_INT_RT);
       //MAP_IntEnable (INT_UART4);

    当然没有评论

       MAP_UARTIntEnable (UART4_base、UART_INT_RX | UART_INT_RT);
       MAP_IntEnable (INT_UART4);

    您可以看到、当我注释这两行时、控制器的程序流是"正常"的

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

    您好!

     我认为问题是由以下代码行造成的。 您是否在中引用了 UDMA_DEMO 示例 /examples/boards/ek-tm4c1294xl/udma_demo. 在此示例中、它使用 UDMA 从 UART1传输数据、但您可以对 UART4进行修改。

     您需要更改:

    发件人:

     MAP_UARTIntEnable (UART4_base、UART_INT_RX | UART_INT_RT);

    至:

    MAP_UARTIntEnable (UART4_base、UART_INT_DMARX | UART_INT_DMATX);