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.

[参考译文] TMS320F28379D:使用在 CPU2和 IPC#39上进行闪存引导

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1045870/tms320f28379d-flash-boot-on-cpu2-and-ipc-s-using

器件型号:TMS320F28379D
主题中讨论的其他器件:C2000WARE

您好!

在我的软件中、我想使用 CPU1和 CPU2。 每个内核之间的定序由 IPC 标志驱动。 每个内核的程序被加载到闪存上。

在我的测试过程中,我尝试了许多情况:  

  • 如果我只加载 CPU1 (并删除 IPC 标志)、则在 MCU 重新启动(电源关闭然后打开)后、程序重新启动正确。

  • 如果我在 CPU1中加载空程序(无 IPC 标志)、在 CPU2中加载简单的 LED 闪烁、则程序在重启(LED 闪烁)后正确重新启动。

  • 如果我用自己的程序(以及使用的 IPC)加载 CPU1和 CPU2、它会在编程后直接工作、但在重新启动后不工作。

  • 我尝试在 CPU1程序中添加这一行代码,但在对两个 CPU 进行编程后它不能直接工作:  

                      IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH)


你有什么想法吗? 重启后、我怀疑 IPC 有问题、但很奇怪。

感谢您的反馈。

此致、

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

    ED、

    您是否尝试过 IPC DriverLib 示例并选择构建配置 CPU1_FLASH、CPU2_FLASH?

    C:/ti/c2000/C2000Ware_3_04_00_00/driverlib/f2837xd/examples/dual/ipc

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

    您好 Santosh、

    它与以下软件是否相同: C:\ti\c2000\C2000Ware_3_02_00_00\device_support\f2837xd\examples\dual\IPC_GPIO_toggle

    我无法尝试您的示例、因为"当前未安装编译器版本'18.12.1.LTS'!"

    如何更新编译器? 如果编译器不同,它是否会更改我以前的程序上的某些内容?

    此致、

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

    ED、

    此示例与您正在运行的示例类似。 我刚刚在我的设置(F28379D controlCARD)上测试了您的示例。 看起来工作正常。 我只需要选择 CPU1_FLASH_ONstandalone 构建配置。 写入闪存后、我对电路板进行下电上电、两个 LED 都按预期切换。

    编译器版本对于该示例无关紧要。 但是、您可以安装最新的编译器并重新启动 CCS、它应该会挑选最新的编译器或在"编译设置"中手动选择。

    在您的系统中,当它不起作用时,您是否知道它在何处卡住?

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

    您好 Santosh、

    我刚刚修改了程序、只需在 CPU1上进行切换(在 CPU1上进行 LED 切换)、并在空闲引脚上对 CPU2进行切换。

    -当 CPU1编译配置为 CPU1_FLASH_DEBUG、CPU2编译配置为 CPU2_FLASH 时、程序在调试会话中工作、但当我断开 CPU1和 CPU2的连接时、它在下电上电后不工作。

    - 当 CPU1编译配置为 CPU1_FLASH_STADALONE 并且 CPU2编译配置为 CPU2_FLASH 时、程序在调试会话中不工作、但在重新引导后工作。

    这是正常操作吗? 我猜是的、所以它似乎可以正常工作。

    我的问题似乎是由于使用了多个国际化学品安全方案。 一些 IPC 由 CPU1驱动、另一些由 CPU2驱动。
    IPC 使用的常见规则是什么? 我是否需要在!while 指令之后直接确认标志?

     当我在调试模式下执行 IPC 时、我在软件中没有任何问题(因此、当我不使用 IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);指令时。
    但是、当我在闪存上引导 CPU2时、我会遇到一些问题。

    我只是向您展示一个示例,第一个在重新引导后工作,而不是第二个:  

    第一个示例,在重新引导后工作:  

    /////////////////////CPU1/////////////////////
    
    void main (void)
    {
        while(!IPCRtoLFlagBusy(IPC_FLAG17));
        IPCRtoLFlagAcknowledge(IPC_FLAG17);
        
            while(1)
        {
            functions
        }
    }
    
    __interrupt void ISR(void)
    {
        functions
        
        IPCLtoRFlagSet(IPC_FLAG4);
        
        functions
        
        PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
    }
    
    /////////////////////CPU2/////////////////////
    
    void main(void)
    {
        // ---------- Declaration ----------
        // ---------- Code ----------
        IPCLtoRFlagSet(IPC_FLAG17);
    
        while(1)
        {
            while(!IPCRtoLFlagBusy(IPC_FLAG4));
            IPCRtoLFlagAcknowledge(IPC_FLAG4);
            IPCLtoRFlagClear(IPC_FLAG4);
            
            functions
        }
    }

    第二个示例,在重新引导后无法正常工作:  

    /////////////////////CPU1/////////////////////
    
    void main (void)
    {
        while(!IPCRtoLFlagBusy(IPC_FLAG17));
        IPCRtoLFlagAcknowledge(IPC_FLAG17);
        
            while(1)
        {
            functions
        }
    }
    
    __interrupt void ISR(void)
    {
        functions
        
        IPCLtoRFlagSet(IPC_FLAG4);
        
        functions
        
        while(!IPCRtoLFlagBusy(IPC_FLAG5));         
        IPCRtoLFlagAcknowledge(IPC_FLAG5);
        IPCLtoRFlagClear(IPC_FLAG5);
        
        PieCtrlRegs.PIEACK.all |= PIEACK_GROUP1;
    }
    
    /////////////////////CPU2/////////////////////
    
    void main(void)
    {
        // ---------- Declaration ----------
        // ---------- Code ----------
        IPCLtoRFlagSet(IPC_FLAG17);
    
        while(1)
        {
            while(!IPCRtoLFlagBusy(IPC_FLAG4));
            IPCRtoLFlagAcknowledge(IPC_FLAG4);
            IPCLtoRFlagClear(IPC_FLAG4);
            
            functions
            
            IPCLtoRFlagSet(IPC_FLAG5);
        }
    }

    你有什么想法吗?

    在我的 Init 函数中(在 while (1)循环之前,我对两个 CPU 使用此指令: IpcRegs.IPCCLR.all = 0xFFFFFFFF;

    感谢您的支持。

    此致、

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

    我不确定问题是否来自 IPC 标志。 当我添加 指令   IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH )时,看起来很奇怪

    此行必填吗? 如果我只在 CPU2预定义 符号中添加"_flash"、为什么它不起作用?

    感谢您的支持。

    此致、

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

    尊敬的 Ed:

    要在独立模式下工作、需要添加 _standalone、后者会将此命令发送到 CPU2。

    IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);

    只需确认、您是否能够从 C2000Ware 运行示例代码?

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

    您好 Santosh、

    正如我在上一个帖子中所述、是的、它在独立模式下工作(但仅在重新引导后)。

    忘记我之前就国际化学品安全方案问题所作的解释,这是一个错误的问题。

    让我解释一下我今天的问题:  

    我有一个用于 CPU1的程序、一个用于 CPU2的程序、它们通过 IPC 标志在它们之间进行同步。 SPI-A 由 CPU2驱动。 CPU2在闪存上引导(使用指令  IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH); 多次重新引导后、所有操作都在"独立"模式下正常工作。

    我决定将此程序用作添加函数的基础。 我制作了这两个程序的副本。

    复制完这些程序(因此我没有做任何更改)后、我立即构建并启动了这些程序。

    -重新启动后(因此在独立模式下)、似乎 CPU2未正确驱动 SPI-A。

    -如果我删除指令  IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH); 、(这意味着 CPU1和 CPU2在调试模式下使用、在重新引导后无法正常工作)、则 SPI-A 是 CPU2正确驱动的

    你有什么想法吗? 这是一个非常奇怪的问题、我刚刚复制了我的程序、它不再工作了。

    此致、

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

    尊敬的 Ed:

    复制项目后、您是否要切换到 CPU2的 CPU_FLASH 配置? 如果是、则调用  IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH); CPU1上应正常工作。

    您可以尝试从之前的项目导入、而不是手动复制。

    除此之外,我没有其他想法。  如果您有一个更简单的项目、我可以在我的最后尝试

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

     导入项目而不是手动复制项目的方法是什么?

    此致、

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

    转至 CCS 菜单'Project -> Import Projects'

    它从原始项目中提取设置。

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

    您好、Santosh、

    感谢您的反馈。

    我有另一个链接的问题;在我的软件中,我需要在闪存中写入一些值(我为数据选择闪存 J)。

    在调试模式下、我可以在 FLASHJ 中写入新值、没有问题。
    但当我处于独立模式时、程序停止、但它链接到闪存写入。 (当我删除此函数时、程序正在运行)
    你有什么想法吗?

    此致、

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

    尊敬的 Ed:

    Santosh 让我看一下这篇文章。  由于我们已关闭此帖子的原始问题、请打开一个新帖子以解决您的闪存编程问题。

    我们会将新帖子分配给相应的专家 以帮助您。   

    谢谢、此致、

    Vamsi