你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F10x Flash 擦除和写入问题

[复制链接]
哈哈哈楼 提问时间:2020-9-4 15:38 /
2ST金币
求助求助!!!我目前只有两个金币可以用来悬赏,请大神帮忙解决下问题。
事情是这样的这几天在研究IAP问题,整个程序流程如下:
   
内部Flash分区如下图

整个程序运行比较正常,但是在app中条件触发写标识时,出现死机现象,调试跟踪发现程序卡死在FLASH开始擦除时,后续程序就不运行了,单片机死机,看门狗复位,但是有时候又能够写标识成功令人费解。
贴上写数据的代码:

#define IAP_FLAG_UPDATE   ((uint32_t)0x55555555)
#define IAP_FLAG_JUMP     ((uint32_t)0xAAAAAAAA)
#define IAP_FLAG_ADDR     ((uint32_t)0x8002000)
#define FLASH_TIME_OUT    ((uint32_t)0x2000)


/**********************擦除库函数截取部分*******************/
  status = FLASH_WaitForLastOperation(EraseTimeout);

  if(status == FLASH_COMPLETE)
  {
    /* if the previous operation is completed, proceed to erase the page */
    FLASH->CR|= CR_PER_Set;
    FLASH->AR = Page_Address;
    FLASH->CR|= CR_STRT_Set;                        // 当程序执行到这步后就出现死机

    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(EraseTimeout);

    /* Disable the PER Bit */
    FLASH->CR &= CR_PER_Reset;                    // 这一步不会执行
  }

/********************************************/


uint8_t STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)       
{
        u32 endaddr=0;       
       if(WriteAddr<IAP_FLAG_ADDR||WriteAddr%4)
            return 1;        // 判断输入地址是否正确
       
        endaddr=WriteAddr+(NumToWrite*4);            //计算结束地址
       
        FLASH_Unlock();                                                        //解锁Flash
       
        FLASH_ClearFlag(FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR);// 清除一些挂起标识

        FLASH_ErasePage(WriteAddr);   // 擦除页
       
        while(WriteAddr<endaddr)                //循环写数据
        {
                if(FLASH_ProgramWord(WriteAddr,*pBuffer)!=FLASH_COMPLETE)    // 判断数据写完
                {
                        return 1;                      // 出错
                }
                FLASH_WaitForLastOperation(FLASH_TIME_OUT);   // 等待延时
                WriteAddr+=4;
                pBuffer++;
        }
       
        FLASH_Lock();                     //锁定

        return 0;                         //
}


void SysIAPFlagStart(void)
{
        if(g_system_flag.SysIAPflag)
        {
                STMFLASH_Read(IAP_FLAG_ADDR,&bootinfo.FG,2); // 读取标识位数据
                FLASH_WaitForLastOperation(FLASH_TIME_OUT);
                if(bootinfo.FG != IAP_FLAG_UPDATE)  
                {
                        bootinfo.FG =        IAP_FLAG_UPDATE;
                        // 关闭全局中断
                        __set_PRIMASK(1);
                        STMFLASH_Write(IAP_FLAG_ADDR,&bootinfo.FG,2);
                        //使能全局中断
                        __set_PRIMASK(0);       
                }
        }

}

收藏 评论0 发布时间:2020-9-4 15:38

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版