如何使用STM32芯片读取和写入闪存中的字节

如何使用STM32芯片读取和写入闪存中的字节,stm32,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 ); 您需要对闪存写入的工作原理有一些基本的了解-它不像写入RAM或EEPROM那样简单,在RAM或

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

类似于:

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

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

您需要对闪存写入的工作原理有一些基本的了解-它不像写入RAM或EEPROM那样简单,在RAM或EEPROM中您可以轻松地写入和重新写入一个字节。在闪存扇区中,每次擦除扇区时只能写入一个给定字节。通常情况下,您不希望仅仅为了重写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字节位置写入要记录的数据字节(使用相同的闪存_状态闪存_程序字节)

注意:由于您将擦除的闪存值0xFF用作标志清除字节,因此无法存储此值,即您只能记录0x00到0xFE(包括0x00到0xFE)之间的字节值


如果要写入的计数器大于一个字节,则可以调整上述参数以写入固定大小的块(请参阅stm32f?xx_flash.c中的其他函数)

哪个STM32?flash API在F0、F4等之间有所不同(谢谢,ST)。我使用stm32f103c8t6,在我的情况下如何获取扇区大小或第一个扇区字节地址?