156 lines
8.3 KiB
C
156 lines
8.3 KiB
C
#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
|
||
|
||
|