请选择 进入手机版 | 继续访问电脑版
搜索
查看: 1184|回复: 3

[求助] 关于STM32F429ZIT6的FLASH擦除读写失败的问题。

[复制链接]

该用户从未签到

2

主题

3

帖子

0

蝴蝶豆

初级会员

最后登录
2021-8-16
发表于 2020-7-6 12:46:26 | 显示全部楼层 |阅读模式
因为项目需要,有一部分配置的数据需要保存到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
回复

使用道具 举报

该用户从未签到

0

主题

587

帖子

82

蝴蝶豆

金牌会员

最后登录
2024-1-2
发表于 2020-7-8 13:36:50 | 显示全部楼层

回帖奖励 +1 ST金币

要先擦除才能写,最小擦除单位是Sector

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

3

帖子

0

蝴蝶豆

初级会员

最后登录
2021-8-16
 楼主| 发表于 2020-7-9 11:44:37 | 显示全部楼层
陌路夕颜 发表于 2020-7-8 13:36
要先擦除才能写,最小擦除单位是Sector

我知道,但是我就是在擦除过程中出问题了,擦除并没有擦掉这一个扇区。
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

132

帖子

20

蝴蝶豆

金牌会员

最后登录
2020-9-27
发表于 2020-7-13 11:35:31 | 显示全部楼层
擦除失败时的错误码的什么?看看能提供什么信息?有打开写保护吗?
另外,用示波器看看擦除过程中VDD的电压有什么变化?有没有明显掉电的情况?

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-3-29 02:42 , Processed in 0.198337 second(s), 40 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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