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.

TMS320F28335: TMS320F28335PGFA 片内flash 操作程序会跑飞

Part Number: TMS320F28335


hello,

    Ti 工程师。因项目需求原因,将28335的片内Sector H 区域作为用户参数保存区域,但是我在调试的过程中发现,当参数写入flash后,会出现三种情况,分别是:1.程序跑飞。2.进入异常中断。3.正常工作。我这边设定的:ScreenShot_2025-12-02_221627_943.png

ScreenShot_2025-12-02_221755_978.png

以下是状态图片:

ScreenShot_2025-12-02_222058_073.png

ScreenShot_2025-12-02_222438_360.png

进入异常中断后,扇区H,从地址0x300000开始 ,所有的数据丢失。

ScreenShot_2025-12-02_222750_059.png

并且报错:进入低功耗模式,与仿真器断开连接。

代码情况如下:

void InitFlash(void)
{  
    asm(" EALLOW");
    FlashRegs.FPWR.bit.PWR               = 3;
    FlashRegs.FSTATUS.bit.V3STAT         = 1;
    FlashRegs.FSTDBYWAIT.bit.STDBYWAIT   = 0x01FF;
    FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF;
    FlashRegs.FBANKWAIT.bit.RANDWAIT     = 6;
    FlashRegs.FBANKWAIT.bit.PAGEWAIT     = 5;
    FlashRegs.FOTPWAIT.bit.OTPWAIT       = 10;
    FlashRegs.FOPT.bit.ENPIPE            = 1;
    
    asm(" EDIS");
    
    asm(" RPT #6 || NOP");
}

InitFlash(),该函数在main.c中调用,用于初始化flash。时钟配置150MHz。

 

Uint16 app_ParamWrite(MotorCtrlType *MCtrl, FaultType *g_Fault)
  {
      Uint16 Read_temp[52] = {0};//写入缓存
      Uint32 WriteLength = 52;//数据长度
      Uint16 *pFlashAddr = NULL;
      FLASH_ST FOpStatus;
      Uint16 actual_write_len = 0;
      Uint16 EraseFlag=0; //擦除标志
      Uint16 verify_stat = 0; //验证写入
      DINT; //关中断
      DRTM;
      //读取需要保存的参数
      pro_WorCondRead(MCtrl, g_Fault, Read_temp);
      pFlashAddr = (Uint16*)0x300000;  // 写入地址0x300000

      EraseFlag = Flash_Erase(SECTORH, &FOpStatus);
      if (EraseFlag == 0  )
      {
          actual_write_len = Flash_Program(
              pFlashAddr,    // 正确的Flash地址指针
              Read_temp,     // 数据缓冲区
              WriteLength,   // 写入长度(52个16位字)
              &FOpStatus     // 状态结构体
          );
      }
      verify_stat = Flash_Verify(pFlashAddr, Read_temp, WriteLength, &FOpStatus);

      EINT;//允许中断触发器
      ERTM;//使能实时中断
      return (verify_stat == 0  ) ? 1 : 0;
  }

app_ParamWrite(),该函数作为业务函数,主要是对28335的扇区H进行擦除 /写入/校验。