Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C STM32F4发现-写入/读取闪存_C_Stm32f4discovery_Flash Memory - Fatal编程技术网

C STM32F4发现-写入/读取闪存

C STM32F4发现-写入/读取闪存,c,stm32f4discovery,flash-memory,C,Stm32f4discovery,Flash Memory,这是我在这里的第一篇文章,如果格式或某些东西有问题,请道歉。按照我们学院的建议,我成功地编写和阅读了STM32F4发现的闪存(两篇文章的解释方式相同): 提前感谢您的帮助。感谢@phyloflash,我得到了答案。调用HAL_FLASH_Program时,指定要写入的数据的大小以及该数据的第一个字节的地址。 在我的例子中,HAL\u FLASH\u程序(TYPEPROGRAM\u WORD,&userConfig[0],data)一个单词表示4个字节,因此写入了userConfig的前4个字节。

这是我在这里的第一篇文章,如果格式或某些东西有问题,请道歉。按照我们学院的建议,我成功地编写和阅读了STM32F4发现的闪存(两篇文章的解释方式相同):


提前感谢您的帮助。

感谢@phyloflash,我得到了答案。调用
HAL_FLASH_Program
时,指定要写入的数据的大小以及该数据的第一个字节的地址。 在我的例子中,
HAL\u FLASH\u程序(TYPEPROGRAM\u WORD,&userConfig[0],data)
一个单词表示4个字节,因此写入了
userConfig
的前4个字节。这也意味着定义为
uint8_t data
的参数必须与要写入的数据大小一致,因此它应该是
uint32_t data

我修改了代码以考虑这些因素。以下代码已被证明有效:

//data type have to be consistent with the TYPEPROGRAM, i.e:
//TYPEPROGRAM_BYTE uint8_t data
//TYPEPROGRAM_HALFWORD uint16_t data
//TYPEPROGRAM_WORD uint32_t data
//TYPEPROGRAM_DOUBLEWORD uint64_t data
void Write_Flash(uint32_t data[],uint8_t flashTypeProgram)

{
     uint8_t addressGap;
     HAL_FLASH_Unlock();
     __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
     FLASH_Erase_Sector(FLASH_SECTOR_6, VOLTAGE_RANGE_3);
     for (i=0;i<64/pow(2, flashTypeProgram);i++)
     {
         addressGap=pow(2, flashTypeProgram)*i;
         HAL_FLASH_Program(flashTypeProgram, &userConfig[0]+addressGap, data[i]);
     }
     HAL_FLASH_Lock();
     //TYPEPROGRAM_BYTE        Program byte (8-bit) at a specified address              $0
     //TYPEPROGRAM_HALFWORD    Program a half-word (16-bit) at a specified address      $1
     //TYPEPROGRAM_WORD        Program a word (32-bit) at a specified address           $2
     //TYPEPROGRAM_DOUBLEWORD  Program a double word (64-bit) at a specified address    $3
}
[...]
  flashTypeProgram=TYPEPROGRAM_WORD;
  dataSize=(sizeof dataBuffer) / (sizeof *dataBuffer);
  for (i=0;i<dataSize;i++) {
      dataBuffer[i]=0x1010101;  //0x1010101 puts 1 in each byte of userConfig
  }
  Write_Flash(dataBuffer,flashTypeProgram);
//数据类型必须与TYPEPROGRAM一致,即:
//类型程序字节uint8数据
//类型程序半字uint16数据
//类型程序字uint32数据
//类型程序双字uint64数据
无效写入闪存(uint32数据[],uint8闪存类型程序)
{
uint8_t地址间隙;
HAL_FLASH_Unlock();
__HAL_FLASH_CLEAR_标志(FLASH_标志| EOP | FLASH_标志| Oper | FLASH_标志| WRPERR | FLASH_标志| FLASH_标志| PGSERR);
闪存擦除扇区(闪存扇区6,电压范围3);

对于(i=0;据我所知,NAND闪存设备对单个写入的大小有一些限制。闪存必须以扇区大小而不是字节大小写入(它不是字节可寻址的)。因此,我建议您尝试写入1个以上的字节,并尝试看看是否成功。另请参阅
__attribute__((__section__(".user_data"))) const char userConfig[64];
[...]
void Write_Flash(uint8_t data, uint8_t i)
    {
         HAL_FLASH_Unlock();
         __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
         FLASH_Erase_Sector(FLASH_SECTOR_6, VOLTAGE_RANGE_3);
         HAL_FLASH_Program(TYPEPROGRAM_WORD, &userConfig[i], data);
         HAL_FLASH_Lock();
    }
[...]
dataSize=(sizeof dataBuffer) / (sizeof *dataBuffer);
for (i=0;i<dataSize;i++) {
      dataBuffer[i]=i+1;
      Write_Flash(dataBuffer[i],i);
  }
//data type have to be consistent with the TYPEPROGRAM, i.e:
//TYPEPROGRAM_BYTE uint8_t data
//TYPEPROGRAM_HALFWORD uint16_t data
//TYPEPROGRAM_WORD uint32_t data
//TYPEPROGRAM_DOUBLEWORD uint64_t data
void Write_Flash(uint32_t data[],uint8_t flashTypeProgram)

{
     uint8_t addressGap;
     HAL_FLASH_Unlock();
     __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR | FLASH_FLAG_PGSERR );
     FLASH_Erase_Sector(FLASH_SECTOR_6, VOLTAGE_RANGE_3);
     for (i=0;i<64/pow(2, flashTypeProgram);i++)
     {
         addressGap=pow(2, flashTypeProgram)*i;
         HAL_FLASH_Program(flashTypeProgram, &userConfig[0]+addressGap, data[i]);
     }
     HAL_FLASH_Lock();
     //TYPEPROGRAM_BYTE        Program byte (8-bit) at a specified address              $0
     //TYPEPROGRAM_HALFWORD    Program a half-word (16-bit) at a specified address      $1
     //TYPEPROGRAM_WORD        Program a word (32-bit) at a specified address           $2
     //TYPEPROGRAM_DOUBLEWORD  Program a double word (64-bit) at a specified address    $3
}
[...]
  flashTypeProgram=TYPEPROGRAM_WORD;
  dataSize=(sizeof dataBuffer) / (sizeof *dataBuffer);
  for (i=0;i<dataSize;i++) {
      dataBuffer[i]=0x1010101;  //0x1010101 puts 1 in each byte of userConfig
  }
  Write_Flash(dataBuffer,flashTypeProgram);