[STM32F1] stm32 进行flash编程时偶尔存储数据出错是怎么回事

[复制链接]
 楼主| majtsdd 发表于 2014-4-15 11:52 | 显示全部楼层 |阅读模式
如题,固件库是3.5的
程序很庞大,我就不全贴出来了
但我处理flash存储的程序是这样的
  1. void SaveFlashData()
  2. {
  3.         unsigned char FunctionStatusReturn;
  4.         unsigned char ReSaveTimes=0;
  5.         do
  6.         {
  7.                 ReSaveTimes++;
  8.                 FunctionStatusReturn=0;
  9.                 delay_ms(2);
  10.                 __disable_irq();
  11.         
  12.                
  13.                 UnlockFlash();
  14.                 FLASH_ErasePage(_USER_MSG_PAGE_ADDr);
  15.                
  16.                 FunctionStatusReturn+=SaveFlashChar(pID,                 pID_Flash_ADDr,                    22);
  17.                 FunctionStatusReturn+=SaveFlashChar(pPass,               pPass_Flash_ADDr,                  16);
  18.                 FunctionStatusReturn+=SaveFlashChar(pURL,                pURL_Flash_ADDr,                   pURLlen[0]);
  19.                 FunctionStatusReturn+=SaveFlashshort(pPort,              pPort_Flash_ADDr,                  1);
  20.                
  21.                 FunctionStatusReturn+=SaveFlashshort(pWeek0,             pWeek0_Flash_ADDr,                 7);
  22.                 FunctionStatusReturn+=SaveFlashshort(pWeek1,             pWeek1_Flash_ADDr,                 7);
  23.                 FunctionStatusReturn+=SaveFlashshort(pSTimer,            pSTimer_Flash_ADDr,                1);

  24.                 FunctionStatusReturn+=SaveFlashChar(pSwitch,             pSwitch_Flash_ADDr,                1);
  25.                 FunctionStatusReturn+=SaveFlashChar(pWeek0Action,        pWeek0Action_Flash_ADDr,           1);
  26.                 FunctionStatusReturn+=SaveFlashChar(pWeek1Action,        pWeek1Action_Flash_ADDr,           1);
  27.                 FunctionStatusReturn+=SaveFlashChar(pSTimerAction,       pSTimerAction_Flash_ADDr,          1);
  28.                 FunctionStatusReturn+=SaveFlashChar(pURLlen,             pURLlen_Flash_ADDr,                1);
  29.                 FunctionStatusReturn+=SaveFlashChar(&ulSmartConfigSatus, ulSmartConfigSatus_Flash_ADDr,     1);
  30.                 LockFlash();  
  31.                
  32.                 __enable_irq();
  33.                
  34.         }while( FunctionStatusReturn!=0 && ReSaveTimes<=3 );
  35.         if(ReSaveTimes>3)
  36.         {
  37.                                                                                 #ifdef  DEBUG_WU
  38.                                                                                         UartSendPacket("SAVE Fail\r\n",11);
  39.                                                                                         UartSendPacketInt(ReSaveTimes,"ReSaveTimes");
  40.                                                                                 #endif
  41.         }else
  42.         {
  43.                                                                                 #ifdef  DEBUG_WU
  44.                                                                                         UartSendPacket("-->SAVE DONE\r\n",11);
  45.                                                                                 #endif
  46.         }
  47. }
其中,编程成功则返回0
因为每次重新编程会要先擦出,所以只能批量重写,按理来说编写3次都写不正确这几率也太小了,但我在调试程序的时候,在程序的特定位置出错几率特别高
(也就是软件自动复位,置标志位,然后再main函数中判断flash编程是否完成,在判断复位标志位是否置起,这样便重启系统,就是在这里进行flash编程很容易出错)
  1.       
  2. if(!(FLASHOperatStatus&FLASH_UPDATA_SAVE))
  3.       {
  4.                                                                                 
  5.             
  6.             __disable_irq();
  7.             //__enable_irq();
  8.             NVIC_GenerateSystemReset();
  9.             while(1);
  10.       }
mmuuss586 发表于 2014-4-15 12:52 | 显示全部楼层
没碰到过。
读写内部STM32内部FLASH吧?
我用407反正一直没啥问题。

可以考虑:每次写完以后,再读出来比对下,是否一样,不一样再写1次看看
 楼主| majtsdd 发表于 2014-4-15 14:25 | 显示全部楼层
是不是有可能Flash读写过量,导致的,
我大概每天一两百次操作,现在差不多有两个月了,
还有就是芯片擦除后,那一页的数据不是都置 0 吗
怎么感觉读出来还有非 0 置
ticomi 发表于 2014-4-16 08:08 | 显示全部楼层
一定要偶地址开始写,否则写入会出错,我也遇到过!不知道你的是不是这个问题?
diweo 发表于 2014-4-16 21:19 | 显示全部楼层
那就换几个页试试看呗,难道都已经塞满了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

26

帖子

0

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

3

主题

26

帖子

0

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