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.

[参考译文] TMS320F28388D:无法重新初始化 CM RAM 扇区

Guru**** 2558250 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1248891/tms320f28388d-unable-to-re-initialize-cm-ram-sectors

器件型号:TMS320F28388D

大家好!

我想重新初始化 CM RAM 扇区(专用 RAM、共享 RAM 和 MSG RAM)。 我已经浏览了 TRM、并参考了下面所附的"41.9.1.9 RAM 初始化屏幕截图 "部分-"我了解了这可以通过 "将 INIT 寄存器中特定 RAM 块 的 INIT 位设置为‘1"来实现,应用程序必须轮询 INITDONE 位 添加该 RAM 块。 除非此位置1、否则不应访问 RAM 存储块"。

以及从图41.12.2 CM_MEMCFG_REGS 寄存器中所示的部分中、我发现了初始化和状态检查的相应寄存器偏移以及 CMMEMCFG_BASE - 0x400F_E000  

根据上述2个屏幕截图、我在代码片段下面创建:

#define CM_MEMCFG_CxLOCK        0
#define CM_MEMCFG_CxINIT        0x08
#define CM_MEMCFG_CxINITDONE    0x0C

bool is_c1_ramsector_initdone()
{
    uint8_t status1 = 0;
    status1 = (HWREG(CMMEMCFG_BASE + CM_MEMCFG_CxINITDONE) & 0x01);
    return (status1);
}

bool is_c0_ramsector_initdone()
{
    uint8_t status0 = 0;
    status0 = (HWREG(CMMEMCFG_BASE + CM_MEMCFG_CxINITDONE) & 0x00);
    return (status0);
}

void access_memcfg_ram_regs()
{
    HWREG(CMMEMCFG_BASE + CM_MEMCFG_CxLOCK) &= 0xFFFFFFFC; //unlocks write access allowed
    do
    {
        HWREG(CMMEMCFG_BASE + CM_MEMCFG_CxINIT) |= 0x01;//c0 init

    } while( !( is_c0_ramsector_initdone() ) ); //checks for the status of C0 inited or not ? -- Code is stuck in this while loop infinetely

    do
    {
        HWREG(CMMEMCFG_BASE + CM_MEMCFG_CxINIT) |= 0x02;//c1 init

    } while( !(is_c1_ramsector_initdone() ) );
}

我在 main ()中调用此函数,并在发生特定事件/从其他内核接收到命令时尝试显式调用,

根据上述代码、应配置 CxINIT 寄存器(b1为1、b0为1)、我看到它未生效。

有人能告诉我可以做些什么来实现重置或重新插入 RAM 的要求、这样就 像 POR of CM 一样。

此致、

-普拉奈

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

    更新1:

    我已经浏览了 CM 文件的.gel 文件、发现 "CM_Disable_Flash_ECC ()"和"CM_RAM_Init ()"、其中执行以下操作:

    hotmenu CM_Disable_Flash_ECC()
    {
        *(unsigned short *)0x400FA600 = 0x0;    /* Disable Flash ECC */
    }

    hotmenu CM_Ram_Init()
    {
        *(unsigned long *)0x400FE048 = 0xF;
        *(unsigned long *)0x400FE008 = 0x3;
        *(unsigned long *)0x400FE048 = 0x10;
        *(unsigned long *)0x400FE028 = 0xF;
    }

    鉴于我的要求是运行为 boot_rom、因此需要清除 RAM 部分、

    我将上述代码复制到我的工作区中、因为它与 TRM 寄存器详细信息相关联、然后我尝试执行上述函数、但我看到代码陷入了循环中。

    我在复制下面的工作区代码:

        *(unsigned short *)0x400FA600 = 0x0;    /* Disable Flash ECC */

        *(unsigned long *)0x400FE000 = 0x0;//CRAM lock register unlocking write access here
        *(unsigned long *)0x400FE008 = 0x3;

        *(unsigned long *)0x400FE020 = 0x0;//MSGRAM lock register unlocking write access here
        *(unsigned long *)0x400FE028 = 0xF;

        *(unsigned long *)0x400FE040 = 0x00;//SRAM and ERAM lock register unlocking write access here
        *(unsigned long *)0x400FE048 = 0x1F;

    我添加了一个4字节的全局 int 数组、根据.map 文件、该全局数组存储在 S0 RAM 中、并在调试模式下执行以下指令、我确认 S0RAM 已清除、因此全局数组在 Expressions 窗口中设置为0、 我确认上述逻辑正常工作。

    但我们看到、在调试代码中、执行上述指令后、CM 执行会滞留在某个循环中、我无法确定。 连接相应的芯片以进行进一步调试:

    1.在执行上述 RAM 前、请先清除指令:

    2.在执行上述的 RAM 后,清除指令:

    3.在执行上方 snip 中的_asm 断点后

    它显示代码卡在 0x41E8 首选。 如果我能找到相关函数来找到它被卡住的地方,我已经浏览过映射文件,但我没有找到任何相关的信息。

    如果需要、我还将附加相应的映射文件供您进一步参考

    e2e.ti.com/.../mapfile-.txt

    此外 ,我没有从 main()执行上面的 RAM 清除指令,而是尝试在 CM 完全引导后执行 RAM 清除指令。在 IPC_ISR 中,每当通过 TCP 接收到命令时,我正在执行上面的指令,然后我看到代码卡在 0x00000000 (下面的屏幕截图)并显示错误:" Cortex_M4_0:无法运行目标 CPU:(错误-1268 @ 0x1090001)器件锁定在硬故障或 NMI 中。 复位器件、然后重试此操作。 如果错误仍然存在、请确认配置、对电路板执行下电上电、和/或尝试更可靠的 JTAG 设置(例如、降低 TCLK)。 (仿真软件包9.4.0.00129)"。因此、我怀疑 RAM 正在被清除、从而处理器无法获取应返回到的返回地址、从而导致执行卡住。

    更进一步、

    根据我的实际要求、我已在 CM 引导加载程序中添加了上述 RAM 清除逻辑、该逻辑应检查复位是否是由于 WD 发生的、如果是 WD 复位、则应执行上述 RAM 清除操作。 。

    但我看到 CM 未启动、这意味着执行卡在类似的循环中。

    所以我认为我调用 RAM 清除逻辑的地方是不正确的。

    我相信我必须按照下面的要点来做:

    1. RAM 初始化、

    清除引导堆栈的 RAM、

    3.然后继续执行默认引导流程

    请纠正、否则我需要帮助来完成此操作。

     在这里、有人能帮我吗?

    谢谢。此致、

    普拉奈

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

    更新2:

    根据以下帖子、我看到如果是复位而不是 POR、则需要重新初始化 RAM。

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1076264/tms320f280049-ram-initialization-after-warm-reset

    e2e.ti.com/.../tms320f280049-ram-initialization-in-run-time-support-libraty-eabi

    根据下面的屏幕截图、BootROM 将在每次复位或 I 复位时处理必要的 RAM 清除 是不一样? 请帮我解答。

    下面的屏幕截图显示、在 WD 复位期间、闪存 ROM 将执行-"清除用于引导堆栈的 RAM"。 这是什么意思? 以及它与下面重点介绍的"RAM 初始化"有何不同。

    根据我的实际要求、我已在 CM 引导加载程序中添加了上述 RAM 清除逻辑、该逻辑应检查复位是否是由于 WD 发生的、如果是 WD 复位、则应执行上述 RAM 清除操作。 。

    但我看到 CM 未启动、这意味着执行在循环中卡住。

    所以我认为我调用 RAM 清除逻辑的地方是不正确的。

    我相信我必须按照下面的要点来做:

    1. RAM 初始化、

    清除引导堆栈的 RAM、

    3.然后继续执行默认引导流程

    请纠正、否则我需要帮助来完成此操作。

    我希望确保 WD 复位像对 CM 的 POR 一样。

    -普兰奈