ST意法半导体
直播中

王浩

7年用户 1321经验值
私信 关注
[问答]

将数据写入闪存时一直没有回读任何内容怎么解决?

你好!我正在将数据写入闪存并遇到一个奇怪的异常情况,即数据在重新启动时自行擦除。我有一个程序将数据写入闪存,另一个程序读取数据,但它一直没有回读任何内容。我最终使用一个程序写入数据,然后使用 STM32CubeProgrammer 读取数据。第一次阅读显示我的数据。当我断开连接并重新连接时,一切又都消失了。  
我当前的代码相当简单。我有一个 Flash 位置,预留了 10 页:
  • /* Memories definition */
  • MEMORY
  • {
  •   RAM    (xrw)     : ORIGIN = 0x20000000,   LENGTH = 40K
  •   FLASH    (rx)            : ORIGIN = 0x8000000,   LENGTH = 106k
  •   FLAG_VAR (rx)           : ORIGIN = 0x8015800,   LENGTH = 2k
  •   LOC_VAR (rx)           : ORIGIN = 0x8016000,   LENGTH = 20k
  • }
不过,我目前只使用 1 页进行测试。我正在有效地擦除闪存,然后在 byteArray 中加 1,然后写入 2048 字节(一页)。它似乎工作正常(正如我提到的,它写入正确,只是第二次擦除它)。  
不幸的是,我不完全确定发生了什么,所以我不确定如何解决这个问题。知道什么会导致页面自行擦除吗?  
如果有帮助,这是我正在使用的代码(有很多外部变量,所以如果我遗漏了什么,我深表歉意):
  • void find_flash_anomalies()
  • {
  •         uint8_t tempvar = 0;
  •         for(uint32_t i = 0; i < flash_array_size_bytes; i++)
  •         {
  •                 byteArray = tempvar;
  •                 tempvar = (tempvar+1) % 256;
  •         }
  •         uint8_t num_pages = 1;
  •         for(uint8_t i = 0; i < num_pages; i++)
  •         {
  •                 if(erase_pages(location_flash_address, 1) == HAL_OK)
  •                 {
  •                         program_pages_u8(location_flash_address, &byteArray[0], 2048);
  •                 }
  •         }
  • }
  • uint32_t erase_pages(uint32_t start_address, uint8_t num_pages)
  • {
  •         FLASH_EraseInitTypeDef EraseInitStruct;
  •         HAL_FLASH_Unlock();
  •         uint32_t res = -1;
  •         uint32_t PAGEError = 0;
  •         EraseInitStruct.TypeErase   = FLASH_TYPEERASE_PAGES;
  •         EraseInitStruct.Banks       = GetBank(start_address);
  •         EraseInitStruct.Page        = GetPage(start_address);
  •         EraseInitStruct.NbPages     = num_pages;
  •         if (HAL_FLASHEx_Erase(&EraseInitStruct, &PAGEError) != HAL_OK)
  •         {
  •                 res = -1;
  •         }
  •         else
  •         {
  •                 res = HAL_OK;
  •         }
  •         return res;
  • }
  • uint32_t program_pages_u8(uint32_t start_address, uint8_t *data, uint16_t num_u8)
  • {
  •         uint32_t address = start_address;
  •         uint64_t temp_doubleword = 0;
  •         uint8_t temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8 = 0;
  •         for(uint16_t i=0; i < (num_u8); i+=8)
  •         {
  •                 temp1 = *(uint8_t*)(data+i);
  •                 temp2 = *(uint8_t*)(data+i+1);
  •                 temp3 = *(uint8_t*)(data+i+2);
  •                 temp4 = *(uint8_t*)(data+i+3);
  •                 temp5 = *(uint8_t*)(data+i+4);
  •                 temp6 = *(uint8_t*)(data+i+5);
  •                 temp7 = *(uint8_t*)(data+i+6);
  •                 temp8 = *(uint8_t*)(data+i+7);
  •                 temp_doubleword = ((uint64_t)temp1 << 0) + ((uint64_t)temp2 << 8) + ((uint64_t)temp3 << 16) +((uint64_t)temp4 << 24)
  •                                 + ((uint64_t)temp5 << 32) + ((uint64_t)temp6 << 40) + ((uint64_t)temp7 << 48) +((uint64_t)temp8 << 56) ;
  •                 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, address, temp_doubleword) == HAL_OK)
  •                 {
  •                         address = address + 8;
  •                 }
  •                 else
  •                 {
  •                         return -1;
  •                 }
  •         }
  •         return HAL_OK;
  • }

如果您能给我或指出任何帮助,我们将不胜感激。不确定我是否以某种方式损坏了闪存并且它在开始时重新初始化它或者可能是什么问题。我此时有点莫名其妙。  
感谢你的帮助!








回帖(1)

云达贞

2023-1-6 11:05:53

没有真正的行为模式可以做到这一点
确保您自己的擦除代码未触发,仅通过直接用户交互执行它。即您输入命令或代码/密码
举报

更多回帖

发帖
×
20
完善资料,
赚取积分