[AT32F413] AT32FCBT7存储问题,无法正确擦除FLASH,请大神指导

[复制链接]
4864|5
 楼主| 谢宇宇 发表于 2025-1-18 08:22 | 显示全部楼层 |阅读模式

调用存储数据第一次存储(FLASH数据FF状态)数据正常,再次存储无法把FLASH正确擦除,ErasePage擦除函数返回状态2(写保护错误),函数如下。

void EEPROM_SaveInFlash (uint16 job, uint8 En)
{
   uint8 ID,Number;

        if (En == DEF_ENABLED )  {                                         // ÄÚ²¿FLASH´¦Àí
       FLASH_Unlock();                                         // FLASH½âËø
          
       /* Clear All pending flags */
     FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_PRCDN|FLASH_FLAG_PRGMFLR |FLASH_FLAG_WRPRTFLR);          
           FlashStatus = FLASH_ErasePage(EEPROM_START_ADDRESS);
          
           WeldBuffer[0][0] = 300;
           WeldBuffer[0][1] = 154;
           WeldBuffer[0][2] = Job_Data.MemorySetNub;
           WeldBuffer[0][3] = Job_Data.MIGSetVoltageCorrect;
           WeldBuffer[0][4] = Job_Data.MIGSetMotorSpeedCorrect;
           WeldBuffer[0][5] = Job_Data.MIGSetCurrentCorrect;
           WeldBuffer[0][6] = Job_Data.MIGDisCurrentCorrect;
           WeldBuffer[0][7] = Job_Data.K;
           WeldBuffer[0][8] = Job_Data.B;       
           WeldBuffer[0][9] = Job_Data.TestCount;
           WeldBuffer[0][10] = Job_Data.TIG200_220_Fg;
           WeldBuffer[0][11] = Job_Data.MIGDisACVoltageCorrect;                                       

           for (ID = 0; ID < 61; ID++)  {
              for (Number = 0; (Number < 150) && (FlashStatus == FLASH_PRC_DONE); Number++)  {                     
                          FlashStatus = FLASH_ProgramHalfWord((EEPROM_START_ADDRESS + (((ID * 150) + Number) * 2)), WeldBuffer[ID][Number]);
              }
           }
    FLASH_Lock();                              // FLASHÉÏËø
        } else {                                                             // ½ö½öÄÚ²¿RAM½»»»
           for (Number = 0; Number < 150; Number++)  
               WeldBuffer[job][Number] = WeldBuffer[0][Number];
        }

}

809afb9f9177f4711daaf83d0b2c6e8.png
b945cf4e89e5bb438f28761463c8b62.png
809afb9f9177f4711daaf83d0b2c6e8.png
b945cf4e89e5bb438f28761463c8b62.png
084425 发表于 2025-1-20 15:15 来自手机 | 显示全部楼层
先确认一下库函数版本,看一下擦除和编程函数内部是否有判断错误标识。单步调试跟进去看
EchoInSilence 发表于 2025-1-20 16:09 | 显示全部楼层
两次操作间隔多久
旧年胶片 发表于 2025-8-29 14:10 | 显示全部楼层
AT32FCBT7 FLASH 无法正确擦除,先排查擦除前是否解锁:需按手册操作解锁序列(写特定值到 FLASH_KEYR),未解锁会锁死操作。再检查擦除扇区是否正确,避免误操作非目标区域。也可能是 FLASH 控制器时钟未使能,或存在硬件故障。可通过调试查看 FLASH 状态寄存器(FLASH_SR),定位错误原因(如忙标志、保护位)。
ForgottenRealm 发表于 2025-9-9 19:33 | 显示全部楼层
感觉雅特力flash相关的疑问挺多的啊。
遗忘领域 发表于 2025-9-10 12:59 | 显示全部楼层
旧年胶片 发表于 2025-8-29 14:10
AT32FCBT7 FLASH 无法正确擦除,先排查擦除前是否解锁:需按手册操作解锁序列(写特定值到 FLASH_KEYR), ...

意思就是一定要先解锁,如果锁死的怎么处理?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部