#ifndef __LHL_FLASH_H__ #define __LHL_FLASH_H__ //系统宏重定义 #define FLASH_PAGE_SIZE_MAX FLASH_PAGE_SIZE //0x1000 每页最大字节 4k 4096byte //系统宏定义 #define FLASH_PAGE_MAXZISE 30 //最大页数 120K 共30页(0-29页) #define APP_PAGE 4 //程序页页码 默认值,从0X8000000开始 若有bootLoader先占0x4000 即4页,从0X8004000开始 #define USER_PARAMS_PAGE 19 //用户数据页页码 #define USER_PARAMS_ADDR (FLASH_START_ADDRESS + (FLASH_PAGE_SIZE_MAX*USER_PARAMS_PAGE)) //FLASH实际地址 用户参数存储位置 #define USER_DCOEF_TAG_PAGE 20 //二次修正标签页页码 #define USER_DCOEF_TAG_ADDR (FLASH_START_ADDRESS + (FLASH_PAGE_SIZE_MAX*USER_DCOEF_TAG_PAGE))//FLASH实际地址 二次修正标签页 #define CORRECT_PAGE_NUM (CALIB_STORED_SIZE / FLASH_PAGE_SIZE_MAX) //计算实际校准数据占用页数 校准数据存储大小/每页大小 #define CORRECT_DATA_PAGE (FLASH_PAGE_MAXZISE - CORRECT_PAGE_NUM) //校准数据页起始页页码 #define CORRECT_DATA_ADDR (FLASH_START_ADDRESS + (FLASH_PAGE_SIZE_MAX*CORRECT_DATA_PAGE)) //校准参数存储位置 #define CALIB_STORED_SIZE CALIB_REAL_SIZE #define USER_REG_COUNT USER_INX_MAX //用户寄存器(双字节)个数 336 #define USER_REG_SIZE (USER_REG_COUNT * REG_WORD_WIDTH) //USER参数区总大小 1008 bytes #define WORD_REG_COUNT WORD_INX_MAX //双字节寄存器个数 128 #define WORD_REG_SIZE (WORD_REG_COUNT * REG_WORD_WIDTH) //WORD参数区总大小 384 bytes #define DWORD_REG_COUNT DWORD_INX_MAX// 四字节寄存器个数 //64 #define DWORD_REG_SIZE (DWORD_REG_COUNT * REG_DWORD_WIDTH) //DWORD参数区总大小 320 bytes #define TOTAL_PARAM_SIZE (WORD_REG_SIZE + DWORD_REG_SIZE + USER_REG_SIZE) //参数区总大小 1712bytes 对应内存大小 ///**********************************************************************************************************************/ ////默认校准曲线配置 //// ====== 基础配置(按实际需求调整)====== //#define CALIB_COMP_FAC 3 // 压缩比 必须>0 值越大,压缩越强,Flash占用越少,损失精度 //#define CALIB_WIDTH 64 // 每帧数据字节宽度 建议32/64/128,必须整除CALIB_SIZE //#define CALIB_MAX_INDEX_REQ 5800 // 24000 // 算法要求的合适内码 //// ====== 存储介质配置=================== //// 预留 2*CALIB_COMP_FAC 个内码空间(协议要求) //#define CALIB_SIZE_MIN_RAW ((CALIB_MAX_INDEX_REQ + 2 * CALIB_COMP_FAC) * 3)//#define BYTES_PER_INDEX 3 // 每个内码占3字节,这是常量不可更改!!!(协议内码格式:[H,M,L]) //// 由算法需求反推最小存储需求 //// 压缩后最小存储空间(向上取整) //#define CALIB_STORED_MIN (((CALIB_SIZE_MIN_RAW) + CALIB_COMP_FAC - 1) / CALIB_COMP_FAC) //// 向上对齐到Flash页 //#define CALIB_STORED_SIZE (((CALIB_STORED_MIN + FLASH_PAGE_SIZE_MAX - 1) / FLASH_PAGE_SIZE_MAX) * FLASH_PAGE_SIZE_MAX) //实际存储大小 ////EEPROM:无需页对齐,但需向上取整压缩后空间 ////#define CALIB_STORED_SIZE (((CALIB_SIZE_MIN_RAW) + CALIB_COMP_FAC - 1) / CALIB_COMP_FAC) //// ====== 推导参数====================== //// CALIB_STORED_SIZE 无论是EEPROM还是Flash都用该值作为最大空间,可以稍微计算一下空间是否足够 //#define CALIB_SIZE (CALIB_STORED_SIZE * CALIB_COMP_FAC)// 实际原始数据总量(字节)= 存储空间*压缩比 //#define CALIB_DEPTH (CALIB_SIZE / CALIB_WIDTH) // 原始数据总帧数 //#define CALIB_MAX_INDEX ((CALIB_SIZE / 3) - (2 * CALIB_COMP_FAC)) // 实际支持的最大内码(Flash下会≥需求值) //#if ((CALIB_DEPTH) % (CALIB_COMP_FAC)) != 0 // #error "CALIB_DEPTH must be divisible by CALIB_COMP_FAC!" //#endif //#if (CALIB_SIZE % CALIB_WIDTH) != 0 // #error "CALIB_SIZE must be divisible by CALIB_WIDTH! Adjust page count or width." //#endif ///**********************************************************************************************************************/ //#ifndef ENABLE_2ND_CURVE //#pragma message("[undefined] ENABLE_2ND_CURVE") //#elif(ENABLE_2ND_CURVE) ////校准曲线2配置 //// ====== 基础配置(按实际需求调整)====== //#define CALIB_COMP_FAC2 3 // 压缩比 值越大,压缩越强,Flash占用越少,损失精度 //#define CALIB_WIDTH2 64 // 每帧数据字节宽度 建议32/64/等,必须整除CALIB_SIZE //#define CALIB_MAX_INDEX_REQ2 24000 // 算法要求的最小最大内码 //// ====== 存储介质配置=================== //// 预留 2*CALIB_COMP_FAC 个内码空间(协议要求) //#define CALIB_SIZE_MIN_RAW2 ((CALIB_MAX_INDEX_REQ2 + 2 * CALIB_COMP_FAC2) * 3)//协议内码格式:[H,M,L]) //// 由算法需求反推最小存储需求 //// 压缩后最小存储空间(向上取整) //#define CALIB_STORED_MIN2 (((CALIB_SIZE_MIN_RAW2) + CALIB_COMP_FAC2 - 1) / CALIB_COMP_FAC2) //// 向上对齐到Flash页 //#define CALIB_STORED_SIZE2 (((CALIB_STORED_MIN2 + FLASH_PAGE_SIZE_MAX - 1) / FLASH_PAGE_SIZE_MAX) * FLASH_PAGE_SIZE_MAX) //实际存储大小 //#define CORRECT_PAGE_NUM2 (CALIB_STORED_SIZE2 / FLASH_PAGE_SIZE_MAX) //计算实际校准数据占用页数 校准数据存储大小/每页大小 //// ====== 推导参数====================== //// CALIB_STORED_SIZE 无论是EEPROM还是Flash都用该值作为最大空间,可以稍微计算一下空间是否足够 //#define CALIB_SIZE2 (CALIB_STORED_SIZE2 * CALIB_COMP_FAC2)// 实际原始数据总量(字节)= 存储空间*压缩比 //#define CALIB_DEPTH2 (CALIB_SIZE2 / CALIB_WIDTH2) // 原始数据总帧数 //#define CALIB_MAX_INDEX2 ((CALIB_SIZE2 / 3) - (2 * CALIB_COMP_FAC2)) // 实际支持的最大内码(Flash下会≥需求值) //#if (CALIB_DEPTH2 % CALIB_COMP_FAC2) != 0 // #error "CALIB_DEPTH must be divisible by CALIB_COMP_FAC!" //#endif //#if (CALIB_SIZE2 % CALIB_WIDTH2) != 0 // #error "CALIB_SIZE must be divisible by CALIB_WIDTH! Adjust page count or width." //#endif //#endif ///**********************************************************************************************************************/ // #ifndef ENABLE_3RD_CURVE //#pragma message("[undefined] ENABLE_2ND_CURVE") //#elif(ENABLE_3RD_CURVE) ////校准曲线2配置 //// ====== 基础配置(按实际需求调整)====== //#define CALIB_COMP_FAC3 3 // 压缩比 值越大,压缩越强,Flash占用越少,损失精度 //#define CALIB_WIDTH3 64 // 每帧数据字节宽度 建议32/64/等,必须整除CALIB_SIZE //#define CALIB_MAX_INDEX_REQ3 24000 // 算法要求的最小最大内码 //// ====== 存储介质配置=================== //// 预留 2*CALIB_COMP_FAC 个内码空间(协议要求) //#define CALIB_SIZE_MIN_RAW3 ((CALIB_MAX_INDEX_REQ3 + 2 * CALIB_COMP_FAC3) * 3)//协议内码格式:[H,M,L]) //// 由算法需求反推最小存储需求 //// 压缩后最小存储空间(向上取整) //#define CALIB_STORED_MIN3 (((CALIB_SIZE_MIN_RAW3) + CALIB_COMP_FAC3 - 1) / CALIB_COMP_FAC3) //// 向上对齐到Flash页 //#define CALIB_STORED_SIZE3 (((CALIB_STORED_MIN3 + FLASH_PAGE_SIZE_MAX - 1) / FLASH_PAGE_SIZE_MAX) * FLASH_PAGE_SIZE_MAX) //实际存储大小 //#define CORRECT_PAGE_NUM3 (CALIB_STORED_SIZE3 / FLASH_PAGE_SIZE_MAX) //计算实际校准数据占用页数 校准数据存储大小/每页大小 //// ====== 推导参数====================== //// CALIB_STORED_SIZE 无论是EEPROM还是Flash都用该值作为最大空间,可以稍微计算一下空间是否足够 //#define CALIB_SIZE3 (CALIB_STORED_SIZE3 * CALIB_COMP_FAC3)// 实际原始数据总量(字节)= 存储空间*压缩比 //#define CALIB_DEPTH3 (CALIB_SIZE3 / CALIB_WIDTH3) // 原始数据总帧数 //#define CALIB_MAX_INDEX3 ((CALIB_SIZE3 / 3) - (2 * CALIB_COMP_FAC3)) // 实际支持的最大内码(Flash下会≥需求值) //#if (CALIB_DEPTH3 % CALIB_COMP_FAC3) != 0 // #error "CALIB_DEPTH must be divisible by CALIB_COMP_FAC!" //#endif //#if (CALIB_SIZE3 % CALIB_WIDTH3) != 0 // #error "CALIB_SIZE must be divisible by CALIB_WIDTH! Adjust page count or width." //#endif //#endif ///**********************************************************************************************************************/ void update_param_bufferFromFlash(void);//重要 u16 ReadShortParameterFromFlash(u16 parameterAdr , u16 parameterDefault); u32 ReadLongParameterFromFlash(u16 parameterAdr , u16 parameterDefault); void ReadMultiByteFromFlash(u16 address,u8 *wrtData, u16 dataLenth, u8 flashAdr); u16 WriteShortParameterToFlash(u16 parameterAdr); u32 WriteLongParameterToFlash(u16 parameterAdr); void WriteMultiByteToFlash(u16 address, u8 *wrtData, u16 dataLenth, u8 flashAdr); /*-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ #endif