STM32F1的官方固件库操作FLASH的几个常用函数。这些函数和定义分布在源文件stm32f1xx_hal_flash.c/stm32f1xx_hal_flash_ex.c以及头文件stm32f1xx_hal_flash.h/stm32f1xx_hal_flash_ex.h中。
锁定解函数
对FLASH进行写操作前必须先解锁,解锁操作:在FLASH_KEYR写入特定的序列(KEY1和KEY2),HAL库实现很简单:
HAL_StatusTypeDef HAL_FLASH_Unlock(void);
写操作完成后,要锁定FLASH:
HAL_StatusTypeDef HAL_FLASH_lock(void);
写操作函数
HAL 库提供了一个通用的 FLASH 写操作函数HAL_FLASH_Program,该函数声明如下:
HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram,uint32_t Address,uint64_t Data);
该函数有三个入口参数。
- TypeProgram:区分要写入的数据类型,取值为FLASH_TYPEPROGRAM_BYTE(字节:8 位)FLASH_TYPEPROGRAM_HALFWORD(半字 : 16 位 ) ,FLASH_TYPEPROGRAM_WORD ( 字 : 32 位)和FLASH_TYPEPROGRAM_DOUBLEWORD(双字:64 位)。
- Address设置要写入数据的FLASH地址。
- Data,要写入的数据类型,参数默认是64位的,如果小于64位,会进行类型转换。
擦除函数
HAL 库提供的擦除函数在 stm32f1xx_hal_flash_ex.c 中定义。和编程函数一样,HAL 提供了一个通用的基于小区擦除的函数 HAL_FLASHEx_Erase,该函数声明如下:
HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);
typedef struct
{
uint32_t TypeErase; //擦除类型
uint32_t Banks; //擦除的 Bank 编号
uint32_t PageAddress; //擦除页面地址
uint32_t NbPages; //擦除的页面数
} FLASH_EraseInitTypeDef;
- TypeErase设置擦除类型,是Page擦除还是BANK级别的批量擦除,取值为FLASH_TYPEERASE_PAGES 或者 FLASH_TYPEERASE_MASSERASE,如果是一次擦除一个 Bank 下面的所有 Page,那么需要选择 FLASH_TYPEERASE_MASSERASE。
- Banks设置要擦除的Bank编号,只有设置为批量擦除的时候才有效。
- PageAddress要擦除页面的地址。
- NbPages要擦除的页面数。
等待操作完成函数
在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;
即在进行写或擦除操作时,不能进行代码或数据的读取操作。
在每次操作之前,都要等待上一次操作完成,才能开始。
HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);
该函数在HAL库中很多地方用到,比如擦除函数HAL_FLASHEx_Erase中对FLASH进行擦除操作后会调用该函数,等待擦除操作完成。文章来源:https://www.toymoban.com/news/detail-826121.html
读FLASH特定地址数据函数
函数固件库没有给出来,提供从指定地址读取半个字节:文章来源地址https://www.toymoban.com/news/detail-826121.html
u16 STMFLASH_ReadHalfWord(u32 faddr)
{
return *(vu16 *)faddr;
}
到了这里,关于STM32 Flash学习(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!