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.

[参考译文] Starterware/AM3358:使用 uart4的“uartEcho_EDMA”示例无法正常工作

Guru**** 2539500 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/621391/starterware-am3358-example-of-uartecho_edma-using-uart4-does-not-work-properly

器件型号:AM3358

工具/软件:Starterware

在 Starterware 中使用 uart0的“uartEcho_EDMA”示例工作正常。

当我使用 uart2而不是 uart0,它工作正常。

但是当我使用 uart4而不是 uart0,时,它不能正常工作。 似乎没有收到数据。

代码从 uart0更改为 另一个 UART:

UART_THR_RHR_REG、UART_Instance_base_Add、EDMA3_UART_TX_CHA_NUM、EDMA3_UART_RX_CHA_NUM、UART_INT_NUM

UART0ModuleClkConfig  至 UART0_4ModuleClkConfig

UARTPinMuxSetup 的参数

我的英语很差,很抱歉。

问题在哪里,有人能帮我吗?

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


    请查看此应用手册。 它不是特定于 uartEcho_EDMA 示例、但会让您了解代码中需要进行哪些更改。 希望这对您有所帮助。
    http://www.ti.com/lit/an/sprac32/sprac32.pdf 

    Lali

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

    感谢您 的回答。

    在 Starterware 中使用 uart4的“uartEcho”示例也可以正常工作。

     将示例“uartEcho” 从 uart0更改为 uart4:

    SoC_UART_0_regs 更改为 SOC_UART_4_regs

    UART0ModuleClkConfig  至 UART0_4ModuleClkConfig

    UARTPinMuxSetup 的参数

    也就是说、UARTPinMuxSetup (4)和 UART0_4ModuleClkConfig ()这两个函数 在示例 uartEcho 中运行良好。这两个函数看起来是正确的。

    但是、由于上述仅更改了一些宏定义、示例 uartEcho_EDMA 不起作用。

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

    unsigned int status = false;

    if (0 = instanceNum)

    /* RXD */
    HWREG (SOC_CONTROL_REGS + CONTROL_CONF_UART_RXD (instanceNum))= 0x00000030;

    /* TXD */
    HWREG (SOC_CONTRAL_REGS + CONTRAL_UART_TXD (instanceNum))= 0x00000010;

    状态= true;
    退货状态;

    否则 if (1 = instanceNum)

    /* RXD */
    HWREG (SOC_CONTROL_REGS + CONTROL_CONF_UART_RXD (instanceNum))= 0x00000030;

    /* TXD */
    HWREG (SOC_CONTRAL_REGS + CONTRAL_UART_TXD (instanceNum))= 0x00000010;

    状态= true;
    退货状态;

    否则 if (2 == instanceNum)

    /* RXD */
    HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_SPI0_SCLK)= 0x00000031;

    /* TXD */
    HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_SPI0_D0)= 0x00000011;

    状态= true;
    退货状态;

    否则 if (3 = instanceNum)

    /* RXD */
    HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_SPI0_CS1)= 0x00000031;

    /* TXD */
    HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_ECAP0_IN_PWM0_OUT)= 0x00000011;

    状态= true;
    退货状态;

    否则 if (4 = instanceNum)

    /* RXD */
    HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_UART_CTSN (0))= 0x00000031;

    /* TXD */
    HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_UART_RTSN (0))= 0x00000011;

    状态= true;
    退货状态;

    其他

    退货状态;








    空 UART0_4ModuleClkConfig (空)

    /*配置 L3接口时钟。 *

    //写入 CM_PER_L3_CLKCTRL 寄存器的 MODULEMODE 字段。 *
    HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKCTRL)|=
    CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE;

    //等待 MODULEMODE 位域反映写入值。 *
    while (CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKCTRL)和
    CM_PER_L3_CLKCTRL_MODULEMODE));

    //写入 CM_PER_L3_INSTR_CLKCTRL 寄存器的 MODULEMODE 字段。 *
    HWREG (SOC_CM_PER_REGS + CM_PER_L3_INSTR_CLKCTRL)|=
    CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE;

    //等待 MODULEMODE 位域反映写入值。 *
    while (CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_L3_INSTR_CLKCTRL)和
    CM_PER_L3_INSTR_CLKCTRL_MODULEMODE);

    //写入 CM_PER_L3_CLKSTCTRL 寄存器的 CLKTRCTRL 字段。 *
    HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)|=
    CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    //等待 CLKTRCTRL 字段反映写入的值。 *
    while (CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKSTCTRL)和
    CM_PER_L3_CLKSTCTRL_CLKTRCTRL));

    //写入 CM_PER_OCPWP_L3_CLKSTCTRL 寄存器的 CLKTRCTRL 字段。 *
    HWREG (SOC_CM_PER_REGS + CM_PER_OCPWP_L3_CLKSTCTRL)|=
    CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    /*等待 CLKTRCTRL 域反映写入的值。 *
    while (CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_OCPWP_L3_CLKSTCTRL)和
    CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL);

    //写入 CM_PER_L3S_CLKSTCTRL 寄存器的 CLKTRCTRL 字段。 *
    HWREG (SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL)|=
    CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    /*等待 CLKTRCTRL 域反映写入的值。 *
    while (CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP!=
    (HWREG (SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL)和
    CM_PER_L3S_CLKSTCTRL_CLKTRCTRL);

    /*检查字段中是否有必要的值。 *

    //等待 CM_PER_L3_CLKCTRL 寄存器中的 IDLEST 字段设置为0x0。 *
    while (((CM_PER_L3_CLKCTRL_IDLEST_FUNC << CM_PER_L3_CLKCTRL_IDLEST_SHIFT)!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKCTRL)和
    CM_PER_L3_CLKCTRL_IDLEST));

    /*
    **等待 CM_PER_L3_INSTR_CLKCTRL 寄存器中的 IDLEST 字段达到
    **所需值。
    *
    while (((cm_per_L3_INSTR_CLKCTRL_IDLEST_FUNC <<
    CM_PER_L3_INSTR_CLKCTRL_IDLEST_SHIFT)!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_L3_INSTR_CLKCTRL)和
    CM_PER_L3_INSTR_CLKCTRL_IDLEST);

    /*
    **正在等待 CM_PER_L3_CLKSTCTRL 寄存器中的 CLKACTIVITY_L3_GCLK 域
    **达到所需值。
    *
    while (CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKSTCTRL)和
    CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK);

    /*
    **等待 CM_PER_OCPWP_L3_CLKSTCTRL 中的 CLKACTIVITY_OCPWP_L3_GCLK 字段
    **注册以获得所需的值。
    *
    while (CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_OCPWP_L3_CLKSTCTRL)和
    CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK);

    /*
    **正在等待 CM_PER_L3S_CLKSTCTRL 寄存器中的 CLKACTIVITY_L3S_GCLK 域
    **以达到所需的值。
    *
    while (CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK!=
    (HWREG (SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL)和
    CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK);


    /*配置与唤醒区域相关的寄存器。 *

    //写入 CM_WKUP_CONTRAL_CLKCTRL 寄存器的 MODULEMODE 字段。 *
    HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CONTRAL_CLKCTRL)|=
    CM_WKUP_CONTRAL_CLKCTRL_MODULEMODE_ENABLE;

    //等待 MODULEMODE 位域反映写入值。 *
    while (CM_WKUP_CONTRAL_CLKCTRL_MODULEMODE_ENABLE!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CONTRAL_CLKCTRL)和
    CM_WKUP_CONTRAL_CLKCTRL_MODULEMODE));

    //写入 CM_PER_L3S_CLKSTCTRL 寄存器的 CLKTRCTRL 字段。 *
    HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL)|=
    CM_WKUP_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    /*等待 CLKTRCTRL 域反映写入的值。 *
    while (CM_WKUP_CLKSTCTRL_CLKTRCTRL_SW_WKUP!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL)和
    CM_WKUP_CLKSTCTRL_CLKTRCTRL);

    //写入 CM_L3_AON_CLKSTCTRL 寄存器的 CLKTRCTRL 字段。 *
    HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CM_L3_AON_CLKSTCTRL)|=
    CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    /*等待 CLKTRCTRL 域反映写入的值。 *
    while (CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKTRCTRL_SW_WKUP!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CM_L3_AON_CLKSTCTRL)和
    CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKTRCTRL);

    //写入 CM_WKUP_UART0_CLKCTRL 寄存器的 MODULEMODE 字段。 *
    HWREG (SOC_CM_WKUP_REGS + CM_WKUP_UART0_CLKCTRL)|=
    CM_WKUP_UART0_CLKCTRL_MODULEMODE_ENABLE;

    //等待 MODULEMODE 位域反映写入值。 *
    while (CM_WKUP_UART0_CLKCTRL_MODULEMODE_ENABLE!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_UART0_CLKCTRL)和
    CM_WKUP_UART0_CLKCTRL_MODULEMODE));

    /*验证其他位是否设置为所需设置。 *

    /*
    **等待 CM_WKUP_CONTRAL_CLKCTRL 寄存器中的 IDLEST 域达到
    **所需值。
    *
    while (((CM_WKUP_CONTRAL_CLKCTRL_IDLEST_FUNC <<
    CM_WKUP_CONTRAL_CLKCTRL_IDLEST_SHIFT)!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CONTRAL_CLKCTRL)和
    CM_WKUP_CONTRAL_CLKCTRL_IDLEST));

    /*
    **等待 CM_L3_AON_CLKSTCTRL 中的 CLKACTIVITY_L3_AON_GCLK 字段
    **注册以获得所需的值。
    *
    while (CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKACTIVITY_L3_AON_GCLK!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CM_L3_AON_CLKSTCTRL)和
    CM_WKUP_CM_L3_AON_CLKSTCTRL_CLKACTIVITY_L3_AON_GCLK);

    /*
    **等待 CM_WKUP_L4WKUP_CLKCTRL 寄存器中的 IDLEST 域达到
    **所需值。
    *
    while (((CM_WKUP_L4WKUP_CLKCTRL_IDLEST_FUNC <<
    CM_WKUP_L4WKUP_CLKCTRL_IDLEST_SHIFT)!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_L4WKUP_CLKCTRL)和
    CM_WKUP_L4WKUP_CLKCTRL_IDLEST);

    /*
    **正在等待 CM_WKUP_CLKSTCTRL 寄存器中的 CLKACTIVITY_L4_WKUP_GCLK 字段
    **以达到所需的值。
    *
    while (CM_WKUP_CLKSTCTRL_CLKACTIVITY_L4_WKUP_GCLK!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL)和
    CM_WKUP_CLKSTCTRL_CLKACTIVITY_L4_WKUP_GCLK);

    /*
    **等待 CM_L4_WKUP_AON_CLKSTCTRL 中的 CLKACTIVITY_L4_WKUP_AON_GCLK 字段
    **注册以获得所需的值。
    *
    while (CM_WKUP_CM_L4_WKUP_AON_CLKSTCTRL_CLKACTIVITY_L4_WKUP_AON_GCLK!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CM_L4_WKUP_AON_CLKSTCTRL)和
    CM_WKUP_CM_L4_WKUP_AON_CLKSTCTRL_CLKACTIVITY_L4_WKUP_AON_GCLK);

    /*
    **等待 CM_WKUP_CLKSTCTRL 中的 CLKACTIVITY_UART0_GFCLK 字段
    **注册以获得所需的值。
    *
    while (CM_WKUP_CLKSTCTRL_CLKACTIVITY_UART0_GFCLK!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_CLKSTCTRL)和
    CM_WKUP_CLKSTCTRL_CLKACTIVITY_UART0_GFCLK);

    /*
    **等待 CM_WKUP_UART0_CLKCTRL 寄存器中的 IDLEST 域达到
    **所需值。
    *
    while (((CM_WKUP_UART0_CLKCTRL_IDLEST_FUNC <<
    CM_WKUP_UART0_CLKCTRL_IDLEST_SHIFT)!=
    (HWREG (SOC_CM_WKUP_REGS + CM_WKUP_UART0_CLKCTRL)和
    CM_WKUP_UART0_CLKCTRL_IDLEST);




    HWREG (SOC_CM_PER_REGS + CM_PER_L4LS_CLKSTCTRL)=
    CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

    while ((HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)&
    CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL)!=
    CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

    HWREG (SOC_CM_PER_REGS + CM_PER_L4LS_CLKCTRL)=
    CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE;

    while ((HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKCTRL)&
    CM_PER_L4LS_CLKCTRL_MODULEMODE)!= CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE);






    //写入 CM_PER_GPIO3_CLKCTRL 寄存器的 MODULEMODE 字段。 *
    HWREG (SOC_CM_PER_REGS + CM_PER_UART1_CLKCTRL)|=
    CM_PER_UART1_CLKCTRL_MODULEMODE_ENABLE;

    //等待 MODULEMODE 位域反映写入值。 *
    while (CM_PER_UART1_CLKCTRL_MODULEMODE_ENABLE!=
    (HWREG (SOC_CM_PER_REGS + CM_PER_UART1_CLKCTRL)和
    CM_PER_UART1_CLKCTRL_MODULEMODE));



    //写入 CM_PER_GPIO3_CLKCTRL 寄存器的 MODULEMODE 字段。 *
    HWREG (SOC_CM_PER_REGS + CM_PER_UART2_CLKCTRL)|=
    CM_PER_UART2_CLKCTRL_MODULEMODE_ENABLE;

    //等待 MODULEMODE 位域反映写入值。 *
    while (CM_PER_UART2_CLKCTRL_MODULEMODE_ENABLE!=
    (HWREG (SOC_CM_PER_Regs + CM_PER_UART2_CLKCTRL)和
    CM_PER_UART2_CLKCTRL_MODULEMODE));


    //写入 CM_PER_GPIO3_CLKCTRL 寄存器的 MODULEMODE 字段。 *
    HWREG (SOC_CM_PER_REGS + CM_PER_UART3_CLKCTRL)|=
    CM_PER_UART3_CLKCTRL_MODULEMODE_ENABLE;

    //等待 MODULEMODE 位域反映写入值。 *
    while (CM_PER_UART3_CLKCTRL_MODULEMODE_ENABLE!=
    (HWREG (SOC_CM_PER_REGS + CM_PER_UART3_CLKCTRL)和
    CM_PER_UART3_CLKCTRL_MODULEMODE));



    //写入 CM_PER_GPIO3_CLKCTRL 寄存器的 MODULEMODE 字段。 *
    HWREG (SOC_CM_PER_REGS + CM_PER_UART4_CLKCTRL)|=
    CM_PER_UART4_CLKCTRL_MODULEMODE_ENABLE;

    //等待 MODULEMODE 位域反映写入值。 *
    while (CM_PER_UART4_CLKCTRL_MODULEMODE_ENABLE!=
    (HWREG (SOC_CM_PER_REGS + CM_PER_UART4_CLKCTRL)和
    CM_PER_UART4_CLKCTRL_MODULEMODE));






    while (!(HWREG (SOC_CM_PER_regs + CM_PER_L3S_CLKSTCTRL)&
    CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK);

    while (!(HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)&
    CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK);

    while (!(HWREG (SOC_CM_PER_Regs + CM_PER_OCPWP_L3_CLKSTCTRL)&
    (CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK |
    CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK)));

    while (!(HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)&
    (cm_per_L4LS_CLKSTCTRL_CLKACTIVITY_L4LS_GCLK |
    CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_UART_GFCLK)));
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于 Starterware 不再是受支持的软件产品、因此 TI Starterware 论坛现已不再接受新帖子的发布。 有关 Starterware 和迁移的更多信息、请参阅此 常见问题解答。 由于 Starterware 提供的功能现已包含在 TI 用于 RTOS 的软件开发套件(SDK)中、因此与此功能相关的问题现在会通过器件论坛(由其团队生产这些 SDK)进行传递。