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.

[参考译文] CCS/TMS320F28377D:CPU1闪存独立、CPU2闪存代码在引导 ROM 流程期间卡住[RAM &闪存执行正常]

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/778926/ccs-tms320f28377d-cpu1-flash-standalone-and-cpu2-flash-code-stuck-during-boot-rom-flow-ram-flash-execution-are-ok

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

工具/软件:Code Composer Studio

你(们)好

我偶然发现了 RAM 和闪存代码、它由仿真器启动并加载到 CPU1+CLA 和 CPU2+CLA 中、运行良好、但遗憾的是、当我以 FLASH_standalone 模式加载时、CPU1/CPU2代码卡住! 我尝试理解这种奇怪的行为、因为我加载了一个以前的闪存独立代码、这种做法效果很好。 最近、我的实际代码在维度(.cmd 链接器文件中的.text 扩展名)中进行了提升、而在 RAM 中进行了调试。 因此、我决定通过使用 GPIO 测试点运动来查找新的 CPU1闪存独立卡滞条件。 总之、我关注这个帖子

https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/735910?tisearch=e2e-sitesearch&keymatch=2837x%20CPU2%20doesn%27t%20boot

我意识到我的 C2000Ware 支持已经实现。 现在,我的代码使用了新的“F2837xD_IPC_Driver_Util.c”,而 TI 的更改很少;

我的代码中的凸极起始结构(不包括注释)为:

CPU1:

void main (void)
{
InitSysCtrl_CPU1 ();

#ifdef _standalone
#ifdef _FLASH
IPCBootCPU2 (C1C2_Brom_bootmode_boot_fin_flash);
#else
BootCPU2 (C1C2_Brom_bootmode_boot_boot_fin_RAM);
#endif


#ifdef _flash
InitFlash ();#IPCendif


Dint;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

EALLOW;
PieVectTable.ADCA1_INT =&ADCA_ISR_CPU1;
PieVectTable.ADCD1_INT =&ADCD_ISR_CPU1;
PieVectTable.TIMER0_INT =&AD7490_SPI_timer0_ISR;
PieVectTable.EPWM1_INT =&Loop_Epwm1_ISR_CPU1;
PieVectTable.CANA0_INT =&CANA0_ISR;
PieVectTable.CANB0_INT =&CANB0_ISR;

IER |= M_INT1;
IER |= M_INT3;
IER |= M_INT9;
EDIS;

PieCtrlRegs.PIEIER1.bit.INTx1 = 1;
PieCtrlRegs.PIEIER1.bit.INTx6=1;
PieCtrlRegs.PIEIER1.bit.INTx7=1;
PieCtrlRegs.PIEIER3.bit.INTx1 = 1;
PieCtrlRegs.PIEIER9.bit.INTx5 = 1;
PieCtrlRegs.PIEIER9.bit.INTx7=1;

PieCtrlRegs.PIECTRL.bit.ENPIE = 1;
PieCtrlRegs.PIEACX.ALL = 0xFFFF;

EINT;
ERTM;

//***看门狗设置***
DisableDog (); //只需在 InitSysCtrl_CPU1 ()中执行它;

System_Config_CPU1 ();

init_Vars_cpu1 ();

//在此处旋转,直至 CPU02就绪
while (IPCRtoLFlagBusy (IPC_FLAG17)=0);

//闪存独立模式中的调试代码
操作
{
DELAY_US (100);
GpioDataRegs.GPCCLEAR.bit.GPIO76 = 1;
DELAY_US (100);
GpioDataRegs.GPCSET.BIT.GPIO76 = 1;
}
while (1);//结束调试代码

//后台循环
for (;;)
…μ A

void System_Config_CPU1 (void)
{
init_gpio_cpu1 ();
Setup_PWM_CPU1 ();

EALLOW;
ClkCfgRegs.XCLKOUTDIVSEL.bit.XCLKOUTDIV = 2;// CPLDCLK = 50MHz
EDIS;

InitCpuTimer();
Setup_Timer0_CPU1 ();

SPI_A_Init();
SPI_C_Init();

AD74900_Init();
MCP23S17_Init(MMCP23S17_all_port_in、MCP23S17_all_port_out、0x00、0x00);

DMA_Init_CPU1 ();

init_uart_a();
init_uart_B ();

CANInit (CANA_base);
CANInit (CANB_BASE);
Setup_CAN_A();
Setup_CAN_B ();
CANGLALIntEnable (CANA_base、CAN_GLB_INT_CANINT0);
CANIntEnable (CANA_base、CAN_INT_IE0 | CAN_INT_STATUS);
CANGLALIntEnable (CANB_BASE、CAN_GLB_INT_CANINT0);
CANIntEnable (CANB_BASE、CAN_INT_IE0 | CAN_INT_STATUS);

DAC_Init (DACA);
DAC_Init (DACB);
DAC_Init (DACC);

I2CB_Init();

ConfigureADC_CPU1 ();

SETUP_ADC_CPU1 ();

//设置共享全局 RAM
Setup_SharedRAM ();

Cla1Regs.MIER all = 0;
EALLOW;
CpuSysRegs.PCLKCR0.bit.CLA1 = 1;
EDIS;

CLA1_ConfigMemory();
CLA1_Init();
}

void Setup_SharedRAM (void)
{
//为 CPU02提供对 GSRAM15的内存访问
操作
{
EALLOW;
MemCfgRegs.GSxMSEL.bit.MSEL_GS15 = 1;
EDIS;
}
while (MemCfgRegs.GSxMSEL.bit.MSEL_GS15 = 0);
}

CPU2:

#ifdef _flash
extern UINT16 RamfuncsLoadStart;
extern UINT16 RamfuncsLoadSize;
extern UINT16 RamfuncsRunStart;
#endif

void main (void)
{
#ifdef _flash
memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
#endif

InitSysCtrl_CPU2 ();

#ifdef _flash
InitFlash();
#endif

Dint;

InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

EALLOW;
PieVectTable.ADCC1_INT =&ADCC_ISR_CPU2;
PieVectTable.EPWM7_INT =&Loop_Epwm7_ISR_CPU2;

IER |= M_INT1;
IER |= M_INT3;
EDIS;

PieCtrlRegs.PIEIER1.bit.INTx3=1;
PieCtrlRegs.PIEIER1.bit.INTx7=1;
PieCtrlRegs.PIEIER3.bit.INTx7=1;

PieCtrlRegs.PIECTRL.bit.ENPIE = 1;

PieCtrlRegs.PIEACX.ALL = 0xFFFF;
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//等待共享 RAM 可用
while (MemCfgRegs.GSxMSEL.bit.MSEL_GS15 = 0);

//取消阻止 CPU1代码执行
操作
{
IPCLtoRFlagSet (IPC_FLAG17);
} while (IpcRegs.IPCFlG.bit.IPC17 = 0);

//闪存独立中的调试代码
操作
{
GpioDataRegs.GPCSET.bit.GPIO81 = 1;// TP E38
DELAY_US (100);
GpioDataRegs.GPCCLEAR.bit.GPIO81 = 1;
DELAY_US (100);
} while (1);//结束调试代码

System_Config_CPU2 ();

init_Vars_CPU2 ();

//***看门狗设置***
DisableDog ();

//后台循环
for (;;)
{

总之,如果我加载 CPU1闪存独立代码和 CPU2闪存代码,然后在 CPU2/CPU1运行命令时使用脚本“EMU 引导模式选择-> EMU_BOOT_FLASH”,则看不到 CPU1-CPU2 TP 切换: 我引入了一个无限循环来强制 TP 切换以观察闪存独立代码活动、此外、当仿真器断开连接时、DIP 开关 BM0&BM1设置为1 (在使用万用表/示波器的情况下验证为3V3)。 如果我停止了 CPU1代码、我会看到它在 IPCBootCPU2()中循环、具体而言:

  //

//等待 CPU02控制系统引导 ROM 准备好接收
// CPU01到 CPU02 INT1中断。
//

执行
{
BootStatus = IPCGetBootStatus ()& C2_BootROM_BOOTSTS_SYSTEM_READY;
}while ((bootStatus!= C2_BootROM_BOOTSTS_SYSTEM_READY)); 

如果我停止 CPU2并强制 IPCBOOTSTS = 2、则 CPU1和 CPU2开始移动!

为什么引导 ROM 序列未正确更改 CPU2 IPCBOOTSTS?

感谢您的支持。

迭戈

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

    当您告诉 CPU2引导至闪存时、C2_BootROM_BOOTSTS_SYSTEM_READY 未设置。 只有在等待引导时才会被置位。

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

    终于找到了我的错... 在独立模式启动中、闪存启动序列没有真正的问题。 为了发现我的问题、我相对关注了我使用 IQmath 指令的代码的最后一部分:当我排除了整个代码在闪存独立模式下开始良好运行时。 该问题是由于.cmd 文件中的问题导致的、在该文件中、我粘贴了 RAM 中使用的相同 IQmath 段定义。 因此、当我连接仿真器时、也在闪存模式下、不会发生复位事件、并且可以访问加载到 RAM 中的 IQmath。 遗憾的是、当代码应该在闪存独立模式下运行且存在启动复位时、运行代码会尝试访问 IQmath.lib、即使复位条件导致的已清除 RAM 中不存在函数...

    我在闪存中加载了此函数、并且所有函数都开始按预期正常工作、并在其他调试配置中进行了测试。

    谢谢、此致。

    迭戈