电灯熄灭 物换星移 泥牛入海
单片机为单片机涨价前时代购入的四块STM32F103C8T6之一。
相关库函数
HAL_FLASH_Unlock(); //解锁Flash
HAL_FLASHEx_Erase(&FlashTest,&Error); //擦除对应页(必须先擦除不然写不进去)
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,Addr,*(uint32_t *)(&data));
//以字写入的方式写入
HAL_FLASH_Lock(); //锁上Flash
地址计算
STM32F103C8T6的Flash大小为64K,从0x0800 0000开始计算,最后一个字节的地址为0x0801 8FFF=8000000H+64*400H-1。
Page | Addres |
---|---|
Page0 | 0x0800 0000 - 0x0800 07FF |
… | … |
Page31 | 0x0801 8800 - 0x0801 8FFF |
程序实现
想到以后可能会用到存储控制器参数的需要,这里尝试存储与读取一个浮点数。
存储步骤
uint32_t Addr = 0x8018800;//存储地址
float data = 123.321; //定义测试浮点变量
FLASH_EraseInitTypeDef FlashTest; //定义擦除操作结构体
FlashTest.PageAddress=Addr; //擦除页开始地址,每2K为一页
FlashTest.NbPages=1; //要擦除的页数1页
FlashTest.TypeErase=FLASH_TYPEERASE_PAGES;//页擦除方式
HAL_FLASH_Unlock(); //解锁Flash
HAL_FLASHEx_Erase(&FlashTest,&Error); //擦除对应页(必须先擦除不然写不进去)
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,Addr,*(uint32_t *)(&data));
//以字写入的方式写入,浮点数据要用指针直接写入64位
HAL_FLASH_Lock(); //锁上Flash
读取步骤
float readdata; //定义读取变量
readdata=*(float *)Addr; //利用指针读取浮点数据
其他
- 每次写入必须要对对应页进行擦除操作
- 写入之后如果新的程序较小,没有覆盖到之前的页中,并且没有进行全片擦除,则新程序仍可以读取到之前程序写入的数据。