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进行擦除 /写入/校验。

  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好,

          F28335 只有一个flash bank,如您所指出的,它包含 8 sectors 。

         在对任何flash sector进行编程时,flash API(以及任何辅助代码)必须从 RAM 中执行。在进行flash操作(擦除/编程等)时访问任何flash sector是不被支持的。请确认已遵守此规则。

         此外,在flash编程过程中,所有其他中断服务程序(ISR)都应被禁用(我们的flash API 示例应展示这一点)。

         在此设备上中断闪存操作也是不被支持的。