STM32通常有着丰富的片上Flash空间,这些空间正常情况下是存放指令代码、常量等烧录数据的。平时我们编译出来的bin或者elf文件会按顺序填充进Flash;hex格式的文件会稍许不同,通常情况下hex文件会更小一些,因为它会将无意义的填充段省略。
一般我们的代码逻辑加上常量数据是远远用不到片上Flash那么大的空间的,因此我们可以划分一些区域用来作为掉电存储空间,实现EEPROM的作用。此外,如果产品需要简单实现AOT固件升级,也需要使用到片上FLASH操作。
在使用STM32的HAL库进行FLASH操作的时候,有以下几点值得注意:
1. 注意顺序
先解锁Flash,再擦除片区,再写入,写完了别忘了加锁。
HAL_FLASH_Unlock();
HAL_FLASHEx_Erase();
HAL_FLASH_Program();
HAL_FLASH_Lock();
2. 擦除相关
HAL_FLASHEx_Erase()函数会入参一个有关清除扇区配置的结构体对象,这个参数对应的结构体定义根据不同芯片的HAL库有所不同,F1/F4/L4均不相同,而且同系列不同Flash大小的芯片所能指向的地址也不相同,同时这里面还存在Sector/Page/Bank等概念,这些概念涉及到一次性所能清除区域的大小,需要适当阅读一下实际使用芯片的Reference manual,比如RM0351(STM32L475),RM0090(STM32F407),RM0008(STM32F103)等,这些文档都会有专门的章节介绍嵌入式Flash的结构,可在ST官网搜索上述代码下载阅读。
在STM32F407VET6上,