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.

[参考译文] TMS320C6748:UART0 EDMA 不工作

Guru**** 2596195 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/647306/tms320c6748-uart0-edma-not-working

器件型号:TMS320C6748

您好、ed

我的 C6748 UART2 EDMA Starterware 程序正在运行。 我修改了 UART0的程序、但无法正常工作。 我将所有 UART2更改为 UART0、更改了 TRB_RBR 缓冲器、但程序仍然无法正常工作。 方案如下。 请帮助我找到错误。

/**
 *\file uartEcho.c
 *
 *\brief 这是调用某些 API 的示例应用文件
 *       来自 EDMA3器件抽象层以及 UART
 用于       执行配置的*器件抽象层、和
 *       由在 UART 和 CPU RAM 之间传输数据
 *       EDMA3的使用
 *

/*
*版权所有(C) 2012德州仪器(TI)公司- http://www.ti.com/
*
* 以源代码和二进制形式重新分发和使用、有无
* 如果满足以下条件、则允许进行修改
符合*:  
*
*   源代码的重新分发必须保留上述版权
*   注意、此条件列表和以下免责声明。
*
*   二进制形式的再发行必须复制上述版权
*   请注意、中的此条件列表和以下免责声明
*   随提供的文档和/或其他材料
   *分发。
*
*   德州仪器公司的名称和名称均不相同
*   其贡献者可用于认可或推广衍生产品
*   未经特定的事先书面许可。
*
* 本软件由版权所有者和贡献者提供
* "按原样"以及任何明示或暗示的保证、包括但不包括
* 仅限于对适销性和适用性的暗示保证
* 一项特定目的不予承认。 在任何情况下、版权均不得
* 所有者或贡献者应对任何直接、间接、偶然或
* 特殊、惩戒性或后果性损害(包括但不包括)
* 仅限于采购替代货物或服务;丧失使用、
* 数据或利润;或业务中断)
* 责任理论、无论是合同责任、严格责任还是侵权行为
* (包括疏忽或其他)因使用而以任何方式产生
* 、即使被告知可能会发生此类损坏。
*

#include "psc.h"
#include "UART.h"
#include "edma.h"
#include "string.h"
#include "hw_types.h"
#include "uartStdio.h"
#include "lcdkC6748.h"
#include "interrupt.h"
#include "edma_event.h"
#include "SoC_C6748.h"
#include "HW_PSC_C6748.h"

/ /
/*                     内部宏定义                         */
/ /
#define UART_RBR_THR_REG          ((0x01C42000u)+(0U))

#define MAX_ACNT                  1
#define MAX_CCNT                  1

#define RX_buffer_size            20

/* EDMA3事件队列编号。 *
#define EVT_queue_NUM             0

/ /
/*                     本地函数原型                          */
/ /
静态空 UartTransmitData (unsigned int tccNum、unsigned int chNum、
                            volatile char * buffer、unsigned int buffLength);

/*回调函数声明*/
静态空(* CB_Fxn[EDMA3_NUM_TCC])(无符号 int TCC、无符号 int 状态);
静态空 UartReceiveData (unsigned int tccNum、unsigned int chNum、
                           volatile char * buffer);
静态空回调(unsigned int tccNum、unsigned int status);
静态空配置 IntEDMA3 (空);
静态空 Edma3ComplHandlerIsr (空);
静态空 Edma3CCErrHandlerIsr (空);
静态空 EDMA3初始化(空);
static void SetupInt (void);

/ /
/*                     全局变量                                   */
/ /
volatile unsigned int flag = 0;

/ /
/*                  本地函数定义                            */
/ /

/*
**主函数。
*

int main (空)

   volatile char enter[]="\r\n 请从键盘输入20个字节\r\n";
   volatile char buffer[RX_buffer_size];
   无符号 buffint 长度= 0;

   /*初始化 EDMA3控制器*/
   EDMA3初始化();

   /*初始化 UART */
  // UARTStdioInit();
   PSCModuleControl (SOC_PSC_0_regs、9、0、PSC_MDCTL_NEW_ENABLE);
   UARTPinMuxSetup (0、false);
   UARTEnable (SOC_UART_0_reg);

        /*配置 UART 参数*/
        /* 8位工作长度、无奇偶校验、1个停止位。 *
        /* UART 模块输入频率应为150MHz。*/
        UARTConfigSetExpClk (SOC_UART_0_regs、
                            SoC_UART_0_MODULE_FREQ、
                            BAUD_115200、
                            UART_wordl_8位、
                            UART_OVER SAMP_RATE 16);


        /*为发送器和接收器启用 FIFO 模式。*/
        UARTFIFOEnable (SOC_UART_0_reg);

        /*设置接收器 FIFO 触发电平。*/
        UARTFIFOLevelSet (SOC_UART_0_regs、UART_RX_TRIG_LEVEL_1);




   /*请求 DMA 通道和 TCC 以进行 UART 传输*/
   EDMA3RequestChannel (SOC_EDMA30CC_0_regs、EDMA3_CHANNEL_TYPE_DMA、
                       EDMA3_CHA_UART0_TX、EDMA3_CHA_UART0_TX、
                       evt_queue_NUM);

   /*为 TX*/注册回调函数
   CB_Fxn[EDMA3_CHA_UART0_TX]=回调(&B);

   /*请求 DMA 通道和 TCC 以进行 UART 接收*/
   EDMA3RequestChannel (SOC_EDMA30CC_0_regs、EDMA3_CHANNEL_TYPE_DMA、
                       EDMA3_CHA_UART0_RX、EDMA3_CHA_UART0_RX、
                       evt_queue_NUM);

   /*为 RX*/注册回叫功能
   CB_Fxn[EDMA3_CHA_UART0_RX]=回调(&B);

   /*用于 bcnt */
   buffLength = strlen ((const char *) enter);

   /*输入消息的发送数据*/
   UartTransmitData (EDMA3_CHA_UART0_TX、EDMA3_CHA_UART0_TX、
                    Enter、buffLength);

   /*在 DMA 模式下启用 UART */
   UARTDMAEnable (SOC_UART_0_reg、UART_RX_TRIG_LEVEL_1 | \
                                  UART_DMAMODE |         \
                                  UART_FIFO_MODE );

   /*等待回调函数的控制权返回*/
   while (0 =标志);
   标志= 0;

   /*接收输入数据*/
   UartReceiveData (EDMA3_CHA_UART0_RX、EDMA3_CHA_UART0_RX、缓冲器);


   /*在 DMA 模式下启用 UART */
   UARTDMAEnable (SOC_UART_0_reg、UART_RX_TRIG_LEVEL_1 |\
                                  UART_DMAMODE |        \
                                  UART_FIFO_MODE );

   /*等待回调返回*/
   while (0 =标志);
   标志= 0;

   /*为输入的值传输数据*/
   UartTransmitData (EDMA3_CHA_UART0_TX、EDMA3_CHA_UART0_TX、
                    缓冲器、RX_buffer_size);

   /*在 DMA 模式下启用 UART */
   UARTDMAEnable (SOC_UART_0_reg、UART_RX_TRIG_LEVEL_1 | \
                                  UART_DMAMODE |          \
                                  UART_FIFO_MODE );

   /*等待回调返回*/
   while (0 =标志);
   标志= 0;

   //针对 TX 和 RX 提供免费的 EDMA3通道*/
   EDMA3 FreeChannel (SOC_EDMA30CC_0_reg、EDMA3_CHANNEL_TYPE_DMA、
                    EDMA3_CHA_UART0_TX、EDMA3_TRIG_MODE_EVENT、
                    EDMA3_CHA_UART0_TX、EVT_queue_NUM);

   EDMA3 FreeChannel (SOC_EDMA30CC_0_reg、EDMA3_CHANNEL_TYPE_DMA、
                    EDMA3_CHA_UART0_RX、EDMA3_TRIG_MODE_EVENT、
                    EDMA3_CHA_UART0_RX、EVT_queue_NUM);

   while (1);



/*
**此函数用于设置传输通道的 EDMA3中的参数条目
UART 的**。 在该 API 中也会调用 EDMA3使能传输。
*

静态空 UartTransmitData (unsigned int tccNum、unsigned int chNum、
                            volatile char * buffer、unsigned int buffLength)

   EDMA3CCPaRAMEntry 参数集;

   /*用传输特定信息填充参数集*/
   ParamSet.srcAddr =(unsigned int)缓冲区;
   paramSet.destAddr = UART_RBR_THR_REG;
   ParamSet.aCnt = MAX_ACNT;
   ParamSet.bCnt =(无符号短整型) buffLength;
   ParamSet.ccnt = MAX_CCNT;

   /*每个被传输的字节的 src 索引都应递增。 *
   ParamSet.srcBIdx =(短) 1U;

   /*由于 dst 索引是 h/w 寄存器*/,因此 dst 索引不应递增
   paramSet.destBIdx =(简版) 0U;

   /*同步传输模式*/
   ParamSet.srcCIdx =(短整型) 0U;
   paramSet.destCIdx =(简版) 0U;
   ParamSet.linkAddr =(无符号短整型) 0xFFFFFFU;
   ParamSet.bCntReload =(无符号短整型) 0U;
   ParamSet.opt = 0x000000000000u;
   ParamSet.opt |=(EDMA3CC_opt_DAM );
   ParamSet.opt |=((tccNum << EDMA3CC_OPT_TCC_SHIFT)和 EDMA3CC_OPT_TCC);
   ParamSet.opt |=(1 << EDMA3CC_opt_TCINTEN 位移);

   /*现在写入参数集*/
   EDMA3SetPaRAM (SOC_EDMA30CC_0_regs、chNum、&ParamSet);

   /*启用 EDMA 传输*/
   EDMA3 EnableTransfer (SOC_EDMA30CC_0_regs、chNum、EDMA3_TRIG_MODE_EVENT);


/*
**此函数用于为接收通道设置 EDMA3的参数集
UART 的**。 在该 API 中也会调用 EDMA3使能传输。
*

静态空 UartReceiveData (unsigned int tccNum、unsigned int chNum、
                           volatile char *缓冲区)

   EDMA3CCPaRAMEntry 参数集;

   /*用传输特定信息填充参数集*/
   ParamSet.srcAddr = UART_RBR_THR_REG;
   paramSet.destAddr =(unsigned int)缓冲区;
   ParamSet.aCnt = MAX_ACNT;
   ParamSet.bCnt = RX_buffer_size;
   ParamSet.ccnt = MAX_CCNT;

   /* src 索引不应递增,因为它是一个 h/w 寄存器*/
   ParamSet.srcBIdx = 0;
   /* dest 索引应针对每个字节递增*/
   paramSet.destBIdx = 1;

   /*同步传输模式*/
   ParamSet.srcCIdx = 0;
   paramSet.destCIdx = 0;
   ParamSet.linkAddr =(无符号短整型) 0xFFFFFFU;
   ParamSet.bCntReload = 0;
   ParamSet.opt = 0x000000000000u;
   ParamSet.opt |=((EDMA3CC_OPT_SAM)<< EDMA3CC_OPT_SAM_SHIFT);
   ParamSet.opt |=((tccNum << EDMA3CC_OPT_TCC_SHIFT)和 EDMA3CC_OPT_TCC);
   ParamSet.opt |=(1 << EDMA3CC_opt_TCINTEN 位移);

   /*现在写入参数集*/
   EDMA3SetPaRAM (SOC_EDMA30CC_0_regs、chNum、&ParamSet);

   /*启用 EDMA 传输*/
   EDMA3 EnableTransfer (SOC_EDMA30CC_0_regs、chNum、EDMA3_TRIG_MODE_EVENT);


用于初始化 EDMA3的/*函数*/
静态空 EDMA3初始化(空)

   /*为 EDMA3CC_0启用 PSC。*/
   PSCModuleControl (SOC_PSC_0_regs、HW_PSC_cC0、PSC_POWERDOMAIN_AYS_ON、
            PSC_MDCTL_NEW_ENABLE);

   /*为 EDMA3TC_0启用 PSC。*/
   PSCModuleControl (SOC_PSC_0_regs、HW_PSC_TC0、PSC_POWERDOMAIN_AYST_ON、
            PSC_MDCTL_NEW_ENABLE);

   /* EDMA3初始化*/
   EDMA3Init (SOC_EDMA30CC_0_regs、EVT_queue_NUM);

   /*
   **启用 AINTC 以处理中断。 还在中启用 IRQ 中断
   ** ARM 处理器。
   *
   SetupInt();

   /*寄存器 EDMA3中断*/
   配置 IntEDMA3();


用于设置 ARM 中断控制器的/*函数*/
静态空 SetupInt (空)

#ifdef _TMS320C6x
   //初始化 DSP 中断控制器
   IntDSPINTCMINIT();

   //全局启用 DSP 中断
   IntGlobalEnable();
其他
   /*初始化 ARM 中断控制器(AINTC)。 *
   IntAINTCInit();

   /*在 CPSR 中启用 IRQ。*/
   IntMasterIRQEnable();

   /*在 AINTC 的 GER 中启用中断。*/
   IntGlobalEnable();

   /*在 AINTC 的 HIER 中启用中断。*/
   IntIRQEnable();
#endif


/* EDMA3完成处理程序*/
静态空 edma3ComplHandler (unsigned int baseAdd、unsigned int regionNum)

   volatile unsigned int pendingIrqs;
   volatile unsigned int isIPR = 0;

   unsigned int indexl;
   unsigned int cnt = 0;
   分度值= 1;

#ifdef _TMS320C6x
   IntEventClear (SYS_INT_EDMA3_0_cC0_INT1);
其他
   IntSystemStatusClear (SYS_INT_CCINT0);
#endif
   isIPR = HWREG (baseAdd + EDMA3CC_S_IPR (regionNum));
   if (isIPR)
   {
       while (((cnt < EDMA3CC_compl_handler_retry_count)&&(indexl!= 0U))
       {
           分度= 0U;
           pendingIrqs = HWREG (baseADD + EDMA3CC_S_IPR (regionNum));
           while (pendingIrq)
           {
               if ((pendingIrqs & 1U)=true)
               {
                   /**
                   *如果用户没有提供任何回调函数
                   请求 TCC 时、其 TCC 特定位
                   不会清除 IPR 寄存器中的*。
                   *
                   //此处写入 ICR 以清除相应的 IPR 位*/
                   HWREG (baseAdd + EDMA3CC_S_ICR (regionNum))=(1U <<索引);

                   (* CB_Fxn[indexl])(indexl、EDMA3_Xfer_COMPLETE);
               }
               ++indexl;
               pendingIrqs >=1U;
           }
           CNT++;
       }
   }


静态空 Edma3ComplHandlerIsr (空)

#ifdef _TMS320C6x
   //调用完成处理程序 ISR
   edma3ComplHandler (SOC_EDMA30CC_0_regs、1);
其他
   /*调用完成处理程序 ISR */
   edma3ComplHandler (SOC_EDMA30CC_0_regs、0);
#endif


/* EDMA3错误处理程序*/
静态空 edma3CCErrHandler (unsigned int baseAdd)

   volatile unsigned int pendingIrqs = 0;
   unsigned int regionNum = 0;
   unsigned int evtqueNum = 0;
   unsigned int index = 1;
   unsigned int cnt = 0;

#ifdef _TMS320C6x
   IntEventClear (SYS_INT_EDMA3_0_cC0_ERRINT);
其他
   IntSystemStatusClear (SYS_INT_CCERRINT);
#endif

   if ((HWREG (baseAdd + EDMA3CC_EMR)!= 0)||\
      (HWREG (baseAdd + EDMA3CC_QEMR)!= 0)||\
      (HWREG (baseADD + EDMA3CC_CCERR)!= 0))
   {
       /* EDMA3CC_ERR_handler_retry_count 的循环时间、间隔数
          未找到暂挂中断时*/
       while ((cnt < EDMA3CC_ERR_handler _retry_count)&&(索引!= 0U))
       {
           索引= 0U;
           pendingIrqs = HWREG (baseADD + EDMA3CC_EMR);
           while (pendingIrq)
           {
               /*处理所有挂起的中断*/
               if ((pendingIrqs & 1U)=true)
               {
                   /*写入 EMMR 以清除相应的 EMR 位。*/
                   HWREG (baseAdd + EDMA3CC_EMMR)=(1U<<index);
                   /*清除所有 SER */
                   HWREG (baseAdd + EDMA3CC_S_Secr (regionNum))=(1U<<index);
               }
               ++索引;
               pendingIrqs >=1U;
           }
           索引= 0U;
           pendingIrqs = HWREG (baseADD + EDMA3CC_QEMR);
           while (pendingIrq)
           {
               /*处理所有挂起的中断*/
               if ((pendingIrqs & 1U)=true)
               {
                   /*此处写入 QEMMR 以清除相应的 QEMR 位*/
                   HWREG (baseAdd + EDMA3CC_QEMMR)=(1U<<index);
                   /*清除任何 QSER*/
                   HWREG (baseAdd + EDMA3CC_S_QSECR (0))=(1U<<index);
               }
               ++索引;
               pendingIrqs >=1U;
           }
           索引= 0U;
           pendingIrqs = HWREG (baseADD + EDMA3CC_CCERR);
   if (挂起 Irqs!= 0U)
   {
       /*处理所有挂起的 CC 错误中断。 *
       /*不同事件队列的队列阈值错误。*/
       对于(evtqueNum = 0U;evtqueNum < EDMA3_0_NUM_EVTQUE;evtqueNum++)
       {
           if ((pendingIrqs &(1U <<evtqueNum))!= 0U)
           {
               /*清除错误中断。 *
               HWREG (baseAdd + EDMA3CC_CCERRCLR)=(1U << evqueNum);
           }
        }

        /*传输完成代码错误。 *
        if ((pendingIrqs &(1 << EDMA3CC_CCERR_TCCERR_SHIFT))!= 0U)
        {
            HWREG (baseAdd + EDMA3CC_CCERRCLR)=\
                 (0x01u << EDMA3CC_CCERR_TCCERR_SHIFT);
        }
        ++索引;
   }
   CNT++;
       }
   }


静态空 Edma3CCErrHandlerIsr()

   /*调用 CC 错误处理程序 ISR */
   edma3CCErrHandler (SOC_EDMA30CC_0_regs);


/*注册 EDMA3中断的函数*/
静态空配置 IntEDMA3 (空)

   /*在此处注册中断*/

#ifdef _TMS320C6x
   IntRegister (C674x_MASK_INT4、Edma3ComplHandlerIsr);
   IntRegister (C674x_MASK_INT5、Edma3CCErrHandlerIsr);

   IntEventMap (C674x_MASK_INT4、SYS_INT_EDMA3_0_cC0_INT1);
   IntEventMap (C674x_MASK_INT5、SYS_INT_EDMA3_0_cC0_ERRINT);

   IntEnable (C674x_MASK_INT4);
   IntEnable (C674x_MASK_INT5);
其他
   IntRegister (SYS_INT_CCINT0、Edma3ComplHandlerIsr);

   IntChannelSet (SYS_INT_CCINT0、2);

   IntSystemEnable (SYS_INT_CCINT0);

   内部寄存器(SYS_INT_CCERRINT、Edma3CCErrHandlerIsr);

   IntChannelSet (SYS_INT_CCERRINT、2);

   IntSystemEnable (SYS_INT_CCERRINT);
#endif



/*
**此函数用作 EDMA3完成处理程序的回调。
**在 DMA 模式下禁用 UART。
*
静态空回调(unsigned int tccNum、unsigned int status)

   UARTDMADisable (SOC_UART_0_regs、(UART_RX_TRIG_LEVEL_1 | UART_FIFO_MODE);
   FLAG = 1;


/********* 文件结尾******** /
 提前感谢

与 RegardsShalini 合作

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    代码看起来正常。 当你说"不工作"时、这意味着什么? 您使用的平台是什么? 在 LCDK 上、UART0与网络芯片共享。 默认情况下、由于未组装电阻器、J15上的 UART0引脚未连接。 可能需要禁用或移除网络芯片、以避免与 UART 线路发生冲突。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我已组装电阻器。 这些引脚是多路解复用的。 UART0程序在正常模式下工作正常。 在 DMA 模式下使用时、会出现问题。 请提出解决问题的建议。

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

    当我查看 CCS 调试窗口时,接收缓冲区没有接收到的值,接收不会发生事件完成,事件 UART0接收的 EMR 寄存器设置为9。

    相关信息
    Shalini
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果在非 DMA 模式下工作、则必须连接引脚。 我在您的代码中找不到任何明显的错误。 在 EDMA_EVENT_h 中枚举这些事件
    #define EDMA3_CHA_UART0_RX 8.
    #define EDMA3_CHA_UART0_TX 9.
    该计划进展了多大? 是否打印提示?
    这就是我得到的所有东西。 我目前不能想到任何东西。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    发送引脚发送、我在 CRO 中验证、但接收完成不会发生。 程序在接收后保持 while (flag==0)。 EDMA 完成处理程序不返回。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否输入了20个字符? 没有字符回显。 您不会看到您输入的反馈。 您可以尝试将 RX_BUFFER_SIZE 降至1以仅输入一个字符。 或输入一些字符、停止程序并检查缓冲区、以查看是否有 DMA 覆盖。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    主席先生,

    我将持续从 UART0 TX 引脚传输1到8个数据、该引脚使用导线连接到 UART0 Rx 引脚。 TX 和 Rx 通道都使用 DMA 和 EDMA3_0通道控制器0影子区域1传输完成中断。 在 CC Studio 中查看我的接收缓冲区、显示错误的值。 但当我连接 TX 和 Rx 通道时、uART0在没有 DMA 的情况下工作良好。 下面是新计划。


    /**
    *\file uartEcho.c
    *
    *\brief 这是调用某些 API 的示例应用文件
    * EDMA3器件抽象层以及 UART
    * 用于执行配置的器件抽象层、和
    * UART 和 CPU RAM 之间的数据传输
    * EDMA3的使用
    *

    /*
    *版权所有(C) 2012德州仪器(TI)公司- http://www.ti.com/
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    *源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    *二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随提供的文档和/或其他材料
    *分发。
    *
    *德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者提供
    *"按原样"以及任何明示或暗示的保证、包括但不包括
    *仅限于对适销性和适用性的暗示保证
    *一项特定目的不予承认。 在任何情况下、版权均不得
    *所有者或贡献者应对任何直接、间接、偶然或
    *特殊、惩戒性或后果性损害(包括但不包括)
    *仅限于采购替代货物或服务;丧失使用、
    *数据或利润;或业务中断)
    *责任理论、无论是合同责任、严格责任还是侵权行为
    *(包括疏忽或其他)因使用而以任何方式产生
    *、即使被告知可能会发生此类损坏。
    *

    #include "psc.h"
    #include "UART.h"
    #include "edma.h"
    #include "string.h"
    #include "hw_types.h"
    #include "uartStdio.h"
    #include "lcdkC6748.h"
    #include "interrupt.h"
    #include "edma_event.h"
    #include "SoC_C6748.h"
    #include "HW_PSC_C6748.h"

    / /
    /* 内部宏定义 *
    / /
    #define UART_RBR_THR_REG ((0x01C42000u)+(0U))

    #define MAX_ACNT 1
    #define MAX_CCNT 1

    #define RX_buffer_size 20.

    /* EDMA3事件队列编号。 *
    #define EVT_queue_NUM 16.

    / /
    /* 本地函数原型 *
    / /
    静态空 UartTransmitData (unsigned int tccNum、unsigned int chNum、
    volatile char * buffer、unsigned int buffLength);

    /*回调函数声明*/
    静态空(* CB_Fxn[EDMA3_NUM_TCC])(无符号 int TCC、无符号 int 状态);
    静态空 UartReceiveData (unsigned int tccNum、unsigned int chNum、
    volatile char * buffer);
    静态空回调(unsigned int tccNum、unsigned int status);
    静态空配置 IntEDMA3 (空);
    静态空 Edma3ComplHandlerIsr (空);
    静态空 Edma3ComplHandlerIsr1 (空);
    静态空 Edma3CCErrHandlerIsr (空);
    静态空 EDMA3初始化(空);
    static void SetupInt (void);

    / /
    /* 全局变量 *
    / /
    volatile unsigned int flag = 0;

    / /
    /* 本地函数定义 *
    / /

    /*
    **主函数。
    *

    int main (空)

    /volatile char enter[]={130、24、167、163、146、221、154、191、4、49、79、71、37、187、53、126、8、158、142、118、106、255、16、197、61、28、150、236、138、138、138、138、138、127、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、120、
    char buffer[RX_buffer_size];
    无符号 buffint 长度= 0;

    int cncnnt=0、cnt1=0、j1=0;
    字符 enter[7];
    for (cnt=0;cnt<7;cnt++)
    enter[cnt]=5;

    /*初始化 EDMA3控制器*/
    EDMA3初始化();

    /*初始化 UART */
    // UARTStdioInit();
    PSCModuleControl (SOC_PSC_0_regs、HW_PSC_UART0、PSC_POWERDOMAIN_AYS_ON、
    PSC_MDCTL_NEW_ENABLE);
    UARTPinMuxSetup (0、false);
    UARTEnable (SOC_UART_0_reg);

    /*配置 UART 参数*/
    /* 8位工作长度、无奇偶校验、1个停止位。 *
    /* UART 模块输入频率应为150MHz。*/
    UARTConfigSetExpClk (SOC_UART_0_regs、
    SoC_UART_0_MODULE_FREQ、
    BAUD_115200、
    UART_wordl_8位、
    UART_OVER SAMP_RATE 16);


    /*为发送器和接收器启用 FIFO 模式。*/
    UARTFIFOEnable (SOC_UART_0_reg);

    /*设置接收器 FIFO 触发电平。*/
    UARTFIFOLevelSet (SOC_UART_0_regs、UART_RX_TRIG_LEVEL_1);




    /*请求 DMA 通道和 TCC 以进行 UART 传输*/
    EDMA3RequestChannel (SOC_EDMA30CC_0_regs、EDMA3_CHANNEL_TYPE_DMA、
    EDMA3_CHA_UART0_TX、EDMA3_CHA_UART0_TX、
    evt_queue_NUM);

    /*为 TX*/注册回调函数
    CB_Fxn[EDMA3_CHA_UART0_TX]=回调(&B);

    EDMA3RequestChannel (SOC_EDMA30CC_0_regs、EDMA3_CHANNEL_TYPE_DMA、
    EDMA3_CHA_UART0_RX、EDMA3_CHA_UART0_RX、
    evt_queue_NUM);

    CB_Fxn[EDMA3_CHA_UART0_RX]=回调(&B);

    /*用于 bcnt */
    //buffLength = strlen ((const char *) enter);
    buffLength = sizeof (enter);

    //while (1)
    //{
    /*输入消息的发送数据*/
    UartTransmitData (EDMA3_CHA_UART0_TX、EDMA3_CHA_UART0_TX、
    Enter、buffLength);

    /*在 DMA 模式下启用 UART */

    UartReceiveData (EDMA3_CHA_UART0_RX、EDMA3_CHA_UART0_RX、缓冲器);


    UARTDMAEnable (SOC_UART_0_reg、UART_RX_TRIG_LEVEL_1 |\
    UART_DMAMODE | \
    UART_FIFO_MODE );

    /*等待回调函数的控制权返回*/
    while (1);

    //}
    /*接收输入数据*/

    EDMA3 FreeChannel (SOC_EDMA30CC_0_reg、EDMA3_CHANNEL_TYPE_DMA、
    EDMA3_CHA_UART0_TX、EDMA3_TRIG_MODE_EVENT、
    EDMA3_CHA_UART0_TX、EVT_queue_NUM);

    EDMA3 FreeChannel (SOC_EDMA30CC_0_reg、EDMA3_CHANNEL_TYPE_DMA、
    EDMA3_CHA_UART0_RX、EDMA3_TRIG_MODE_EVENT、
    EDMA3_CHA_UART0_RX、EVT_queue_NUM);






    /*
    **此函数用于设置传输通道的 EDMA3中的参数条目
    UART 的**。 在该 API 中也会调用 EDMA3使能传输。
    *
    int myflag1=0;
    静态空 UartTransmitData (unsigned int tccNum、unsigned int chNum、
    volatile char * buffer、unsigned int buffLength)

    EDMA3CCPaRAMEntry 参数集;
    EDMA3CCPaRAMEntry 参数集1;

    paramSet1.srcAddr =(unsigned int)缓冲区;
    paramSet1.destAddr = UART_RBR_THR_REG;
    paramSet1.aCnt = MAX_ACNT;
    paramSet1.bCnt =(无符号短整型) buffLength;
    paramSet1.ccnt = MAX_CCNT;

    /*每个被传输的字节的 src 索引都应递增。 *
    paramSet1.srcBIdx =(短整型) 2U;

    /*由于 dst 索引是 h/w 寄存器*/,因此 dst 索引不应递增
    paramSet1.destBIdx =(简版) 0U;

    /*同步传输模式*/
    paramSet1.srcCIdx =(短整型) 0U;
    paramSet1.destCIdx =(简版) 0U;
    paramSet1.linkAddr = 0x01c043c0;
    paramSet1.bCntReload =(无符号短整型) 0U;
    paramSet1.opt = 0x000000000000u;
    // paramSet1.op=(EDMA3CC_opt_DAM );
    // paramSet1.opt |=((tccNum << EDMA3CC_OPT_TCC_SHIFT)和 EDMA3CC_OPT_TCC);
    // paramSet1.op=(1 << EDMA3CC_opt_TCINTEN 位移);
    paramSet1.op=0x00109002;

    EDMA3SetPaRAM (SOC_EDMA30CC_0_regs、30、paramSet1);

    /*用传输特定信息填充参数集*/
    ParamSet.srcAddr =(无符号短整型)缓冲区;
    paramSet.destAddr = UART_RBR_THR_REG;
    ParamSet.aCnt = MAX_ACNT;
    ParamSet.bCnt =(无符号短整型) buffLength;
    ParamSet.ccnt = MAX_CCNT;

    /*每个被传输的字节的 src 索引都应递增。 *
    ParamSet.srcBIdx =(短整型) 2U;

    /*由于 dst 索引是 h/w 寄存器*/,因此 dst 索引不应递增
    paramSet.destBIdx =(简版) 0U;

    /*同步传输模式*/
    ParamSet.srcCIdx =(短整型) 0U;
    paramSet.destCIdx =(简版) 0U;
    ParamSet.linkAddr = 0x01c043c0;
    ParamSet.bCntReload =(无符号短整型) 0U;
    ParamSet.opt = 0x000000000000u;
    // ParamSet.opt |=(EDMA3CC_opt_DAM );
    // ParamSet.opt |=((tccNum << EDMA3CC_OPT_TCC_SHIFT)& EDMA3CC_OPT_TCC);
    // ParamSet.op=(1 << EDMA3CC_opt_TCINTEN 位移);
    ParamSet.op=0x00109002;
    myflag1=ParamSet.opt;
    /*现在写入参数集*/
    EDMA3SetPaRAM (SOC_EDMA30CC_0_regs、chNum、&ParamSet);

    // 109002
    /409002
    //HWREG (SOC_EDMA30CC_0_regs + 0x8c0)|=0x00000008;

    //HWREG (SOC_EDMA30CC_0_regs + 0x8c0)|=0x00000100; //对于 DRAE1

    /*启用 EDMA 传输*/
    EDMA3 EnableTransfer (SOC_EDMA30CC_0_regs、chNum、EDMA3_TRIG_MODE_EVENT);


    /*
    **此函数用于为接收通道设置 EDMA3的参数集
    UART 的**。 在该 API 中也会调用 EDMA3使能传输。
    *

    int myflag=0;
    静态空 UartReceiveData (unsigned int tccNum、unsigned int chNum、
    volatile char *缓冲区)

    EDMA3CCPaRAMEntry 参数集;
    EDMA3CCPaRAMEntry 参数集1;

    /*用传输特定信息填充参数集*/
    ParamSet.srcAddr = UART_RBR_THR_REG;
    paramSet.destAddr =(unsigned int)缓冲区;
    ParamSet.aCnt = MAX_ACNT;
    ParamSet.bCnt = 16;
    ParamSet.ccnt = MAX_CCNT;

    /* src 索引不应递增,因为它是一个 h/w 寄存器*/
    ParamSet.srcBIdx =(short) 0U;
    /* dest 索引应针对每个字节递增*/
    paramSet.destBIdx =(短型) 1U;


    ParamSet.srcCIdx =(短整型) 0U;
    paramSet.destCIdx =(简版) 0U;
    ParamSet.linkAddr =0x01c043e0;
    ParamSet.bCntReload =(无符号短整型) 0U;
    ParamSet.opt = 0x000000000000u;
    ParamSet.op=0x00108001;
    myflag=ParamSet.opt;

    /*现在写入参数集*/

    paramSet1.srcAddr = UART_RBR_THR_REG;
    paramSet1.destAddr =(unsigned int)缓冲区;
    paramSet1.aCnt = MAX_ACNT;
    paramSet1.bCnt = 16;
    paramSet1.ccnt = MAX_CCNT;

    /* src 索引不应递增,因为它是一个 h/w 寄存器*/
    paramSet1.srcBIdx =(short) 0U;
    /* dest 索引应针对每个字节递增*/
    paramSet1.destBIdx =(短型) 1U;


    paramSet1.srcCIdx =(短整型) 0U;
    paramSet1.destCIdx =(简版) 0U;
    paramSet1.linkAddr = 0x01c043e0;
    paramSet1.bCntReload =(无符号短整型) 0U;
    paramSet1.opt = 0x000000000000u;
    paramSet1.op=0x00108001;
    myflag=paramSet1.opt;

    EDMA3SetPaRAM (SOC_EDMA30CC_0_regs、chNum、&ParamSet);
    EDMA3SetPaRAM (SOC_EDMA30CC_0_regs、31、paramSet1);

    // HWREG (SOC_EDMA30CC_0_regs + 0x8c0)|=0x00000080; //对于 DRAE2
    /*启用 EDMA 传输*/
    EDMA3 EnableTransfer (SOC_EDMA30CC_0_regs、chNum、EDMA3_TRIG_MODE_EVENT);


    用于初始化 EDMA3的/*函数*/
    静态空 EDMA3初始化(空)

    /*为 EDMA3CC_0启用 PSC。*/
    PSCModuleControl (SOC_PSC_0_regs、HW_PSC_cC0、PSC_POWERDOMAIN_AYS_ON、
    PSC_MDCTL_NEW_ENABLE);

    /*为 EDMA3TC_0启用 PSC。*/
    PSCModuleControl (SOC_PSC_0_regs、HW_PSC_TC0、PSC_POWERDOMAIN_AYST_ON、
    PSC_MDCTL_NEW_ENABLE);

    /* EDMA3初始化*/
    EDMA3Init (SOC_EDMA30CC_0_regs、EVT_queue_NUM);

    /*
    **启用 AINTC 以处理中断。 还在中启用 IRQ 中断
    ** ARM 处理器。
    *
    SetupInt();

    /*寄存器 EDMA3中断*/
    配置 IntEDMA3();


    用于设置 ARM 中断控制器的/*函数*/
    静态空 SetupInt (空)

    #ifdef _TMS320C6x
    //初始化 DSP 中断控制器
    IntDSPINTCMINIT();

    //全局启用 DSP 中断
    IntGlobalEnable();
    其他
    /*初始化 ARM 中断控制器(AINTC)。 *
    IntAINTCInit();

    /*在 CPSR 中启用 IRQ。*/
    IntMasterIRQEnable();

    /*在 AINTC 的 GER 中启用中断。*/
    IntGlobalEnable();

    /*在 AINTC 的 HIER 中启用中断。*/
    IntIRQEnable();
    #endif


    /* EDMA3完成处理程序*/
    静态空 edma3ComplHandler (unsigned int baseAdd、unsigned int regionNum)

    volatile unsigned int pendingIrqs;
    volatile unsigned int isIPR = 0;

    unsigned int indexl;
    unsigned int cnt = 0;
    分度值= 1;

    #ifdef _TMS320C6x
    IntEventClear (SYS_INT_EDMA3_0_cC0_INT1);
    其他
    IntSystemStatusClear (SYS_INT_CCINT0);
    #endif
    isIPR = HWREG (baseAdd + EDMA3CC_S_IPR (regionNum));
    if (isIPR)

    while (((cnt < EDMA3CC_compl_handler_retry_count)&&(indexl!= 0U))

    分度= 0U;
    pendingIrqs = HWREG (baseADD + EDMA3CC_S_IPR (regionNum));
    while (pendingIrq)

    if ((pendingIrqs & 1U)=true)

    /**
    *如果用户没有提供任何回调函数
    请求 TCC 时、其 TCC 特定位
    不会清除 IPR 寄存器中的*。
    *
    //此处写入 ICR 以清除相应的 IPR 位*/
    //HWREG (baseAdd + EDMA3CC_S_ICR (regionNum))=(1U <<索引);

    (* CB_Fxn[indexl])(indexl、EDMA3_Xfer_COMPLETE);

    ++indexl;
    pendingIrqs >=1U;

    CNT++;








    静态空 Edma3ComplHandlerIsr (空)

    #ifdef _TMS320C6x
    //调用完成处理程序 ISR
    edma3ComplHandler (SOC_EDMA30CC_0_regs、1);
    其他
    /*调用完成处理程序 ISR */
    edma3ComplHandler (SOC_EDMA30CC_0_regs、0);
    #endif


    静态空 Edma3ComplHandlerIsr1 (空)

    #ifdef _TMS320C6x
    //调用完成处理程序 ISR
    edma3ComplHandler (SOC_EDMA30CC_0_regs、2);
    其他
    /*调用完成处理程序 ISR */
    edma3ComplHandler (SOC_EDMA30CC_0_regs、0);
    #endif


    /* EDMA3错误处理程序*/
    静态空 edma3CCErrHandler (unsigned int baseAdd)

    volatile unsigned int pendingIrqs = 0;
    unsigned int regionNum = 0;
    unsigned int evtqueNum = 0;
    unsigned int index = 1;
    unsigned int cnt = 0;

    #ifdef _TMS320C6x
    IntEventClear (SYS_INT_EDMA3_0_cC0_ERRINT);
    其他
    IntSystemStatusClear (SYS_INT_CCERRINT);
    #endif

    if ((HWREG (baseAdd + EDMA3CC_EMR)!= 0)||\
    (HWREG (baseAdd + EDMA3CC_QEMR)!= 0)||\
    (HWREG (baseADD + EDMA3CC_CCERR)!= 0))

    /* EDMA3CC_ERR_handler_retry_count 的循环时间、间隔数
    未找到暂挂中断时*/
    while ((cnt < EDMA3CC_ERR_handler _retry_count)&&(索引!= 0U))

    索引= 0U;
    pendingIrqs = HWREG (baseADD + EDMA3CC_EMR);
    while (pendingIrq)

    /*处理所有挂起的中断*/
    if ((pendingIrqs & 1U)=true)

    /*写入 EMMR 以清除相应的 EMR 位。*/
    HWREG (baseAdd + EDMA3CC_EMMR)=(1U<<index);
    /*清除所有 SER */
    HWREG (baseAdd + EDMA3CC_S_Secr (regionNum))=(1U<<index);

    ++索引;
    pendingIrqs >=1U;

    索引= 0U;
    pendingIrqs = HWREG (baseADD + EDMA3CC_QEMR);
    while (pendingIrq)

    /*处理所有挂起的中断*/
    if ((pendingIrqs & 1U)=true)

    /*此处写入 QEMMR 以清除相应的 QEMR 位*/
    HWREG (baseAdd + EDMA3CC_QEMMR)=(1U<<index);
    /*清除任何 QSER*/
    HWREG (baseAdd + EDMA3CC_S_QSECR (0))=(1U<<index);

    ++索引;
    pendingIrqs >=1U;

    索引= 0U;
    pendingIrqs = HWREG (baseADD + EDMA3CC_CCERR);
    if (挂起 Irqs!= 0U)

    /*处理所有挂起的 CC 错误中断。 *
    /*不同事件队列的队列阈值错误。*/
    对于(evtqueNum = 0U;evtqueNum < EDMA3_0_NUM_EVTQUE;evtqueNum++)

    if ((pendingIrqs &(1U <<evtqueNum))!= 0U)

    /*清除错误中断。 *
    HWREG (baseAdd + EDMA3CC_CCERRCLR)=(1U << evqueNum);



    /*传输完成代码错误。 *
    if ((pendingIrqs &(1 << EDMA3CC_CCERR_TCCERR_SHIFT))!= 0U)

    HWREG (baseAdd + EDMA3CC_CCERRCLR)=\
    (0x01u << EDMA3CC_CCERR_TCCERR_SHIFT);

    ++索引;

    CNT++;




    静态空 Edma3CCErrHandlerIsr()

    /*调用 CC 错误处理程序 ISR */
    edma3CCErrHandler (SOC_EDMA30CC_0_regs);


    /*注册 EDMA3中断的函数*/
    静态空配置 IntEDMA3 (空)

    /*在此处注册中断*/

    #ifdef _TMS320C6x
    IntRegister (C674x_MASK_INT4、Edma3ComplHandlerIsr);
    //IntRegister (C674x_MASK_INT6、Edma3ComplHandlerIsr1);
    //IntRegister (C674x_MASK_INT5、Edma3CCErrHandlerIsr);

    IntEventMap (C674x_MASK_INT4、SYS_INT_EDMA3_0_cC0_INT1);
    //IntEventMap (C674x_MASK_INT6、SYS_INT_EDMA3_0_cC0_INT2);
    //IntEventMap (C674x_MASK_INT5、SYS_INT_EDMA3_0_cC0_ERRINT);

    IntEnable (C674x_MASK_INT4);
    IntEnable (C674x_MASK_INT5);
    其他
    IntRegister (SYS_INT_CCINT0、Edma3ComplHandlerIsr);

    IntChannelSet (SYS_INT_CCINT0、2);

    IntSystemEnable (SYS_INT_CCINT0);

    内部寄存器(SYS_INT_CCERRINT、Edma3CCErrHandlerIsr);

    IntChannelSet (SYS_INT_CCERRINT、2);

    IntSystemEnable (SYS_INT_CCERRINT);
    #endif



    /*
    **此函数用作 EDMA3完成处理程序的回调。
    **在 DMA 模式下禁用 UART。
    *
    静态空回调(unsigned int tccNum、unsigned int status)

    //UARTDMADisable (SOC_UART_0_regs、(UART_RX_TRIG_LEVEL_1 | UART_FIFO_MODE);
    //flag = 1;


    相关信息
    Shalini
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果 UART 2更改为1、我看到您更改了外部的原始示例。 原始示例是否仅适用于 UART0更改? 我认为您应该将代码作为文件附加。 在帖子中很难阅读。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../uart0_5F00_lpbk.cSir、

    我刚刚使用 UART0修改了 UART2程序。 由于 UART2连接到 USB UART 转换器、因此它可以与超级终端配合使用、因此无法通过作为 GPIO 引脚输出的 UART0来实现。 随附的是程序。

    相关信息

    Shalini

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

    您可以购买将逻辑电平 UART 转换为 USB 串行点的适配器。 我假设您到目前为止一直在使用示波器。

    我在 DMA 方面的经验仅限于外设之间的简单 DMA 传输。 您的代码尝试执行更复杂的操作。 我很确定您对0x01c043e0的使用不是很正确。 使用此代码

    ParamSet.linkAddr =0x01c043e0;
    ParamSet.bCntReload =(无符号短整型) 0U;

    linkAddr 通常用于将多个参数链接在一起、是参数的偏移量。 它不是绝对地址。 EDMA 代码使用宏 EDMA3CC_OPT (PaRAMid)计算偏移地址。

    连接是简单 UART DMA 回送看起来的样子。 我没有访问开发环境的权限、无法进行编译。 理论上它应该起作用。

    您已经超出了我对 DMA 的有限了解、无法为您提供更多帮助。 希望您能在这个线程或您的另一个线程中获得更多的专家响应。

    e2e.ti.com/.../uart0_5F00_lpbk_5F00_simple.c

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

    哎呀。 错过了变量 rename。 附加的是校正。

    e2e.ti.com/.../uart0_5F00_lpbk_5F00_simple2.c