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

stm32F103C写flash操作问题

[复制链接]
王子不赖 提问时间:2016-9-7 12:02 /
在f103板子上想把用户信息保存在Flash上,用cubemx生成的库封装写函数,但是一直不能使用,主要是对FLASH_EraseInitTypeDef参数不知道怎么使用,一用就开机不了,连仿真都进不去main函数,函数如下:
  1. void testFlashWrite(void)
  2. {
  3.     FLASH_EraseInitTypeDef pEraseInit={0};
  4.     uint32_t PageError = 0,dstAddr = FLASH_BASE+2048;//FLASH_BASE=0x08000000
  5.     uint32_t pdata = 0x12345678;

  6. //FLASH_EraseInitTypeDef 参数配置是否对???
  7.     pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;
  8.     pEraseInit.Banks  = FLASH_BANK_1;
  9.     pEraseInit.NbPages = (dstAddr-FLASH_BASE)/FLASH_PAGE_SIZE;
  10.     pEraseInit.PageAddress =  (dstAddr-FLASH_BASE)%FLASH_PAGE_SIZE;

  11.     HAL_FLASH_Unlock();
  12.     HAL_FLASHEx_Erase(&pEraseInit,&PageError);//一打开此函数,就不能开机,连仿真都进不去
  13.     //FLASH_PageErase(dstAddr);
  14.     //HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,dstAddr,(uint64_t)pdata);
  15.     HAL_FLASH_Lock();
  16. }
复制代码
第一次来论坛发帖求助,不知道有没用,调试了两天没辙。。。希望有高手帮忙,谢谢!
file:///C:\Users\chuhong\AppData\Roaming\Tencent\Users\946477057\QQ\WinTemp\RichOle\_JC9VR`4%22]~ME}A1SCVRA.png
file:///C:\Users\chuhong\AppData\Roaming\Tencent\Users\946477057\QQ\WinTemp\RichOle\_JC9VR`4%22]~ME}A1SCVRA.png


收藏 1 评论8 发布时间:2016-9-7 12:02

举报

8个回答
294479435@qq.co 回答时间:2016-9-7 14:31:25
HAL_FLASHEx_Erase(&pEraseInit,&PageError);//一打开此函数,就不能开机,连仿真都进不去
这个是擦除整个flash还是部分?是不是把程序空间也擦除了?我用的标准库,没出个问题

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 很给力!

查看全部评分

王子不赖 回答时间:2016-9-7 14:42:19
00-405686 发表于 2016-9-7 14:31
HAL_FLASHEx_Erase(&pEraseInit,&PageError);//一打开此函数,就不能开机,连仿真都进不去
这个是擦除整个f ...

谢谢答复!
HAL_FLASHEx_Erase传入的参数在上面有配置,我根据自己理解设置的,应该擦除的是页,一页1k,能不能把你的代码让我看下呢,另外flash地址是0x08000000开始是吧?
oktigerxia 回答时间:2016-9-7 16:10:50
flash地址是应该往后放,我都是放在最后,如flash  GPRSMODULETYPE_ADDR 0x0807C000

void vSaveHWInfo(char* pBuf)
{
        u32 i;
        u32 tmp;
        u32 addr;
        FLASH_Status FLASHStatus;

        FLASHStatus = FLASH_COMPLETE;
    /* Unlock the Flash Program Erase controller */
          FLASH_Unlock();

          /* Clear All pending flags */
          FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);       

          /* Erase the FLASH pages */

    FLASHStatus = FLASH_ErasePage(GPRSMODULETYPE_ADDR);
          if(FLASHStatus != FLASH_COMPLETE)
                return ;
          /*  FLASH Word program of data 0x15041979 at addresses defined by StartAddr and EndAddr*/
          addr = GPRSMODULETYPE_ADDR;
        tmp = (u32)pBuf;
        for(i = 0; i < 36; i++)
        {
                FLASHStatus = FLASH_ProgramWord(addr, *(u32*)tmp);
                if(FLASHStatus != FLASH_COMPLETE)
                        return ;/* Check the corectness of written data */
                addr += 4;
                tmp += 4;
        }
        FLASH_Lock();               
}

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 赞一个!

查看全部评分

294479435@qq.co 回答时间:2016-9-7 16:15:36
王子不赖 发表于 2016-9-7 14:42
谢谢答复!
HAL_FLASHEx_Erase传入的参数在上面有配置,我根据自己理解设置的,应该擦除的是页,一页1k, ...

起始地址是对的,不过正常情况下程序放的地址是从0x08000000开始的
王子不赖 回答时间:2016-9-7 17:52:05
oktigerxia 发表于 2016-9-7 16:10
flash地址是应该往后放,我都是放在最后,如flash  GPRSMODULETYPE_ADDR 0x0807C000

void vSaveHWInfo(cha ...

谢谢答复,我查资料也看到这些操作1.FLASH_Unlock;2.FLASH_ClearFlag;3.FLASH_ErasePage;4.FLASH_ProgramWord;因为我是用cubumx生成的库,所以没有2.FLASH_ClearFlag这个接口,上网找了替代方法是是把第2,3换HAL_FLASHEx_Erase;
因为我用的是f103c8,只有64k,我也试过从后面地址写,但是没有写成功(不会死机),不知道还有其他漏掉的细节没?
王子不赖 回答时间:2016-9-7 17:53:59
00-405686 发表于 2016-9-7 16:15
起始地址是对的,不过正常情况下程序放的地址是从0x08000000开始的

谢谢,我也试过了从后面开始写 ,不过不会死机了, 就是写后没有效果,数据还是fff。。。
yfy123 回答时间:2016-9-8 09:13:00
学习一下
王子不赖 回答时间:2016-9-9 11:44:17
自己结贴,最后发现果然是pEraseInit的参数配错,pEraseInit.NbPages =1;//这里配置为1就行了, 一直理解是从第几页开始擦除,其实他意思是擦除多少页。另外如果开了看门狗,必须在擦除和写之前关闭,操作完成之后再打开,我使能的是窗口看门狗,所以接口为HAL_WWDG_MspDeInit和HAL_WWDG_MspInit

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版