读/写结构到闪存

时间:2019-01-11 15:47:49

标签: struct stm32 stm32f4discovery flash-memory stm32f4

我想使用HAL库在STM32F4 Discovery板的C程序中将结构的内容写入闪存。这是我的结构:

typedef struct
{
    RTC_TimeTypeDef time;
    RTC_DateTypeDef date;
    float Data;
} DataLogTypeDef;

我可以选择使用 stm32f4xx_hal_flash.c 库函数一次将Byte,Half-Wo​​rd,Word和Double-Word写入每个内存地址:

HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);

我的结构包含各种数据类型,但是我不确定如何一次仅使用字节,半字,字和双字命令写入内容吗?

2 个答案:

答案 0 :(得分:0)

您拥有的是Flash写入功能,它将写入一个字节,一个字或一个双字。

如果要编写闪存结构,最简单的方法是将其视为字节或字的缓冲区,只要您在同一平台(以及相同的C编译器和编译选项)上以相同的方式读取该结构即可。 )。为什么使用相同的平台?因为不同的计算机平台对于多字节值可以具有不同的字节顺序。为什么编译器和编译器选项相同?因为不同的编译器或不同的选项可能会以不同的方式将数据打包在结构中。

因此请牢记这一点,并牢记您尚未提供有关如何调用Flash Writer的许多细节,您的代码可能看起来像这样,将结构复制到Flash:

id| avg_price | median_price | avg_pp_unit  | median_pp_unit 
--+-----------+--------------+--------------+---------------
1 |   62      |     50       |      6       |      7 
2 |   74      |     60       |      5       |      5

我不知道前两个参数的值是什么,所以我只输入了DataLogTypeDef my_data; ... int i; uint8_t *data_p = &my_data; flash_address = //put first flash address here for ( i = 0; i < sizeof(DataLogTypeDef); i++, data_p++, flash_address++ ) HAL_FLASH_Program(type_byte, flash_address, *data_p); type_byte。我还假设闪存地址是整数形式,并且是字节地址。

如果您想读回该结构,它可能看起来像这样:

flash_address

答案 1 :(得分:0)

不幸的是,Flash lib stm32f4xx_hal_flash.c只能写:

  • 半字(两个字节)
  • 单词
  • 双字

不能逐字节写记录。

我为读写结构编写了两种方法:

void ReadRecord(SensorData *pSD, uint32_t flash_address)
{
    uint32_t *ptr = (uint32_t* )pSD;

  for (int i = 0; i < sizeof(SensorData); i+=4, ptr++, flash_address+=4 )   
     *ptr = FlashRead(flash_address);
}

void WriteRecord(SensorData *pSD, uint32_t address)
{
    int i;
    uint32_t *pRecord = (uint32_t* )pSD;  
    uint32_t flash_address = address;

    HAL_FLASH_Unlock();
    for(i=0; i<sizeof(SensorData); i+=4, pRecord++, flash_address+=4)
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, flash_address,*pRecord);
    HAL_FLASH_Lock();       
}

他们正在调试器中签入。键入int读写良好,但在逗号后的最后一位或两位数中浮点回读,几乎没有错误。