如何使用STM32芯片读取和写入FLASH字节

时间:2015-08-01 09:37:42

标签: stm32

例如,我有一个需要保存到闪存的计数器值,重新启动后我想再次读取该计数器。我是ARM处理器的新手。我正在使用HAL驱动程序。

类似于:

s8 adl_flhRead( ascii * Handle, u16 ID, u16 Len, u8 * ReadData );

s8 adl_flhWrite( ascii * Handle, u16 ID, u16 Len, u8 * WriteData );

1 个答案:

答案 0 :(得分:2)

您需要对闪存写入的工作原理有一些基本的了解 - 它不像写入RAM那样直接,或者您可以轻松地写入和重写字节的EEPROM。在闪存扇区中,给定字节只能在每次擦除扇区时写入ONCE。你通常不想只重写1个字节来进行全扇区擦除 - 所以通常你会在闪存上写一个api,这样你就可以擦除一次扇区,然后在每次写入时移动字节写入扇区 - 跟踪字节的当前偏移量,以便您知道当前从哪里读取。写/读的草图可能看起来像:

<强>读:
1.擦除的扇区字节将为0xFF。扫描扇区,查找第一个0xFF字节。之前读取并返回字节。
2.如果未找到任何字节(即0xFF),则返回最后一个扇区字节 3.如果第一个扇区字节(因此所有后续字节)都是0xFF,则返回错误 - 扇区为空,没有要读取的数据。

<强>写:
1.扫描扇区,查找第一个字节0xFF - 前一个字节是写入的最后一个字节,这是下一个要写入的字节。
2.如果没有找到字节0xFF,则扇区已满 - 擦除扇区(使用stm32f?xx_flash.c FLASH_Status FLASH_EraseSector(uint32_t FLASH_Sector,uint8_t VoltageRange))并在新擦除的第一个字节中写入字节部门。
3.否则将要记录的数据字节写入位于0xFF字节的位置(使用相同的FLASH_Status FLASH_ProgramByte)。

注意:因为您使用0xFF的擦除闪存值作为标志清除字节,所以不能存储该值,即只能记录0x00到0xFE的字节值。

如果要写入的计数器大于一个字节,可以调整上面的内容来编写固定大小的块(查看stm32f中的其他函数?xx_flash.c)