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.

[参考译文] RTOS/TM4C1294NCPDT:多个 UART

Guru**** 2481065 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/701136/rtos-tm4c1294ncpdt-multiple-uart

器件型号:TM4C1294NCPDT

工具/软件:TI-RTOS

要正确执行该操作、我需要执行该操作  

/*!
*@def EK_TM4C1294XL_UARTName
*@EK_TM4C1294XL 开发板上 UART 的简要枚举
*/
typedef enum EK_TM4C1294XL_UARTName{
EK_TM4C1294XL_UART0 = 0、
EK_TM4C1294XL_UART1 = 1、
EK_TM4C1294XL_UART2 = 2、

EK_TM4C1294XL_UARTCOUNT
}EK_TM4C1294XL_UARTName; 

和  

UARTTiva_Object uartTivaObjects[EK_TM4C1294XL_UARTCOUNT];
unsigned char uartTivaRingBuffer[EK_TM4C1294XL_UARTCOUNT][32];

// UART 配置结构*/
const UARTTIVA_HWAttrs uartaHWAtttrs[TM4C1294XL_UARTUNT_UARTRT]
{
baseAddr = UART0_BASE、
.intNum = INT_UART0、
.intPriority =(~0)、
.FlowControl = UART_FlowControl_NONE、
.ringBufPtr = uartTivaRingBuffer[0]、
.ringBufSize = sizeof (uartTivaRingBuffer[0])
}
{
baseAddr = UART1_base、
.intNum = INT_UART1、
.intPriority =(~0)、
.FlowControl = UART_FlowControl_NONE、
.ringBufPtr = uartTivaRingBuffer[0]、
.ringBufSize = sizeof (uartTivaRingBuffer[0])
}
{
baseAddr = UART2_base、
.intNum = INT_UART2、
.intPriority =(~0)、
.FlowControl = UART_FlowControl_NONE、
.ringBufPtr = uartTivaRingBuffer[0]、
.ringBufSize = sizeof (uartTivaRingBuffer[0])
}
};

const UART_Config UART_config[]={
{
.fxnTablePtr =&UARTTiva_fxnTable、
.object = uartTivaObjects[0]、
.hwAttrs =&uartTivaHWAttrs[0]
}、
{NULL、NULL、NULL}
}; 

我不确定我的操作是否正确、能否提供具有多个 UART (彼此独立)的示例代码。 我在库中找不到示例代码 来解释这一点(最完整的硬件 EK_TM4C1294XL.c/h、而不仅仅是 EVAL 板的片段版本)。  

谢谢


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

    您好 Richard、

     抱歉、 下面是您可能已经了解过的几个用于 UART 的 TI-RTOS 示例。 我们没有其他示例、如下所示。  

     但是、您可以查看其他模块(即 I2C、SSI)的多个实例是如何初始化以供参考的。 例如、如果您查看 I2C、则会发现以下代码。 I2C 的两个实例: I2C7和 I2C8在此处实例化。 您可以看到、在 i2cTivaHWAttrs 结构以及 I2C_CONFIG 结构中配置了 I2C 的两个实例。  

     现在、让我们返回 UART 初始化、您会发现在 UART_CONFIG[]结构中、您缺少 UART1和 UART2的索引1和2。  

     

    I2CTIVA_Object i2cTivaObjects[EK_TM4C129EXL_I2CCOUNT;
    
    const I2CTIVA_HWAttrs i2cTivaHWAttrs[EK_TM4C129EXL_I2CCOUNT ={
    {
    baseAddr = I2C4_base、
    .intNum = INT_I2C7、
    .intPriority =(~0)
    }、
    {
    baseAddr = I2C8_BASE、
    .intNum = INT_I2C8、
    .intPriority =(~0)
    }、
    };
    
    const I2C_Config I2C_CONFIG[]={
    {
    fxnTablePtr =&I2CTiva_fxnTable、
    .object =&i2cTivaObjects[0]、
    hwAttrs =&i2cTivaHWAttrs[0]
    }、
    {
    fxnTablePtr =&I2CTiva_fxnTable、
    .object =&i2cTivaObjects[1]、
    hwAttrs =&i2cTivaHWAttrs[1]
    }、
    {NULL、NULL、NULL}
    }; 

    您还需要为它们的 ringBufPtr 和.ringBufSize 修复 UART1和 UART2的索引。  

        {
            .baseAddr = UART1_BASE,
            .intNum = INT_UART1,
            .intPriority = (~0),
            .flowControl = UART_FLOWCONTROL_NONE,
            .ringBufPtr  = uartTivaRingBuffer[1],
            .ringBufSize = sizeof(uartTivaRingBuffer[1])
        }
        {
            .baseAddr = UART2_BASE,
            .intNum = INT_UART2,
            .intPriority = (~0),
            .flowControl = UART_FLOWCONTROL_NONE,
            .ringBufPtr  = uartTivaRingBuffer[2],
            .ringBufSize = sizeof(uartTivaRingBuffer[2])
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    实际上、我在 CC2642R1代码示例中找到了具有两个 UART 实现的解决方案、然后我了解他们是如何实现的、并提出了该解决方案

    typedef 枚举 EK_TM4C1294XL_UARTName{
    EK_TM4C1294XL_UART0 = 0、
    EK_TM4C1294XL_UART2 = 1、 //添加了20/6/18
    EK_TM4C1294XL_UART7 = 2、 //添加了20/6/18
    
    EK_TM4C1294XL_UARTCOUNT
    }EK_TM4C1294XL_UARTName;
    
    #include 
    
    UARTTiva_Object uartTivaObjects[EK_TM4C1294XL_UARTCOUNT];
    unsigned char uartTivaRingBuffer[EK_TM4C1294XL_UARTCOUNT][32];
    
    // UART 配置结构*/
    const UARTTIVA_HWAttrs uartaHWAtttrs[TM4C1294XL_UARTUNT_UARTRT]
    {
    baseAddr = UART0_BASE、
    .intNum = INT_UART0、
    .intPriority =(~0)、
    .FlowControl = UART_FlowControl_NONE、
    .ringBufPtr = uartTivaRingBuffer[EK_TM4C1294XL_UART0]、
    .ringBufSize = sizeof (uartTivaRingBuffer[EK_TM4C1294XL_UART0])
    }、
    {
    baseAddr = UART2_base、
    .intNum = INT_UART2、
    .intPriority =(~0)、
    .FlowControl = UART_FlowControl_NONE、
    .ringBufPtr = uartTivaRingBuffer[EK_TM4C1294XL_UART2]、
    .ringBufSize = sizeof (uartTivaRingBuffer[EK_TM4C1294XL_UART2])
    }、
    {
    baseAddr = UART7_BASE、
    .intNum = INT_UART7、
    .intPriority =(~0)、
    .FlowControl = UART_FlowControl_NONE、
    .ringBufPtr = uartTivaRingBuffer[EK_TM4C1294XL_UART7]、
    .ringBufSize = sizeof (uartTivaRingBuffer[EK_TM4C1294XL_UART7])
    }
    };
    
    const UART_Config UART_CONFIG[EK_TM4C1294XL_UARTCOUNT]={
    {
    .fxnTablePtr =&UARTTiva_fxnTable、
    .object = uartTivaObjects[EK_TM4C1294XL_UART0]、
    hwAttrs = uartTivaHWAttrs[EK_TM4C1294XL_UART0]
    }、
    {
    .fxnTablePtr =&UARTTiva_fxnTable、
    .object = uartTivaObjects[EK_TM4C1294XL_UART2]、
    hwAttrs = uartTivaHWAttrs[EK_TM4C1294XL_UART2]
    }、
    {
    .fxnTablePtr =&UARTTiva_fxnTable、
    .object = uartTivaObjects[EK_TM4C1294XL_UART7]、
    hwAttrs =&uartTivaHWAttrs[EK_TM4C1294XL_UART7]
    }
    //、{NULL、NULL、NULL}
    }; 

    我刚刚了解到、在 NXP LPCxxxx 中、我认为也是 CC26xx 中、它们有一整套代表所有可用外设的库。 我们为远超评估板的应用产品编写数据、我发现奇怪(令人惊讶)的是、没有完整的设置来表示给定 TM4C 器件的所有可用外设。 我的意思是编译器会以一种间接的方式删除库中未使用的部分。