Files
CHJ/user/MCU/lhl_flash.h
2026-03-20 21:16:58 +08:00

156 lines
8.3 KiB
C
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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