内部Flash大部分空间是用来存储烧录进单片机的程序代码,因此可以将非代码等无关区域用来存储数据。项目工程的代码量可以通过Keil uVision5软件底下框查看,如下图所示。一般只需参考代码量(Code)以及只读数据(RO-data)即可。
由于本设计需要存储的内容需求不大,仅要求存放修改成功的密码,故采用内部Flash模拟EEPROM,实现单片机断电后重新上电时,修改成功的密码仍然有效。无需购置外部存储器EEPROM模块(W25QXX)等,减少一定的成本,并且使得存储变得简单方便。相关的函数如下:
/* 静态函数(仅限stmflash.c调用) */static void stmflash_unlock(void); /* 解锁STM32 内部FLASH */static void stmflash_lock(void); /* 锁定STM32 内部FLASH */static uint8_t stmflash_get_error_status(void); /* 获取FLASH错误状态 */static uint8_t stmflash_wait_done(uint32_t time); /* 等待操作完成 */static uint8_t stmflash_erase_sector(uint32_t saddr); /* 擦除扇区 */static uint8_t stmflash_write_halfword(uint32_t faddr, uint16_t data); /* FLASH写半字 */在实际操作时,采用接口函数对Flash某块区域进行读写。/* 接口函数(外部可调用) */uint16_t stmflash_read_halfword(uint32_t faddr); /* FLASH读半字 */void stmflash_read(uint32_t raddr, uint16_t *pbuf, uint16_t length); void stmflash_write(uint32_t waddr, uint16_t *pbuf, uint16_t length); /* 在FLASH 指定位置, 写入指定长度的数据(自动擦除) */
值得注意的是,设置FLASH 保存地址要大于本代码所占用FLASH的大小 + 0X08000000,并且该值必须为整数,才能保证不出错且不覆盖到原先的代码,储存相关内容。另外,STM32F103C8T6属于中容量产品,其闪存(Flash)组织结构如表所示。