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.

F28M35H52 的C2000不能从Flash启动

Other Parts Discussed in Thread: F28M35H52C

我采用F28m35H52C的开发板,实验双核EPWM驱动,C2000的主函数如下:

void main(void)

 {

     InitSysCtrl();

#ifdef _FLASH

     memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);

     InitFlash();

#endif  

    InitGpio(); 

     InitEPwm1Gpio(); 

     GPIO_CNF();

     Led1 = 1;// turn off

     LED  Led2 = 1;

     DINT;  

     InitPieCtrl();  // Disable CPU interrupts and clear all CPU interrupt flags: 

     IER = 0x0000; 

     IFR = 0x0000;

     InitPieVectTable();  

     EALLOW; 

     PieVectTable.EPWM1_INT = &EPWM1_ISR; 

     EDIS;

     EALLOW;  

     SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0;

      EDIS;

     PWM1_CNF();

     EALLOW;  

     SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; 

     EDIS;

     IER |= M_INT3; 

     PieCtrlRegs.PIEIER3.bit.INTx1 = 1;

     EINT;  // Enable Global interrupt INTM  

     ERTM;  // Enable Global realtime interrupt DBGM

    nInvert = 0; 

     pwmst = 0;  

     swdet = 0;

     long delay;  

    for(;;) 

     {

        Led1 = 0;  

         for(delay = 0;  delay < 500000; delay++)  

         {   

               if(!swdet)  

                {     

                         if ( mBtn1)

                             {      swdet=~0;     }  

                 }    

                else    

                {   

                     if (!mBtn1)   

                       {      swdet=0;     }  

               } 

        }

       Led1 = 1;  

       for(delay = 0; delay < 500000; delay++)  

      {   

              if(!swdet) 

               {    

                      if (mBtn1)    

                      {      swdet=~0;     }   

                }   

                else  

                {    

                        if (!mBtn1)    

                        {      swdet=0;     }   

                }  

          }

        if(swdet && mBtn1)  

         {   

                if(pwmst)   

                {    

                       Led2 = 1;   

                        EPwmOff();   

                         pwmst = 0;   

                 }  

                 else   

                 {     

                        Led2 = 0;   

                        EPwmOn();    

                        pwmst = ~0;  

                 }  

           }

       }

}

 

采用在线Debug方式程序工作正常,但是离线Flash启动不正常,请大虾帮看一下是什么地方设置的不对。M3部分应该没问题可以从Flash启动,并且不改变M3程序,C28装载Bliky例程,工作正常,可以从Flash启动。板上的SW1和SW3已经设置好了。SW1开关都打向下,SW3在下载后打向上。

  • 你好,

    根据你的描述:M3部分应该没问题可以从Flash启动;不改变M3程序,C28装载Bliky例程,工作正常,可以从Flash启动。

    你说的C28跑Bliky例程,能从Flash启动是指在线仿真情况下对吧

    你的问题是断开仿真器,重新上电无法从Flash启动对吗?

    这个问题,你可以先确认硬件的boot模式的那几个脚的状态是否是数据手册上的Flash boot状态,同时芯片的复位脚的复位电路是否正常,确保从新上电后有进行芯片复位,然后就是检查软件的CMD文件是否正确,一般就这几个原因。

     

  • 看了代码中做了代码搬移    烧到flash不启动   我觉得应该是你的代码搬移部分有问题

    请确认 

  • M3代码不变,C28装载linky例程,可以离线从Flash启动的。

    开发板的设置应该没问题,也用Blinky例程验证过。

    CMD文件用的是Blinky例程的,我没改过。我再仔细检查一下。

    非常感谢Joey!

  • Hongbo

    怀疑是C28 没有被正确引导到flash中,即你要确定C28程序中是否跑到main了,可以在main中设置一个GPIO翻转即可确定。

    另外C28的引导模式是由M3决定,请确定M3 main程序中应该要有下面的代码:

    // Send boot command to allow the C28 application to begin execution
    IPCMtoCBootControlSystem(CBROM_MTOC_BOOTMODE_BOOT_FROM_FLASH);

    eric

  • 今天又试了一下,C28代码中去掉以下代码

    #ifdef _FLASH

     memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);

     InitFlash();

    #endif

    或删除 PWM1_CNF()函数的以下代码

        EPwm1Regs.ETSEL.bit.INTEN = 1;    

    MCU可以从Flash启动,检查了Map文件和CMD文件,地址没发现有冲突的地方。

     

    虽然现在程序可以用了,但是不知道是什么原因导致的不能从Flash运行

  • 如果程序烧写在flash中,是需要Initflash对Flash进行初始化的。建议你看一下Iniflash的配置是否有问题。

    关于PWM中断部分,中断服务函数在哪里处理,是否有问题?

    建议利用GPIO口翻转去定位程序在哪里跑飞。

    Eric