主题中讨论的其他器件:C2000WARE
工具/软件:Code Composer Studio
你(们)好
我偶然发现了 RAM 和闪存代码、它由仿真器启动并加载到 CPU1+CLA 和 CPU2+CLA 中、运行良好、但遗憾的是、当我以 FLASH_standalone 模式加载时、CPU1/CPU2代码卡住! 我尝试理解这种奇怪的行为、因为我加载了一个以前的闪存独立代码、这种做法效果很好。 最近、我的实际代码在维度(.cmd 链接器文件中的.text 扩展名)中进行了提升、而在 RAM 中进行了调试。 因此、我决定通过使用 GPIO 测试点运动来查找新的 CPU1闪存独立卡滞条件。 总之、我关注这个帖子
我意识到我的 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?
感谢您的支持。
迭戈