对STM32内部的flash进行结构体数据存储,和读取。方便小型工程的数据掉电保存。 在初次使用的时候进行自动初始化默认值,后续掉电就不会再初始化了。
代码中的DATA_STORE需要自行定义结构体变量。
#include "store.h" #define FLASH_START 0x0803D800//flash起始地址 extern STORE_SHEET DATA_STORE;//数据存储结构体 extern u16 crc_cal_by_byte(const u8* ptr, u32 len,u16 crc);//CRC校验函数 static u32 size = sizeof(STORE_SHEET); void WriteDataToFlash(void){//写函数 int i = 0; FLASH_Unlock(); FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPTERR | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR); FLASH_ErasePage(FLASH_START); for (i = 0; i < size/4; i++) FLASH_ProgramWord(FLASH_START+4 * i, *((u32 *)(((u8 *)&DATA_STORE) + 4 * i))); //必须写入整字 FLASH_Lock(); } //================================================================================================================== //++++++++++++++读写安全套接层 //================================================================================================================== void READ_CHECK(void)//读安全校验 { u8 cnt = 0; taskENTER_CRITICAL(); do memcpy((char *)(&DATA_STORE), (void *)(FLASH_START), size); while(crc_cal_by_byte(((u8 *)&DATA_STORE) + 4, size - 8,998) != DATA_STORE.u32Crc&&cnt++ < 10); taskEXIT_CRITICAL(); } void WRITE_CHECK(void)//写安全校验 { u8 cnt = 0; taskENTER_CRITICAL(); do{ DATA_STORE.u32Crc = crc_cal_by_byte(((u8 *)&DATA_STORE) + 4, sizeof(DATA_STORE) - 8,998); /*CRC CALCULATE*/ WriteDataToFlash(); }while(crc_cal_by_byte(((u8 *)FLASH_START) + 4, size - 8,998) != DATA_STORE.u32Crc&&cnt++ < 10); taskEXIT_CRITICAL(); } //================================================================================================================== //++++掉电数据体初始化默认值++++++数据读出接口++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ //================================================================================================================== void STORE_ConfigInitPara(void) { READ_CHECK(); if(DATA_STORE.MAGIC != MAGIC_FLAG) { memset(&DATA_STORE,0,sizeof(STORE_SHEET)); DATA_STORE.MAGIC = MAGIC_FLAG;//初始化掉电数据宏 //============================================================== //==F410 掉电保存初值 ==// //--TIMER DATA_STORE.STD_TIME = 14400; //关机定时发送时间 14400s DATA_STORE.HEART = 10; //--WIFI memset(DATA_STORE.WIFI.SSID,0,32); memset(DATA_STORE.WIFI.PWD,0,32); memcpy(DATA_STORE.WIFI.SSID, "Langyun",7); memcpy(DATA_STORE.WIFI.PWD, "hfly8888",8); //--LIMITER DATA_STORE.LIMITER.POWER_LIMIT = 11.5; //低电电压 DATA_STORE.LIMITER.SPEED_LIMIT = 15; //速度限制 DATA_STORE.LIMITER.LOCK_ACTION =0; //1正常使用 //0强制关机 //--GPS DATA_STORE.GPSS.latitude = 31.782533; DATA_STORE.GPSS.longitude = 117.34911; //--FLASH_StoreBuffer_cnt DATA_STORE.HIS.ADDO = 0; //Address where data starts DATA_STORE.HIS.ADDW = 0; //Address where data ends //执行写入 STORE_DATA(); } } static _Bool restore = false; //====================================================数据存入接口 u8 STORE_DATA(void) { DATA_STORE.MAGIC = MAGIC_FLAG; if(restore) DATA_STORE.MAGIC = 0xffffffff;//清除掉电数据恢复出厂设置 WRITE_CHECK();//写安全校验 return 1; } //===================================================主动重新初始化掉电数据配置 void set_restore(void) { restore = true; }