feng183995652 发表于 2020-7-6 12:46:26

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

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


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

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

    if(HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK)                               //开始擦除页面
    {
      printf("存储区擦除失败\r\n");
    }
                                                
    for(int i=0;i<10;i++)               
    {
      if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_PAGE_ID_CARD + (i*4),text) !=HAL_OK)
         {
             printf("写入失败\r\n");
         }
   }
                                                
    for(int k=0;k<10;k++)
    {
      printf("原始数据为%d   ",text);
      printf("%p位置数据为%d\r\n",ID_card,*ID_card);
    }

    HAL_FLASH_Lock();                                                                                                                                                                                                 //FLASH上锁
                                                
    HAL_Delay(5000);
                                                
    for(int i=0;i<10;i++)
    {
      text++;
    }
                              }

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

代码不清楚我附上一张图
https://www.stmcu.org.cn/module/forum/forum.php?mod=image&aid=451986&size=300x300&key=c6cadf6bde35d699&nocache=yes&type=fixnone




陌路夕颜 发表于 2020-7-8 13:36:50

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

feng183995652 发表于 2020-7-9 11:44:37

陌路夕颜 发表于 2020-7-8 13:36
要先擦除才能写,最小擦除单位是Sector

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

任风吹吹 发表于 2020-7-13 11:35:31

擦除失败时的错误码的什么?看看能提供什么信息?有打开写保护吗?
另外,用示波器看看擦除过程中VDD的电压有什么变化?有没有明显掉电的情况?
页: [1]
查看完整版本: 关于STM32F429ZIT6的FLASH擦除读写失败的问题。