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:TMS320F28388D IPC 消息复制到 RAM 引导模式

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1643632/tms320f28388d-tms320f28388d-ipc-message-copy-to-ram-boot-mode

器件型号: TMS320F28388D

我在通过 IPC 消息复制到 RAM 引导模式引导 CM 时遇到问题。

 

我做了一个在 CM 上运行的基本测试程序、用于将矢量表偏移量设置为 RAM 矢量表、然后设置一个 inifinite while 循环。 该程序通过 CCS 调试器工作、但在我尝试通过 CPU1 的 IPC MSGRAM 加载该程序时不工作。

 

我在非保留 S0 RAM (0x20000800-20000807) 的开头为 RESETISR 保留了一个 8 字节区域、该区域是 startup_cm.c 中使用的引导至 RAM 入口点 引导加载程序的其余部分遵循、限制为 2000 字节(1000 字)。

 

我使用类似的过程来保留存储器、写入 IPC MSGRAM 和 CPU2 引导、并确保在更复杂的程序下正常运行。 但是、我遇到 CM 问题、每当我尝试将引导加载程序加载到 IPC MSGRAM 中时、似乎会陷入硬故障。 我可以在 CPU1 和 CM 的 MSGRAM1 上看到相同的内容、但在 CM 的 S0 RAM 中看不到任何内容(它只是全为 0)。

 

这种引导模式是否需要特殊格式或标头? 是否应在引导映像中包含 RESETISR? 我还缺少其他东西吗?

 

谢谢你。

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

    尊敬的 Tyler:

    检查地址处的 CM 引导状态寄存器 0x2000 0000 (也镜像到 CMTOCPU1IPCBOOTSTS 中)。 位字段将准确地告诉您失败的原因:

    含义
    31.
    引导 ROM 完成运行
    23
    发生硬故障
    19
    CPU1TOCMIPCBOOTMODE 中的长度无效
    18
    CPU1TOCMIPCBOOTMODE 中的配置无效/缺失
    7:0
    当前引导状态 (0x4 =运行 IPC 复制、0x8 =等待 CPU1TOCMIPCFLG0)

    您可能缺少关键要求

    CPU1TOCMIPCBOOTMODE 寄存器格式

    该寄存器必须按如下方式配置:

    • 位 31:24(密钥): 必须为 0x5A
    • 位 19:16(复制长度): 0x10xA (100 至 1000 个字)。 引导加载程序的地址、请使用 0xA
    • 位 15:8(CM 频率): CM 时钟(以 MHz 为单位)(例如,用于 125MHz) 0x7D
    • 位 7:0(引导模式): 必须 0x0C 用于将 IPC 消息 RAM 复制到 S0RAM

    2. 0x20000800 处的矢量表结构

    这很关键、与 CPU2 不同。 CM 是一个 Cortex-M 内核、因此在地址 0x20000800 处需要合适的 ARM 矢量表 、而不仅仅是 ResetISR 函数代码:

    • 字 0 (0x20000800): 初始栈指针值
    • 字 1 (0x20000804): 重置处理程序地址(您的入口点)

    您提到了为 RESETISR 保留 8 个字节。 您需要确保这 8 个字节包含 矢量表条目 (SP +复位地址)、而不是函数体本身。

    3. Thumb Mode 位(必须设置 LSB)

    对于 Cortex-M 内核、所有函数指针和分支目标 必须将位 0 设置为 1 以指示 Thumb 模式。 如果引导程序表中的重置处理程序地址为 0x20000808、则必须将其存储为 0x20000809。 未能设置该位会导致立即出现硬故障。

    4.将字节从 C28x 打包到 CM

    由于 C28x 没有本机 8uint8_t 位类型(实际上是 16 位)、因此 在写入 IPC MSGRAM 时必须将两个字节打包到每个 16 位字中:

    for (int i = 0;i < raw_bytes_len;i += 2){
    PACKED_BYTES[I/2]= RAW_BYTES[i]+(256 * RAW_BYTES[i+1]);
    }

    如果未能正确打包、则会导致消息 RAM 中的数据损坏并导致 CM 出现硬故障。

    建议的调试步骤

    1. 读取上的引导状态寄存器 0x2000 0000 以确认是否正在尝试复制
    2. 验证 CPU1TOCMIPCBOOTMODE 寄存器的 KEY = 0x5A、MODE = 0x0C 以及有效长度
    3. 确保 CPU1 设置 CPU1TOCMIPCFLG0 以允许 CM 开始引导
    4. 确认位于 0x20000800 处的矢量表具有有效的 SP 和 Thumb 模式复位地址 (LSB=1)
    5. 从 CPU1 写入 MSGRAM 时验证字节打包

    谢谢、

    IRA

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

    尊敬的 Ira:

    感谢您的答复。 我能够让 CPU1 启动 CM。

    对于任何想知道问题是什么的人来说、您需要上面提到的矢量表结构。 此外、您不能使用 for 循环直接复制到 IPC MSGRAM 中、但必须在存储器中声明链接到 CPU1 的 CPU1CMIPCMSGRAM1 的段。 必须将 C 数组直接放置在该段中。 有关更多详细信息、请参阅示例代码 flash_kernel_c28x_cm_ex1。