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.

[参考译文] TMS320F28378D:从闪存双 CPU 启动

Guru**** 2513185 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/822419/tms320f28378d-dual-cpu-startup-from-flash

器件型号:TMS320F28378D

我在微控制器上闪存了两个 CPU、以便在独立操作中引导。  当微控制器上电后、所需的结果是让两个 CPU 启动并开始运行。  但是、有时在下电上电后、微控制器似乎不会开始执行。  有时、它会开始执行。  我使用 IPC 来确保 CPU1已初始化并启动内部 ADC、以便 CPU2可以从寄存器中读取。

以下是主代码中 CPU1的内容:

InitSysCtrl();

InitFlash();



//为 GS0/GS14 SARAM 提供对 CPU02的内存访问
//
while (!((MemCfgRegs.GSxMSEL.bit.MSEL_GS0和 MemCfgRegs.GSxMSEL.bit.MSEL_GS14)))
{
EALLOW;
MemCfgRegs.GSxMSEL.bit.MSEL_GS0 = 1;
MemCfgRegs.GSxMSEL.bit.MSEL_GS14 = 1;
EDIS;
}

IPCBootCPU2 (C1C2_Brom_BOOTMODE_BOOT_FROM _FLASH);

device_init();
InitCpuTimer();
//步骤2. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;

//将 PIE 控制寄存器初始化为默认状态。
//默认状态是禁用所有 PIE 中断并
清除标志//。
InitPieCtrl();

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

//使用指向 shell 中断
//服务例程(ISR )的指针初始化 PIE 矢量表。
//这将填充整个表,即使在
本示例中未使用中断//也是如此。 这对于调试很有用。
InitPieVectTable();

//在此处启用所需的 GPIO 输入和输出。 参考 gpio.c 获取指南(从编译中排除文件)
DEVICE_initGPIO();

//让 CPU2知道内部 ADC 已初始化并正在运行
HWREG (IPC_BASE + IPC_O_SET)= 1UL << IPC_ADC_READY;

//等待 CPU2返回
while ((HWREG (IPC_BASE + IPC_O_STS)&(1UL << IPC_GPIO_READY)))
{
}

以下是 CPU2主代码中的内容:

//将时间关键代码和闪存设置代码复制到 RAM
//这包括 InitFlash()、闪存 API 函数和任何函数
//分配给 ramfuncs 段。
// RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart
//符号由链接器创建。 请参阅器件.cmd 文件。
//
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif

InitSysCtrl();
InitFlash();

IpcRegs.IPCBOOTSTS = C2_BootROM_BOOTSTS_SYSTEM_READY;

//
//初始化设备时钟和外设
//
// Device_init ();

//
//初始化 GPIO 并将 GPIO 引脚配置为推挽输出
//
DEVICE_initGPIO();

//
//清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断
//
interrupt_initModule();

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//
interrupt_initVectorTable();



//
//启用全局中断(INTM)和实时中断(DBGM)
//
EINT;
ERTM;

InitCpuTimer();

//等待共享 RAM 可用。
while ((HWREGH (MEMCFG_base + MEMCFG_O_GSXMSEL)和
(MEMCFG_GSXMSEL_MSEL_GS14 | MEMCFG_GSXMSEL_MSEL_GS15)= 0U)
{
}

//
//等待 CPU1初始化 ADC
//
while (!(HWREG (IPC_BASE + IPC_O_STS)&(1UL << IPC_ADC_READY)))
{
}

//
//确认 CPU2的 IPC 标志17
//
HWREG (IPC_BASE + IPC_O_ACK)= 1UL << IPC_ADC_READY;
HWREG (IPC_BASE + IPC_O_CLR)= 1UL << IPC_GPIO_READY; 

如何确保在下电上电后、两个 CPU 开始执行?

谢谢!

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

    另外需要注意的是、如果微控制器在对器件进行下电上电后不能重新启动、那么按下复位按钮可以可靠地启动两个 CPU 的执行。

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

    Curtis、

    当 CPU 似乎没有启动您的应用程序代码时、您是否尝试连接到 CPU 卡住的器件? 如果您尚未尝试、这是您的第一件事。

    此致、

    曼诺伊

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

    Manoj、

    当您说连接到器件时、是否意味着运行调试器?  如果从调试器启动、或者使用 LaunchPad 上的复位按钮对其进行了复位、则始终有效。  如果已重新上电、它不会始终正确启动。  如果工作正常、它应该在 CAN 上输出消息、但不会。

    谢谢、

    Curtis

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

    Curtis、

    不、我不要求您在连接了仿真器的情况下运行。 我希望您禁用 GEL 文件并连接到器件。 然后、您可以加载 COFF 文件的符号、以了解您的 PC 卡在何处。

    此致、

    曼诺伊

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

    Manoj、

    感谢您的澄清。  我不确定我是否能正确执行该操作。  在 CCS 9.0.1.00004中、我已单击"调试"按钮以连接到器件。  然后、我在 GEL Files 视图中查看两个 CPU 的 GEL 文件并将其删除。  然后我转到“Run->Load->Load Symbols for Both CPUs”。  之后、我单击两个 CPU 的运行按钮。  是这样吗?  正确的步骤是什么?

    谢谢、

    Curtis

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

    Curtis、

    1) 1)以独立模式运行器件并重新创建问题。

    2) 2)删除 CPU1和 CPU2中的 GEL 文件

    3) 3)连接到器件并加载 COFF 文件的符号。 (请勿加载程序。 只需加载符号)

    注意:请确保您不运行代码。

    此致、

    曼诺伊

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

    Manoj、

    通过连接和加载符号、我能够确定问题是什么。  我可以看到程序计数器似乎在哪里循环、但我无法转到反汇编器来查看该位置周围发生的情况。  这是因为 GUI 不允许我键入地址来搜索反汇编代码、并且 PC 地址非常高、可以从0x0一直滚动到。  步骤3后、连接显示代码正在运行、因此我暂停了操作。 这使我转到了在 C 和汇编语言中循环的函数。  我不确定我是否做了正确的操作、但它允许我解决问题。

    再次感谢!

    Curtis