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:如何使用 F28388芯片实现双核离线运行

Guru**** 2562120 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1238797/tms320f28388d-how-to-achieve-dual-core-offline-operation-with-f28388-chip

器件型号:TMS320F28388D

您好:

   我用 F28388D 芯片(用一个自己开发的电路板)分别在 CPU1和 CPU2上实现不同的功能(工作不同的 LED 灯)。 使用仿真器时、CPU1和 CPU2功能正常运行。 但是将程序刻录到芯片上、移除仿真器、然后重新上电、CPU1和 CPU2无法正常运行。  

CPU1和 CPU2程序如下。 您能帮助了解一下有什么问题吗?

CPU1:

空 main (void)
{
   //
// 步骤  1. 初始化 系统 控制:
// PLL、 看门狗、 启用 外设 时钟
// 此 示例 函数  位于   f2838x_sysctrl.c 文件中。
//
    InitSysCtrl();
    EALLOW;
    ClkCfgRegs.PERCLKDIVSEL.bit.EPWMCLKDIV = 0; // PWM时钟为200M
    EDIS;

    while ( !(  MemCfgRegs.GSxMSEL.bit.MSEL_GS8 和
               MemCfgRegs.GSxMSEL.bit.MSEL_GS9 & \
               MemCfgRegs.GSxMSEL.bit.MSEL_GS10 & \
               MemCfgRegs.GSxMSEL.bit.MSEL_GS11 & \
               MemCfgRegs.GSxMSEL.bit.MSEL_GS12 & \
               MemCfgRegs.GSxMSEL.bit.MSEL_GS13 & \
               MemCfgRegs.GSxMSEL.bit.MSEL_GS14 和 \
               MemCfgRegs.GSxMSEL.bit.MSEL_GS15 )   
   {
          EALLOW;
          MemCfgRegs.GSxMSEL.bit.MSEL_GS8 = 1;
          MemCfgRegs.GSxMSEL.bit.MSEL_GS9 = 1;
          MemCfgRegs.GSxMSEL.bit.MSEL_GS10 = 1;
          MemCfgRegs.GSxMSEL.bit.MSEL_GS11 = 1;
          MemCfgRegs.GSxMSEL.bit.MSEL_GS12 = 1;
          MemCfgRegs.GSxMSEL.bit.MSEL_GS13 = 1;
          MemCfgRegs.GSxMSEL.bit.MSEL_GS14 = 1;
          MemCfgRegs.GSxMSEL.bit.MSEL_GS15 = 1;
          EDIS;
   }

    InitGpio();
    Dint;
    InitPieCtrl();

//
// 禁用 CPU 中断 并 清除 所有 CPU 中断 标志:
//
    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();

       CM_Device_Init ();     // CM外设初始化
       CPU2_Device_Init ();    //μ CPU2外设初始化

       GPIO_SetupPinMux (32、 0、0 );
       GPIO_SetupPinOptions (32、 1、 0);
       GPIO_WritePin (32、 0);

       GPIO_SetupPinMux (17、 0、 0);
       GPIO_SetupPinOptions (17、 1、 0);
       GPIO_WritePin (17、 0);

       GpioDataRegs.GPBSET.bit.GPIO32=1;     //

#ifdef _flash
    uint32_t cnt=0 ;
    while (cn<5)
    {
        DELAY_US (1000000);
        GPIO_WritePin (17、 1);
        DELAY_US (1000000);
        GPIO_WritePin (17、 0);
        CNT++;
    }
    //  Device_bootCM (bootmode_boot_to_flash_SECTOR0);
    DEVICE_BOOTCPU2 (BOOTMODE_BOOT_TO_FLASH_SECTOR0);
#else
   // Device_bootCM (BOOTMODE_BOOT_TO_S0RAM);
#endif

   EINT;
   ERTM;

   while (1)
   {
       DELAY_US (3000000);
       GPIO_WritePin (17、 1);
       DELAY_US (3000000);
       GPIO_WritePin (17、 0);
       CNT++;
   }

CPU2:

空 main (void)
{
    G_softRunerrNo = 0;
    G_ipcCpu21Isr0Cnt = 0;
    G_ipcCpu2CmIsr0Cnt = 0;
    //
    // 初始化 设备 时钟 和 外设
    //
    device_init();



    for (;;)
        {
            //
            //  打开 LED
            //
            GPIO_writePin (16U、 0);

            //
            // 延迟  一个 位。
            //
            device_delay_us (500000);

            //
            //  关闭 LED
            //
            GPIO_writePin (16U、 1);

            //
            // 延迟  一个 位。
            //
            device_delay_us (500000);
        }

我发现

1 μ s 在、仿真器的情况下运行时、CPU1在 bootCPU2的位置运行到 Device_(bootmode_boot.to-flash_SECTOR0)、CPU1重新启动。

2、如果我删除了 Device_bootCPU2 (bootmode_boot_to_flash_SECTOR0)函数,让 CPU1正常工作、则 CPU1可以 成功离线。