为了让数据不再掉电清零,百度一堆终于找到一个解决方案,调试一天,终于调试成功这个功能了。为了防止忘记(节约大家像我一样白忙活的时间)写个博客记录一下,首先打开.map文件。找不到的编译
成功后双击上图就会弹出来,如果没有就找到编译生成的文件夹,在hex文件下面,打开map文件,滑到最下面,可以看到程序所占内存有多大,如图
18840转化为16进制为4998,所以程序所占空间加上0x08000000等于0x08004998,数一数看看在第几页
之后,在没用到的空间里进行擦除和写入操作即可。
代码实现
1.给flash开锁
HAL_FLASH_Unlock();
2.进行擦除
uint32_t SECTORError = 0;//标志位
FLASH_EraseInitTypeDef EraseInitStruct;
EraseInitStruct.Banks=FLASH_BANK_1;//bank块1
EraseInitStruct.NbPages=2;//清除两个页
EraseInitStruct.Page=31;//从第31页开始
EraseInitStruct.TypeErase=FLASH_TYPEERASE_PAGES;//选择清除方式为页
status=HAL_FLASHEx_Erase(&EraseInitStruct , &SECTORError);
3.写入新数据
status=HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, 0x0800F800, 0x1234567812121122);//属性分别为,写入格式32、64位(好像只能写入64位的),写入地址(和刚才清除的区域对应),写入数据,64位。
4.给flash关锁
HAL_FLASH_Lock();
5.查看写入数据
uint64_t *p,kkknd=0x000000123;
p=(uint64_t *)(0x0800F800);
kkknd=*p;
成功如图