STM32
直播中

张霞

8年用户 1102经验值
私信 关注
[问答]

STM32F429ZIT6的FLASH擦除读写失败的原因?

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

  • //宏定义
    #define    FLASH_PAGE_ID_CARD   ((uint32_t)0x08008000)


  • //定义要写入的数据和指向FLASH的指针
    int text[10]= {1,2,3,4,5,6,7,8,9,10};
    uint32_t *ID_card[10];

  • //将指针指向FLASH的地址位置
    for(int k=0;k<10;k++)
  • {
  •     *ID_card[k] = NULL;
  •     ID_card[k] = (uint32_t *)(0x08008000+(k*4));
  • }


  • //以下是循环读写擦除的代码
    while(1)
  •                                 {
  •     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("存储区擦除失败rn");
  •     }

  •     for(int i=0;i<10;i++)
  •     {
  •         if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, FLASH_PAGE_ID_CARD + (i*4),text) !=HAL_OK)
  •          {
  •              printf("写入失败rn");
  •          }
  •      }

  •     for(int k=0;k<10;k++)
  •     {
  •         printf("原始数据为%d   ",text[k]);
  •         printf("%p位置数据为%drn",ID_card[k],*ID_card[k]);
  •     }

  •     HAL_FLASH_Lock();                                                                                                                                                                                                 //FLASH上锁

  •     HAL_Delay(5000);

  •     for(int i=0;i<10;i++)
  •     {
  •         text++;
  •     }
  •                                 }

  • 回帖(1)

    杨文英

    2024-4-12 14:44:20
    要先擦除才能写,最小擦除单位是Sector
    举报

    更多回帖

    ×
    20
    完善资料,
    赚取积分