2026-03-20 21:09:48 +08:00
|
|
|
|
#include "../main/SystemInclude.h"
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>һҳ<D2BB><D2B3><EFBFBD><EFBFBD>(ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31>ҳ<EFBFBD>棬<EFBFBD><E6A3AC>Endpage<67><65>Startpage<67><65>ͬ<EFBFBD><CDAC>
|
|
|
|
|
|
void FLASH_Erase_Data_Page(u8 UserPage)
|
|
|
|
|
|
{
|
|
|
|
|
|
u32 flashAddr = FLASH_PAGE_29;
|
|
|
|
|
|
switch(UserPage)
|
|
|
|
|
|
{
|
|
|
|
|
|
case USER_DCOEF_TAG_PAGE:flashAddr= USER_DCOEF_TAG_ADDR; break;
|
|
|
|
|
|
case USER_PARAMS_PAGE :flashAddr= USER_PARAMS_ADDR ; break;
|
|
|
|
|
|
case VENDER_PARAMS_PAGE :flashAddr= VENDER_PARAMS_ADDR ; break;
|
|
|
|
|
|
default : return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if(LHL_FLASH_Erase(flashAddr, flashAddr, LHL_LNG_TIMEOUT) != LHL_OK)
|
|
|
|
|
|
{
|
|
|
|
|
|
while(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-03-20 21:09:48 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>ҳд<D2B3><D0B4>
|
|
|
|
|
|
void FLASH_Write_Data_Page(u8 UserPage, void *pBuffer, u32 byteSize)
|
2026-03-20 21:09:48 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
//1 <20><>ַӳ<D6B7><D3B3>
|
|
|
|
|
|
uint32_t flashAddr = 0;
|
|
|
|
|
|
switch(UserPage)
|
|
|
|
|
|
{
|
|
|
|
|
|
case USER_DCOEF_TAG_PAGE: flashAddr = USER_DCOEF_TAG_ADDR ; break;
|
|
|
|
|
|
case USER_PARAMS_PAGE : flashAddr = USER_PARAMS_ADDR ; break;
|
|
|
|
|
|
case VENDER_PARAMS_PAGE : flashAddr = VENDER_PARAMS_ADDR ; break;
|
|
|
|
|
|
default : return;
|
|
|
|
|
|
}
|
|
|
|
|
|
//2 <20><><EFBFBD>϶<EFBFBD><CFB6>뵽 4 <20>ֽ<EFBFBD>
|
|
|
|
|
|
u32 wordCount = (byteSize + 3U)/4U; // <20>ȼ<EFBFBD><C8BC><EFBFBD> ((byteSize + 3) & ~3) / 4
|
|
|
|
|
|
//3 <20><><EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD><EFBFBD><EFBFBD>һҳ<D2BB><D2B3>word <20><><EFBFBD><EFBFBD>
|
|
|
|
|
|
if (wordCount > FLASH_PAGE_SIZE/4U) wordCount = FLASH_PAGE_SIZE/4U;
|
|
|
|
|
|
//4 д<><D0B4>
|
|
|
|
|
|
if(LHL_FLASH_Program(flashAddr ,(u32 *)pBuffer, (u16)wordCount, LHL_LNG_TIMEOUT) != LHL_OK)
|
|
|
|
|
|
{
|
|
|
|
|
|
while(1);
|
|
|
|
|
|
}
|
2026-03-20 21:09:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Application ******************************************************************
|
|
|
|
|
|
//API
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>̶<EFBFBD><CCB6><EFBFBD>ַ<EFBFBD><D6B7>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
volatile u8 * const USER_PARAMS = (u8*)USER_PARAMS_ADDR;
|
|
|
|
|
|
volatile u8 * const VENDER_PARAMS = (u8*)VENDER_PARAMS_ADDR;
|
|
|
|
|
|
volatile u8 * const CORRECT_DATA = (u8 *)CORRECT_DATA_ADDR;
|
|
|
|
|
|
volatile u8 * const CORRECT2_DATA = (u8 *)CORRECT2_DATA_ADDR;
|
|
|
|
|
|
|
|
|
|
|
|
// ͨ<>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|
|
|
|
|
void ReadParameterFromFlash( void *value,u16 offset, u8 size ,u8 UserPage )
|
2026-03-20 21:09:48 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
if(offset + size <= FLASH_PAGE_BYTE_SIZE) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һҳ<D2BB><D2B3>С
|
2026-03-20 21:09:48 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
switch(UserPage)
|
|
|
|
|
|
{
|
|
|
|
|
|
case USER_PARAMS_PAGE :memcpy(value,(void*)&USER_PARAMS[offset] , size);break; //<2F><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ҳ
|
|
|
|
|
|
case VENDER_PARAMS_PAGE :memcpy(value,(void*)&VENDER_PARAMS[offset], size);break; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳ
|
|
|
|
|
|
default : break ;
|
|
|
|
|
|
}
|
2026-03-20 21:09:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
//APP
|
|
|
|
|
|
u8 mucSaveParams; //Flash״̬<D7B4><CCAC>־
|
|
|
|
|
|
u8 munWriteParams;//Flashд<68>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־
|
|
|
|
|
|
|
|
|
|
|
|
#define ParamsBufSize FLASH_PAGE_BYTE_SIZE/4u //4K<34><4B>С(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>1K)
|
|
|
|
|
|
u8 unParamsBuf[ParamsBufSize]; //<2F><><EFBFBD>ڰ<EFBFBD>byte<74>洢flashҳ<68>м仺<D0BC><E4BBBA>
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD>(<28><><EFBFBD>ϵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) */
|
|
|
|
|
|
void SaveSysParams(void)
|
2026-03-20 21:09:48 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
if(munWriteParams == WP_NOT) return;//<2F><>д<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|
|
|
|
|
//0- <20>Ƿ<EFBFBD><C7B7>ָ<EFBFBD>Ĭ<EFBFBD><C4AC>ֵ
|
|
|
|
|
|
if(munWriteParams == WP_DEF)//<2F>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>ָ<EFBFBD>Ĭ<EFBFBD><C4AC>ֵ
|
|
|
|
|
|
{
|
|
|
|
|
|
mucSaveParams = PARAMS_ING;//д<><D0B4><EFBFBD><EFBFBD>
|
|
|
|
|
|
memcpy(unParamsBuf, (void*)VENDER_PARAMS, ParamsBufSize);//<2F><>Flash<73><68><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҳװ<D2B3><D7B0>unParamsBuf
|
|
|
|
|
|
FLASH_Erase_Data_Page(USER_PARAMS_PAGE);//<2F><><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ҳ
|
|
|
|
|
|
FLASH_Write_Data_Page(USER_PARAMS_PAGE, unParamsBuf, ParamsBufSize);//<2F><>unParamsBufд<66><D0B4><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>ҳ
|
|
|
|
|
|
munWriteParams = WP_NOT; //<2F>ָ<EFBFBD><D6B8><EFBFBD>д<EFBFBD><D0B4>״̬
|
|
|
|
|
|
mucSaveParams = PARAMS_COMPL;//Flashд<68><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//1- <><D7BC><EFBFBD><EFBFBD>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD>FLASH<53><48><EFBFBD><EFBFBD>
|
|
|
|
|
|
//1-1 <20><>Flash<73><68><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD>
|
|
|
|
|
|
memcpy(unParamsBuf, (void*)USER_PARAMS, ParamsBufSize);
|
|
|
|
|
|
//1-2 ΪunParamsBuf<75><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<DEB8><C4B2>ֵ<EFBFBD><D6B5><EFBFBD>ֵ
|
|
|
|
|
|
memcpy((void *)&unParamsBuf[OFFSET_AIR], &offsetAir, OFFSET_AIR_WIDTH);
|
|
|
|
|
|
memcpy((void *)&unParamsBuf[OFFSET_GAS], &offsetGas, OFFSET_GAS_WIDTH);
|
2026-03-20 21:09:48 +08:00
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
memcpy((void *)&unParamsBuf[SERIES_BASE+SENSOR_SN_WIDTH*1],&meterSN1,SENSOR_SN_WIDTH);
|
|
|
|
|
|
memcpy((void *)&unParamsBuf[SERIES_BASE+SENSOR_SN_WIDTH*2],&meterSN2,SENSOR_SN_WIDTH);
|
|
|
|
|
|
memcpy((void *)&unParamsBuf[SERIES_BASE+SENSOR_SN_WIDTH*3],&meterSN3,SENSOR_SN_WIDTH);
|
|
|
|
|
|
memcpy((void *)&unParamsBuf[SERIES_BASE+SENSOR_SN_WIDTH*4],&meterSN4,SENSOR_SN_WIDTH);
|
|
|
|
|
|
memcpy((void *)&unParamsBuf[SERIES_BASE+SENSOR_SN_WIDTH*5],&meterSN5,SENSOR_SN_WIDTH);
|
|
|
|
|
|
memcpy((void *)&unParamsBuf[SERIES_BASE+SENSOR_SN_WIDTH*6],&meterSN6,SENSOR_SN_WIDTH);
|
|
|
|
|
|
|
2026-03-20 21:09:48 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
//......
|
|
|
|
|
|
//2- <20><>ʼд<CABC><D0B4>Flash
|
|
|
|
|
|
//д<><D0B4><EFBFBD>Ҽ<EFBFBD><D2BC>û<EFBFBD><C3BB><EFBFBD>
|
|
|
|
|
|
if(munWriteParams == WP_VENDER)
|
|
|
|
|
|
{
|
|
|
|
|
|
FLASH_Erase_Data_Page(USER_PARAMS_PAGE);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ҳ
|
|
|
|
|
|
FLASH_Write_Data_Page(USER_PARAMS_PAGE,unParamsBuf, ParamsBufSize);//<2F><>ҳд<D2B3><D0B4>
|
|
|
|
|
|
FLASH_Erase_Data_Page(VENDER_PARAMS_PAGE);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ҳ
|
|
|
|
|
|
FLASH_Write_Data_Page(VENDER_PARAMS_PAGE,unParamsBuf, ParamsBufSize);//<2F><>ҳд<D2B3><D0B4>
|
|
|
|
|
|
}
|
|
|
|
|
|
//д<>û<EFBFBD><C3BB><EFBFBD>
|
|
|
|
|
|
else if(munWriteParams == WP_USER)
|
|
|
|
|
|
{
|
|
|
|
|
|
FLASH_Erase_Data_Page(USER_PARAMS_PAGE);//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ҳ
|
|
|
|
|
|
FLASH_Write_Data_Page(USER_PARAMS_PAGE,unParamsBuf, ParamsBufSize);//<2F><>ҳд<D2B3><D0B4>
|
|
|
|
|
|
}
|
|
|
|
|
|
//д<><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
else if(munWriteParams == WP_DCOEF_TAG)
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
munWriteParams = WP_NOT;//<2F>ָ<EFBFBD><D6B8><EFBFBD>д<EFBFBD><D0B4>״̬
|
|
|
|
|
|
mucSaveParams = PARAMS_COMPL;//Flashд<68><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
2026-03-20 21:09:48 +08:00
|
|
|
|
}
|
2026-03-20 21:19:04 +08:00
|
|
|
|
|
2026-03-20 21:09:48 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
/* дУ<D0A3><D7BC>ָ<EFBFBD><D6B8>ҳ<EFBFBD><D2B3>FLASH<53><48><EFBFBD>ݣ<EFBFBD>ÿ<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>һ֡<D2BB>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
void FLASH_Write_Calib_Data_ToFlash(u16 FrameN, u8 *pBuffer )
|
2026-03-20 21:09:48 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
u32 ADDR;
|
|
|
|
|
|
ADDR = FrameN * CALIB_WIDTH + CORRECT_DATA_ADDR;
|
|
|
|
|
|
if((ADDR&0x0FFF) == 0x000)LHL_FLASH_Erase(ADDR,ADDR,LHL_LNG_TIMEOUT);//ADDR<44><52>ҳ<EFBFBD><D2B3>ADDRΪҳ<CEAA><EFBFBD>ַ
|
2026-03-20 21:09:48 +08:00
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
if(ADDR >(CORRECT_DATA_ADDR+CALIB_REAL_SIZE)) MBBuf.BusError = SLAVE_DEVICE_FAILURE;
|
|
|
|
|
|
|
2026-03-20 21:09:48 +08:00
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
LHL_FLASH_Program(ADDR,(u32 *)pBuffer,CALIB_WIDTH/4u ,LHL_LNG_TIMEOUT);
|
2026-03-20 21:09:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
/* дУ<D0A3><D7BC>ָ<EFBFBD><D6B8>ҳ<EFBFBD><D2B3>FLASH<53><48><EFBFBD>ݣ<EFBFBD>ÿ<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>һ֡<D2BB>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
|
void FLASH_Write_Calib2_Data_ToFlash(u16 FrameN, u8 *pBuffer )
|
2026-03-20 21:09:48 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
u32 ADDR;
|
|
|
|
|
|
ADDR = FrameN * CALIB_WIDTH + CORRECT2_DATA_ADDR;
|
|
|
|
|
|
if((ADDR&0x0FFF) == 0x000)LHL_FLASH_Erase(ADDR,ADDR,LHL_LNG_TIMEOUT);//ADDR<44><52>ҳ<EFBFBD><D2B3>ADDRΪҳ<CEAA><EFBFBD>ַ
|
2026-03-20 21:09:48 +08:00
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
if(ADDR >(CORRECT2_DATA_ADDR+CALIB_REAL_SIZE))MBBuf.BusError = SLAVE_DEVICE_FAILURE;
|
|
|
|
|
|
LHL_FLASH_Program(ADDR,(u32*)pBuffer ,CALIB_WIDTH/4u ,LHL_LNG_TIMEOUT );
|
|
|
|
|
|
}
|
2026-03-20 21:09:48 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
/* <20><>ҳ<EFBFBD><D2B3>У<D0A3><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
|
void ReadCalibDataFromFlash(u32 frameN , u8 *data ,u16 size )
|
2026-03-20 21:09:48 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
memcpy(data,(void*)&CORRECT_DATA[frameN*size], size);
|
2026-03-20 21:09:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
void ReadCalib2DataFromFlash(u32 frameN , u8 *data ,u16 size )
|
|
|
|
|
|
{
|
|
|
|
|
|
memcpy(data,(void*)&CORRECT2_DATA[frameN*size], size);
|
2026-03-20 21:09:48 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-03-20 21:19:04 +08:00
|
|
|
|
/******************************************************************************/
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡУ<D0A3><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
|
void ReadDataFromFlash(u32 offset , u8 *data ,u16 size )
|
2026-03-20 21:09:48 +08:00
|
|
|
|
{
|
2026-03-20 21:19:04 +08:00
|
|
|
|
memcpy(data,(void*)&CORRECT_DATA[offset], size);
|
|
|
|
|
|
// if(offsetAir)memcpy(data,(void*)&CORRECT_DATA[offset], size);
|
|
|
|
|
|
// else memcpy(data,(void*)&CORRECT2_DATA[offset], size);
|
2026-03-20 21:09:48 +08:00
|
|
|
|
}
|