c-通过闪存仿真STM32F1 EEPROM

时间:2018-07-02 15:48:16

标签: c emulation stm32 flash-memory eeprom

例如,我尝试通过STM32F1上的闪存模拟EEPROM,如here(对于STM32F4)所述,但是我正在努力更改STM32F1RB(中等密度)规格的代码。我正在使用SW4STM32,CubeMX和HAL API。

__attribute__((__section__(".user_data"))) const char userConfig[64];

//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);

我研究了使用HAL API将数据写入闪存的方法,但是由于我不想“破坏”我的电路板,弄乱了错误的存储器部分,因此我想确保在尝试之前了解所有内容我自己的。

首先,假设我要存储5 KB的数据。我应该如何允许数据区域?从主存储区的末尾开始?例如,我可以为数据分配页面127至122?这样吗?

MEMORY
 {
   DATA (RWX)      : ORIGIN = 0x08048800, LENGTH = 5k      /* 0x08048000 is the beginning of page 107 */
   ...
}

允许5页闪存存储是否很好?

接下来,我不太清楚这行:

__attribute__((__section__(".user_data"))) const char userConfig[64];

我得到的是使用户能够读取Flash存储的数据,但是为什么要这样分配呢?我的意思是64 * sizeof(char)= 64个字节,对吗?他如何只分配64个字节以供读取,同时又允许128 kB的存储空间?

预先,谢谢!

1 个答案:

答案 0 :(得分:1)

首先,您应该说您正在尝试在Data Flash中写一些东西。主要区别在于您必须擦除整个页面才能写东西。在将数据复制到EEPROM的过程中,没有这种限制。

我看到您仅在使用其他人的HAL库,并且我想您无法完全控制自己在做什么。 请参考STM32F1xx的Flash编程手册。其中列出了在数据Flash编程过程中应做的工作以及重要的寄存器。

别害怕,你不会破坏任何东西。

请不要在以下部分进行修改。它仅表示Flash从何处开始以及有多少字节。您只会对修改Flash内容的代码(您将编写的代码)感兴趣。

MEMORY
{
   DATA (RWX)      : ORIGIN = 0x08048800, LENGTH = 5k      /* 0x08048000 is the beginning of page 107 *

我前面没有HAL API,但我想它需要一个整数作为写入数据的地址。

首先,请将您的代码简化为最小形式。从循环中退出并尝试仅编程一个半字(2个字节)-该CPU中的编程是对半字执行的,因此您的地址必须对齐为两个。

下面的行只是一些内存的声明。您不需要对数据闪存进行编程。

 __attribute__((__section__(".user_data"))) const char userConfig[64];

您是否浏览过我推荐给您的手册?