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:CPU2 程序从闪存运行时出现问题

Guru**** 2609895 points
Other Parts Discussed in Thread: TMS320F28388D

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1580460/tms320f28388d-problem-cpu2-program-running-from-flash

器件型号:TMS320F28388D


您好:

我遇到了与从 TMS320F28388D 上的闪存在 CPU2 上运行程序相关的问题。  

我的项目是一个多核项目。 从 RAM 运行时、我的程序运行良好。 但从闪存运行时、好像我不控制 CPU2 上的 GPIO。

CPU1 的流程为:

- InitSysCtrl

-从闪存引导 CPU2

-初始化 CPU1 (PIE VECT、GPIO...)

-指示 CPU2 使用 IPC 进行初始化并等待 CPU2 结束初始化

CPU2 的流程如下:

-等待 CPU1 通知开始初始化

-初始化 (PIE VECT/CLA/DMA) 并告诉 CPU1 使用 IPC 结束初始化

当我从 RAM 在 CPU2 上运行程序时、我可以看到 IO 调试 6 闪烁、但当我从闪存运行程序时、它没有运行、因为我没有看到 LED 闪烁。 就像我不控制 GPIO。 但我在 ConfigGpio () 函数中正确管理 GPIO 的所有权。

请注意、DMA 正在将数据从 CLA.CPU2 存储器传输到 GS15。 和数据正确、因此程序的这一部分在闪存中运行良好。

我附加 CPU1 和 CPU2 的两个 main.c。

有什么想法来解决我的问题? (我给您发送一条消息,因为我无法在论坛上发布)。

谢谢您、

Adrien

main.c 

main.c 

 

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

    您好、

    您能否确认您的代码是否已加载到闪存中? 您能否检查地图文件并确认?

    此致、

    Rajeshwary

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

    嗨、Rajeshwary、

    我刚才检查了.map 文件、CPU2 的程序已加载到闪存中。 从 0x80002(闪存 1)开始、其长度为 0xca7。

    当我把它放在 RAM 中时、我没有任何问题。

    我有一个程序在 CPU2.CLA 上运行、并使用 DMA 将数据传输到 CPU1、即使程序位于闪存中、该程序也能正常运行。

    问题似乎仅影响 CPU2。 在 CPU2 上、我 使 LED 闪烁、当它在 RAM 中但在闪存中时运行良好、使用 I2C 模块。

    好像当我从闪存引导 CPU2 时、GPIO 和 I2C 模块的配置会被覆盖。 但在我的初始化序列中、我使用 IPC 模块的标志来同步两个内核、并按照过程进行操作。

    感谢您提供更多建议、

    此致、

    Adrien

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

    您好、  

    您的代码已正确加载,问题是您尝试执行或调试代码。 我的理解是正确的吗?

    此致、

    Rajeshwary

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

    您好、

    正确、它已正确加载。

    问题是当我从闪存执行代码=>代码时、它对应于“独立引导流程“(图 5.3 TRM)。

    我正在考虑 2 个可能的问题:

    • 从闪存执行时、CPU2 的程序无法正确启动
    • CPU2 的程序正在启动、但

    我有以下引导过程:

    • CPU1 从闪存地址 0x080000 开始、作为引导引脚 GPIO72 = 1 且 GPIO84 = 1
    • 它执行 codestart 段(通用文件 f2838x_codestartbranch.asm)并跳转到调用 main 函数的通用函数_c_int00
    • CPU1 的 main =>我调用通用函数 InitSysCtrl () 来初始化闪存、PLL……)
    • 然后引导 CPU2
      • 将 CPU1TOCPU2IPCBOOTMODE 配置为 BOOT_TO_FLASH_SECTOR0(因此地址为 0x080000、其中 codestart 段驻留)
      • 设置 IPCFLG0 以将 CPU2 分支到应用程序

    在 CPU2 的 main 中、我使 LA LED 闪烁、但不闪烁。

    当我使用 debbuger 时,我没有这个问题,我执行以下过程:

    • 启动调试会话、使 CPU1 在 main () 的第一条指令处停止
    • 连接 CPU2
    • 在 CPU2 的 RAM 中加载程序
    • 执行 CPU2(因此 CPU2 上的程序正在运行、但正在等待 CPU1 设置、因为我使用 IPC 标志对两个内核的引导过程进行排序)
    • 然后执行 CPU1
    • =>我可以看到 LED-通过 CPU2 闪烁进行管理

    此致、

    Adrien

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

    更多详细信息、请参阅反思:

    •  在没有调试器的情况下从闪存引导时、CPU2.CLA 和 CPU2.DMA 工作正常。 这表示引导过程正确、处理器 CPU2 执行主程序。 否则、它将不起作用。 因此、我认为问题更多地与外设配置有关。

    如果你看看我的第一篇文章的 main_cpu02.c。 Timer1 的配置可能会被覆盖或类似的配置。

    计时器是否在两个内核之间共享? 我将尝试切换 GPIO、以确保它不来自计时器。

    Adrien

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

    好的、我刚刚解决了这个问题。  

    在我的程序中、CPU2 初始化结束时、CPU2 设置标志 IPC、并使用 while(!Cpu2toCpu1IpcRegs.CPU2TOCPU1IPCFLG.bit.ipcX)等待此标志有效发挥作用。

    另一方面、CPU1 通过执行 while(!Cpu1toCpu2IpcRegs.CPU2TOCPU1IPCSTS.bit.ipcX)等待 CPU2 的初始化结束、当 设置此状态时、它会确认 执行  Cpu1toCpu2IpcRegs.CPU1TOCPU2IPCACk.bit.ipcX、并在 CPU2 一侧清除标志。

    CPU1 速度太快、无法确认标志、而 CPU2 在  while(!Cpu2toCpu1IpcRegs.CPU2TOCPU1IPCFLG.bit.ipcX)中阻塞。

    要修复此问题、我只需在 while(!Cpu1toCpu2IpcRegs.CPU2TOCPU1IPCSTS.bit.ipcX)后添加一个延迟  、使 CPU2 获取 while(!Cpu2toCpu1IpcRegs.CPU2TOCPU1IPCFLG.bit.ipcX)。

    现在、它运行良好。 我不知道为什么、但当我使用调试器并在 RAM 中执行相同的操作时、我没有看到这个问题。

    感谢您的帮助、

    Adrien