个人技术分享

        内部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)组织结构如表所示。