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.

[参考译文] TMS320F280040C-Q1:关于 MemCfg_getInitStatus 函数的问题

Guru**** 2445440 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1526479/tms320f280040c-q1-the-question-about-memcfg_getinitstatus-function

器件型号:TMS320F280040C-Q1
主题:C2000WARE 中讨论的其他器件

工具/软件:

你(们)好

我想 针对位于 C2000ware 的 driverlib 路径中的 F280040C-Q、测试 memcfg.h 中的 MemCfg_getInitStatus 函数

有一点让我感到困惑:

这是  INITDONE 标志 :μ s 的判断结果

   (HWREG (MEMCG_BASE + MEMCG_O_LSXINITDONE)==
        MEMCFG_sect_LSX_ALL)

我认为正确的方法是

   (HWREG (MEMCG_BASE + MEMCG_O_LSXINITDONE)==
        MEMCFG_sect_LSX_ALL & MEMCG_sect_type_mask)、以获得 LSXINITDONE 寄存器的低 8 位。

由于 MEMCFG_sect_LSX_ALL = 0x010000FFU、

但是、 LSXINITDONE 的寄存器仅适用于低 8 位、设置为 0x0000000FF。

//*****************************************************************************
//
// MemCfg_getInitStatus
//
//*****************************************************************************
bool
MemCfg_getInitStatus(uint32_t ramSections)
{
    uint32_t status;

    //
    // Check the arguments.
    //
    ASSERT(((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_D)   ||
           ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_LS)  ||
           ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_GS)  ||
           ((ramSections & MEMCFG_SECT_TYPE_MASK) == MEMCFG_SECT_TYPE_MSG) ||
           (ramSections == MEMCFG_SECT_ALL));

    //
    // Read registers containing the initialization complete status.
    //
    switch(ramSections & MEMCFG_SECT_TYPE_MASK)
    {
        case MEMCFG_SECT_TYPE_D:
            status = HWREG(MEMCFG_BASE + MEMCFG_O_DXINITDONE);
            break;

        case MEMCFG_SECT_TYPE_LS:
            status = HWREG(MEMCFG_BASE + MEMCFG_O_LSXINITDONE);
            break;

        case MEMCFG_SECT_TYPE_GS:
            status = HWREG(MEMCFG_BASE + MEMCFG_O_GSXINITDONE);
            break;

        case MEMCFG_SECT_TYPE_MSG:
            status = HWREG(MEMCFG_BASE + MEMCFG_O_MSGXINITDONE);
            break;

        case MEMCFG_SECT_TYPE_MASK:
            //
            // Return the overall status.
            //
            if((HWREG(MEMCFG_BASE + MEMCFG_O_DXINITDONE) ==
                MEMCFG_SECT_DX_ALL) &&
               (HWREG(MEMCFG_BASE + MEMCFG_O_LSXINITDONE) ==
                MEMCFG_SECT_LSX_ALL) &&
               (HWREG(MEMCFG_BASE + MEMCFG_O_GSXINITDONE) ==
                MEMCFG_SECT_GSX_ALL) &&
               (HWREG(MEMCFG_BASE + MEMCFG_O_MSGXINITDONE) ==
                MEMCFG_SECT_MSGX_ALL))
            {
                status = MEMCFG_SECT_NUM_MASK;
            }
            else
            {
                status = 0U;
            }
            break;

        default:
            //
            // Invalid ramSections. Make sure you aren't OR-ing values for two
            // different types of RAM.
            //
            status = 0U;
            break;
    }

    return((ramSections & status) == (ramSections & MEMCFG_SECT_NUM_MASK));
}

此致

箭头

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

    您好箭头、

    是的、您是对的、写入仅发生在起始 8 位上。 其他位处于保留状态。 对这些保留位的任何写入都将被忽略。

    它将在 MEMCFG_sect_type_MASK:case 的 if 条件下失败。

    我将创建一个 JIRA 来跟踪此情况、并将在下一个版本中更新 TI。

    谢谢

    Aswin

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

    您好箭头、

    它应该是  (HWREG (MEMCFG_BASE + MEMCFG_O_LSXINITDONE)==
            MEMCFG_sect_LSX_ALL &  MEMCFG_sect_NUM_MASK )

    AS  MEMCFG_sect_type_MASK =   0xFF000000U

       MEMCFG_sect_NUM_MASK   0x00FFFFFFU、
    因为我们只对前 8 位以外的位感兴趣。
    如果您有任何困惑、现在让我来谈谈。
    谢谢
    Aswin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Aswin

    现在对我来说很清楚了。

    此致

    箭头

    MEMCFG_O_LSXINITDONE