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

关于STM32F429ZIT6的FLASH擦除读写失败的问题。

[复制链接]
feng183995652 提问时间:2020-7-6 12:46 /
因为项目需要,有一部分配置的数据需要保存到FLASH存储区。于是查看了官方的手册,STM32F429ZI是按照扇区划分,划分为Bank1和Bank2。其中每一个块又划分为12个扇区,4个16kb,1个64kb,7个128kb。我拟定将要存储的数据放到Bank1的第3个16kb的扇区中。即起始地址为0x08008000的FLASH位置。同时我也参考了官方的例程,但是擦除和写入数据过程均出现了很奇怪的问题。代码是用STM32CubemX生成,编译器是Keil5代码截取了关键部分和现象如下图。


  1. <div>//宏定义</div><div>#define    FLASH_PAGE_ID_CARD   ((uint32_t)0x08008000) </div><div>
  2. </div><div>
  3. </div><div>//定义要写入的数据和指向FLASH的指针</div><div>int text[10]= {1,2,3,4,5,6,7,8,9,10};</div><div>uint32_t *ID_card[10];</div><div>
  4. </div><div>//将指针指向FLASH的地址位置</div><div>for(int k=0;k<10;k++)
  5. {
  6.     *ID_card[k] = NULL;
  7.     ID_card[k] = (uint32_t *)(0x08008000+(k*4));
  8. }
  9. </div><div>
  10. </div><div>
  11. </div><div>//以下是循环读写擦除的代码</div><div>while(1)
  12. </div>                                {
  13.     HAL_FLASH_Unlock();                                                                                                                                                                                                //FLASH解锁

  14.     EraseInitStruct.TypeErase = FLASH_TYPEERASE_SECTORS;                           //只擦除模式
  15.     EraseInitStruct.Sector = FLASH_PAGE_ID_CARD;                                                                                        //开头的闪存区
  16.     EraseInitStruct.NbSectors = 1;                                                                                                                                                //擦1页
  17.     EraseInitStruct.VoltageRange = FLASH_VOLTAGE_RANGE_3;                                                        //擦除电压在2.7-3.3V

  18.     if(HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)                               //开始擦除页面
  19.     {
  20.         printf("存储区擦除失败\r\n");
  21.     }
  22.                                                 
  23.     for(int i=0;i<10;i++)               
  24.     {
  25.         if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_PAGE_ID_CARD + (i*4),text[i]) !=HAL_OK)
  26.          {
  27.              printf("写入失败\r\n");
  28.          }
  29.      }
  30.                                                 
  31.     for(int k=0;k<10;k++)
  32.     {
  33.         printf("原始数据为%d   ",text[k]);
  34.         printf("%p位置数据为%d\r\n",ID_card[k],*ID_card[k]);
  35.     }

  36.     HAL_FLASH_Lock();                                                                                                                                                                                                 //FLASH上锁
  37.                                                 
  38.     HAL_Delay(5000);
  39.                                                 
  40.     for(int i=0;i<10;i++)
  41.     {
  42.         text[i]++;
  43.     }
  44.                                 }
复制代码
QQ截图20200706123642.png QQ截图20200706123617.png

这是串口打印的文件数据,除第一次擦除报错以外,其他的均没有报错,但是同时也除了第一次写入的数据是和逻辑一样,之后的数据写入也均出现了错误。也就是下载程序以后除了第一次写入正常以外,其他的写入都不对了。希望有人能为我解惑。
另外我还有一个问题想请教:
1.在F103系列,FLASH扇区都是1KB或者2KB一页,在F4中大小容量均变了,那么我写入一个数据就需要擦除16kb的大小吗?或者说是我需要单独留出16kb的大小来存放一部分配置文件吗?

代码不清楚我附上一张图
[url=][/url]





QQ图片20200706135258.png
收藏 评论3 发布时间:2020-7-6 12:46

举报

3个回答
陌路夕颜 回答时间:2020-7-8 13:36:50
要先擦除才能写,最小擦除单位是Sector

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

feng183995652 回答时间:2020-7-9 11:44:37
陌路夕颜 发表于 2020-7-8 13:36
要先擦除才能写,最小擦除单位是Sector

我知道,但是我就是在擦除过程中出问题了,擦除并没有擦掉这一个扇区。
任风吹吹 回答时间:2020-7-13 11:35:31
擦除失败时的错误码的什么?看看能提供什么信息?有打开写保护吗?
另外,用示波器看看擦除过程中VDD的电压有什么变化?有没有明显掉电的情况?

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

关于 意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
13245底部标题123相同标题
12底部标题123相同标题
33333底部标题123相同序号
3435底部标题-无链接
关注我们
st-img 微信公众号
st-img 手机版