硬汉嵌入式论坛

 找回密码
 立即注册
查看: 15205|回复: 12
收起左侧

[有问必答] HAL库中Flash擦除总是不成功

  [复制链接]

10

主题

34

回帖

64

积分

初级会员

积分
64
发表于 2019-2-22 16:59:16 | 显示全部楼层 |阅读模式


程序如下,使用的是官方的例子,单独运行官方例子时正常,但是移植到程序中时会卡在if (HAL_FLASHEx_Erase(&EraseInitStruct,&SectorError) !=HAL_OK)中,返回为错误值,
不知道问题出在哪里

uint32_t FirstSector = 0, NbOfSectors = 0, Address = 0;
        uint32_t SectorError = 0;
        u16 i,j;
       
        FirstSector=GetSector(FLASH_USER_START_ADDR);
        NbOfSectors = GetSector(FLASH_USER_END_ADDR) - FirstSector + 1;
        HAL_FLASH_Unlock();
       
        EraseInitStruct.TypeErase=FLASH_TYPEERASE_SECTORS;
        EraseInitStruct.NbSectors=NbOfSectors;
  EraseInitStruct.Sector=FirstSector;
        EraseInitStruct.VoltageRange=FLASH_VOLTAGE_RANGE_3;

        if (HAL_FLASHEx_Erase(&EraseInitStruct,&SectorError) !=HAL_OK)
        {
                   return HAL_ERROR;
        }
          __HAL_FLASH_DATA_CACHE_DISABLE();
  __HAL_FLASH_INSTRUCTION_CACHE_DISABLE();

  __HAL_FLASH_DATA_CACHE_RESET();
  __HAL_FLASH_INSTRUCTION_CACHE_RESET();

  __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
  __HAL_FLASH_DATA_CACHE_ENABLE();
       
         Address = FLASH_USER_START_ADDR;
       
        for(i=0; i<NumToWrite; i++)
        {
                        if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Address, pBuffer[i]) == HAL_OK)
                        {
                                Address = Address + 4;
                        }
                        else
                        {
                                return HAL_ERROR;
                        }
        }
       
        HAL_FLASH_Lock();

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2019-2-22 17:00:59 | 显示全部楼层
这个就不清楚了,帮顶下。
ps:可以对比下官方例子运行时相关的Flash寄存器跟你的移植后的区别。

回复

使用道具 举报

10

主题

34

回帖

64

积分

初级会员

积分
64
 楼主| 发表于 2019-2-22 19:26:35 | 显示全部楼层
eric2013 发表于 2019-2-22 17:00
这个就不清楚了,帮顶下。
ps:可以对比下官方例子运行时相关的Flash寄存器跟你的移植后的区别。

好的,谢谢了
回复

使用道具 举报

32

主题

264

回帖

365

积分

高级会员

积分
365
发表于 2019-2-25 10:28:04 | 显示全部楼层
擦除前先查询下状态
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2020-6-23 09:37:11 | 显示全部楼层
在水一方 发表于 2019-2-25 10:28
擦除前先查询下状态

我也碰到这个问题了,。。。。。
运行在FreeRTOS+HAL的环境中,
内部Flash的擦除不成功。 调试步骤下,单步执行,偶尔可以成功。 全速运行不成功。
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2020-6-23 10:41:30 | 显示全部楼层
本帖最后由 caicaptain2 于 2020-6-24 12:02 编辑

你这个解决了没有?  
我也是同样的问题。。。。还没有解决。
更新:已解决。 由于看门狗周期是1s,而flash扇区擦除时间是1~2秒。 导致异常复位,擦除失败。  修改看门狗周期至3秒即可。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2020-7-8 15:51:03 | 显示全部楼层
求问楼主,你参考的是好哪个例程
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117512
QQ
发表于 2020-7-8 18:00:08 | 显示全部楼层
biuuu 发表于 2020-7-8 15:51
求问楼主,你参考的是好哪个例程

使用的那个系列,检索对应的软件包,里面有IAP例子。
回复

使用道具 举报

6

主题

74

回帖

92

积分

初级会员

积分
92
发表于 2020-7-22 00:05:42 | 显示全部楼层
今天正好解决了一个差不多的问题。我这边的问题原因主要是:
1解锁flash后直接操作flash;
2优化开的太高,代码运行过快。
这两个加一起直接导致解锁flash后面的操作(擦除、写)失败,用了个比较简单的解决的办法,若返回状态为失败或者读回的数据与写入的不同,就重新执行一遍这个操作(代码更新在这个链接了,可以参考http://armbbs.cn/forum.php?mod=v ... &extra=page%3D1
回复

使用道具 举报

6

主题

74

回帖

92

积分

初级会员

积分
92
发表于 2020-7-22 00:09:34 | 显示全部楼层
还有就是,实在不行就换块芯片,芯片也可能会有问题
回复

使用道具 举报

2

主题

22

回帖

28

积分

新手上路

积分
28
发表于 2021-12-28 19:33:35 | 显示全部楼层
太感谢了,膜拜啊。搞了几天都没搞定,果然看门狗太坑了。时间设置3秒就好了。
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2025-2-11 09:34:38 | 显示全部楼层
caicaptain2 发表于 2020-6-23 10:41
你这个解决了没有?  
我也是同样的问题。。。。还没有解决。
更新:已解决。 由于看门狗周期是1s,而f ...

谢谢大佬,同样的方法可以解决问题
回复

使用道具 举报

3

主题

17

回帖

26

积分

新手上路

积分
26
发表于 2025-2-11 10:19:36 | 显示全部楼层
MARK,说不定什么时候就会遇到!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 06:31 , Processed in 0.044509 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表