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.

TMS320F28377D: CPU1启动CPU2

Part Number: TMS320F28377D
Other Parts Discussed in Thread: CONTROLSUITE, C2000WARE

我使用28375D想通过CPU1去启动CPU2,目前双核程序都下载到各自的RAM中,CPU1知行了 IPCBootCPU2(C1C2_BROM_BOOTMODE_BOOT_FROM_RAM); 发出从RAM启动CPU2的命令,同时也使能CPU1 INT0中断但CPU1一直循环再下面的查询程序中:

do
{
bootStatus = IPCGetBootStatus() & 0x0000000F;
} while ((bootStatus != C2_BOOTROM_BOOTSTS_SYSTEM_READY));

看这句话的意思是从CPU2读取boot状态  但是读取过来的数据一直是个0            这里我不太明白,此时CPU2还没有运行到main函数中,这个boot状态寄存器CPU2是怎么写进去的?    CPU1读取这个状态赋值给这个变量bootStatus一直是零没有变化CPU2也应该没启动。

我想请教一下,双核启动这么处理是否正确,是不是还有什么设置我没有使能?如何处理CPU1和CPU2的初始化。谢谢!

  • uint32_t
    IPCGetBootStatus (void)
    {

    return(IpcRegs.IPCBOOTSTS);

    }

    上面这个函数读取IPCBOOTS寄存器,BOOTSTS  This register is used by CPU2 to pass the boot Status to CPU1. The
    data format is software-defined. It can only be written by CPU2. Reset type: CPU2.SYSRSn 。

    我想请教对BOOTSTS寄存器的改写在哪部分程序中?

  • 您好,您的代码来源于哪个例程?

  • 你好,这个程序在标准库中  F2837xD_Ipc_Driver_Util.c  这个文件中,谢谢

  • 您使用的是哪个例程呢?我看一下

  • 你好,下面这个例程,麻烦您看看

    controlSUITE\device_support\F2837xD\v210\F2837xD_examples_Dual\cla_iir2p2z  

  • 好的,我需要一些时间来查看。我会尽快回复您的

  • 你好,一直没有回复啊?

  • 非常抱歉!之前漏掉了。我下周二之前肯定会回复您。非常抱歉!

  • 您好。

    RAM(DEBUG)模式下的调试流程:

    首先应该注意,cpu1和cpu2的程序应该都被导入到CCS workspace中并最好分别编译一下,

    build configuration:

    CPU1:CPU1_RAM_DEBUG

    CPU2:CPU2_RAM

    然后,

    默认是这样配置的,可以看到CPU2加载的也是CPU1的程序!:


    如果使用这种配置debug:

    CPU2运行起来看一下:

    不出所料,两个CPU加载的确实都是CPU1的程序。这个时候在CPU2的程序中打断点,是没有办法设置成功的(因为它根本没有被调试器加载):


    按如下更改:

    加载正确!

    ****************************************************************************************

    针对您的具体问题,我的上述配置中build configuration都是RAM(DEBUG),看样子您使用的是FLASH(STANDALONE)。在这个模式下这些代码会被加入编译:

    如果按照例程中设计的来的话,您还需要修改BOOT相关的寄存器(或相应的RAM上的值)来使用相关的BOOT模式。

    例程中使用的是BOOT_FROM_FLASH,下面的状态机没有相关配置,因为这个配置是默认配置,如果不使用状态机中列出的BOOT模式的话,就从FLASH BOOT。

    您需要在CPU2的程序中增加写入IPCBOOTSTS的代码来解除CPU1的阻塞。

    另外需要注意的是,IPC模块中的寄存器、内存,它们的名字只是名义上的,实际含义完全取决于软件上的定义(用户定义)。

    controlsuite是之前C2000的SDK,目前已经停止更新。现在更推荐您使用C2000ware。

    建议您如果要看哪个模块的例程,就挑一个专门使用这个模块的例程,不要去选综合性比较强的,这样精力会更加集中。

    最后再次向您表示歉意。

    如果您有疑问的话欢迎随时向我们寻求帮助