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

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个回答
00-405686 回答时间: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 赞一个!

查看全部评分

00-405686 回答时间: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扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版