打印
[STM32F1]

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

[复制链接]
1539|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
majtsdd|  楼主 | 2014-4-15 11:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,固件库是3.5的
程序很庞大,我就不全贴出来了
但我处理flash存储的程序是这样的
void SaveFlashData()
{
        unsigned char FunctionStatusReturn;
        unsigned char ReSaveTimes=0;
        do
        {
                ReSaveTimes++;
                FunctionStatusReturn=0;
                delay_ms(2);
                __disable_irq();
        
               
                UnlockFlash();
                FLASH_ErasePage(_USER_MSG_PAGE_ADDr);
               
                FunctionStatusReturn+=SaveFlashChar(pID,                 pID_Flash_ADDr,                    22);
                FunctionStatusReturn+=SaveFlashChar(pPass,               pPass_Flash_ADDr,                  16);
                FunctionStatusReturn+=SaveFlashChar(pURL,                pURL_Flash_ADDr,                   pURLlen[0]);
                FunctionStatusReturn+=SaveFlashshort(pPort,              pPort_Flash_ADDr,                  1);
               
                FunctionStatusReturn+=SaveFlashshort(pWeek0,             pWeek0_Flash_ADDr,                 7);
                FunctionStatusReturn+=SaveFlashshort(pWeek1,             pWeek1_Flash_ADDr,                 7);
                FunctionStatusReturn+=SaveFlashshort(pSTimer,            pSTimer_Flash_ADDr,                1);

                FunctionStatusReturn+=SaveFlashChar(pSwitch,             pSwitch_Flash_ADDr,                1);
                FunctionStatusReturn+=SaveFlashChar(pWeek0Action,        pWeek0Action_Flash_ADDr,           1);
                FunctionStatusReturn+=SaveFlashChar(pWeek1Action,        pWeek1Action_Flash_ADDr,           1);
                FunctionStatusReturn+=SaveFlashChar(pSTimerAction,       pSTimerAction_Flash_ADDr,          1);
                FunctionStatusReturn+=SaveFlashChar(pURLlen,             pURLlen_Flash_ADDr,                1);
                FunctionStatusReturn+=SaveFlashChar(&ulSmartConfigSatus, ulSmartConfigSatus_Flash_ADDr,     1);
                LockFlash();  
               
                __enable_irq();
               
        }while( FunctionStatusReturn!=0 && ReSaveTimes<=3 );
        if(ReSaveTimes>3)
        {
                                                                                #ifdef  DEBUG_WU
                                                                                        UartSendPacket("SAVE Fail\r\n",11);
                                                                                        UartSendPacketInt(ReSaveTimes,"ReSaveTimes");
                                                                                #endif
        }else
        {
                                                                                #ifdef  DEBUG_WU
                                                                                        UartSendPacket("-->SAVE DONE\r\n",11);
                                                                                #endif
        }
}
其中,编程成功则返回0
因为每次重新编程会要先擦出,所以只能批量重写,按理来说编写3次都写不正确这几率也太小了,但我在调试程序的时候,在程序的特定位置出错几率特别高
(也就是软件自动复位,置标志位,然后再main函数中判断flash编程是否完成,在判断复位标志位是否置起,这样便重启系统,就是在这里进行flash编程很容易出错)
      
if(!(FLASHOperatStatus&FLASH_UPDATA_SAVE))
      {
                                                                                
            
            __disable_irq();
            //__enable_irq();
            NVIC_GenerateSystemReset();
            while(1);
      }
沙发
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 | 只看该作者
一定要偶地址开始写,否则写入会出错,我也遇到过!不知道你的是不是这个问题?

使用特权

评论回复
5
diweo| | 2014-4-16 21:19 | 只看该作者
那就换几个页试试看呗,难道都已经塞满了?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

26

帖子

0

粉丝