LL01/code_app_out/Source/bsp/eeprom_cfg.c

461 lines
14 KiB
C
Raw Normal View History

2025-04-26 16:03:23 +08:00
/** ##########################################################################
** Filename :
** Project :
** Module :
** Processor :
** Version :
** Compiler :
** Date/Time :
** Abstract :
** Contents :
** Note :
**
** (c) Copyright dmdz Co.,Ltd
** --------------------------------------------------------------------------
** R E V I S I O N H I S T O R Y
** --------------------------------------------------------------------------
** Date Ver Author Description
** -20230602- --V1.0-- --mingyea--- ----
** #########################################################################*/
/*---------------------------------------------------------------------------
- I N C L U D E F I L E S
----------------------------------------------------------------------------*/
#include "eeprom.h"
#include "common_cfg.h"
#include "common_memory.h"
#include "error.h"
#include "gpio.h"
#include "wdog.h"
#include "nvm.h"
#include "eeprom_state_machine.h"
#ifdef NVM_EEPROM_EXT_EN
/*---------------------------------------------------------------------------
- D E F I N E S / M A C R O S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- T Y P E D E F I N I T I O N S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
- S T A T I C V A R I A B L E S
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
* G L O B A L V A R I A B L E S
----------------------------------------------------------------------------*/
#ifdef EEPROM_EXT_DEBUG_EN
eeprom_input_test_s g_eeprom_input_test[EEPROM_AREA_TOTAL_FOR_RAM] = {0u}; //MEMORY_MAP_RAM_FLAG_NOINIT
#endif
MEMORY_MAP_RAM_FLAG_NOINIT eeprom_ext_s g_eeprom_ext[EEPROM_AREA_TOTAL_FOR_RAM] @RAM_EEPROM_OP_RAM_ADDR;
eeprom_ext_test_s g_eeprom_ext_test[EEPROM_AREA_TOTAL_FOR_RAM] ;
//MEMORY_MAP_FLAG_NO_OPTIME MEMORY_MAP_RAM_EEPROM u8 g_ram_for_eeprom_data[EEPROM_RAM_MAX_U8] = {0u};
#if 0 //debug的時候開啟該宏
#else
u8 *g_ram_for_eeprom[EEPROM_AREA_TOTAL_FOR_RAM] =
{
(u8*)(u32)EEPROM_AREA0_RAM_ADDR_START,
#if EEPROM_AREA_TOTAL>1u
(u8*)(u32)EEPROM_AREA1_RAM_ADDR_START
#endif
};
#endif
u32 g_logic_page_read_data[EEPROM_AREA_TOTAL_FOR_RAM] MEMORY_MAP_RAM_WDOG @RAM_EEPROM_DATA_RAM_ADDR ; //逻辑页的数据--注意该地址也是未初始化的见ICF
u32 g_logic_page_write_data[EEPROM_AREA_TOTAL_FOR_RAM] MEMORY_MAP_RAM_WDOG @(RAM_EEPROM_DATA_RAM_ADDR+(4u*EEPROM_AREA_TOTAL_FOR_RAM)) ; //逻辑页的数据
u8 g_logic_page_read_u8data[EEPROM_AREA_TOTAL_FOR_RAM][4] MEMORY_MAP_RAM_WDOG @(RAM_EEPROM_DATA_RAM_ADDR+(8u*EEPROM_AREA_TOTAL_FOR_RAM));
/*---------------------------------------------------------------------------
- C O N S T A N T S
----------------------------------------------------------------------------*/
const eeprom_user_info_s g_eeprom_user_info[EEPROM_AREA_TOTAL_FOR_RAM] =
{
{
EEPROM_AREA0_EFLASH_PAGE_NUM,
EFLASH_AREA0_MASS_PAGE_SIZE,
EEPROM_AREA0_ADDR_TOTAL_U32,
EEPROM_AREA0_ADDR_TOTAL_U8,
EEPROM_AREA0_RAM_ADDR_START,
EEPROM_AREA0_RAM_ADDR_END,
EFLASH_AREA0_PAGE0_BASE_ADDRESS,
EFLASH_AREA0_PAGE0_END_ADDRESS,
EFLASH_AREA0_PAGE1_BASE_ADDRESS,
EFLASH_AREA0_PAGE1_END_ADDRESS,
},
#if EEPROM_AREA_TOTAL >1u
{
EEPROM_AREA1_EFLASH_PAGE_NUM,
EFLASH_AREA1_MASS_PAGE_SIZE,
EEPROM_AREA1_ADDR_TOTAL_U32,
EEPROM_AREA1_ADDR_TOTAL_U8,
EEPROM_AREA1_RAM_ADDR_START,
EEPROM_AREA1_RAM_ADDR_END,
EFLASH_AREA1_PAGE0_BASE_ADDRESS,
EFLASH_AREA1_PAGE0_END_ADDRESS,
EFLASH_AREA1_PAGE1_BASE_ADDRESS,
EFLASH_AREA1_PAGE1_END_ADDRESS,
},
#endif
};
/*---------------------------------------------------------------------------
- F U N C T I O N P R O T O T Y P E
----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters : area_id: Var片区
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
u16 eeprom_get_cur_page_id(u8 area_id)
{
assert_param(area_id<EEPROM_AREA_TOTAL);
return g_eeprom_ext[area_id].current_page;
}
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters : area_id: Var片区
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
u32 eeprom_get_cur_end_addr(u8 area_id)
{
assert_param(area_id<EEPROM_AREA_TOTAL);
return g_eeprom_ext[area_id].current_end_addr;
}
#ifdef EEPROM_EXT_DEBUG_IO_EN
//测试相关
void EEPROM_EXT_TEST_ON(u8 id)
{
if(id == 0u)
{
TEST1_ON();
}
else
{
TEST2_ON();
}
}
void EEPROM_EXT_TEST_OFF(u8 id)
{
if(id == 0u)
{
TEST1_OFF();
}
else
{
TEST2_OFF();
}
}
#endif
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description :
----------------------------------------------------------------------------*/
void eeprom_test_task(void)
{
u16 i,j;
u8 l_temp;
u8 l_buf[4];
u32 l_data;
#ifdef EEPROM_EXT_DEBUG_EN
if(g_eeprom_input_test[EEPROM_AREA_ID_0].flag==0x2)
{
g_eeprom_input_test[EEPROM_AREA_ID_0].flag=1u;
//写入ram的值
g_eeprom_input_test[EEPROM_AREA_ID_0].count++;
for(i = 0; i < 1; i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x56+i + g_eeprom_input_test[EEPROM_AREA_ID_0].count;
//eeprom_write_u8_ext(0+i,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,0+i,&l_temp,1);
}
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_0].test_count[58]++;
#endif
}
if(g_eeprom_input_test[EEPROM_AREA_ID_0].flag==0x3)
{
g_eeprom_input_test[EEPROM_AREA_ID_0].count++;
#if 0
for( j=0;j<(EEPROM_AREA0_ADDR_TOTAL_U32/4);j++)
{
l_data=0u;
for(i = 0; i < 4; i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x56+i + g_eeprom_input_test[EEPROM_AREA_ID_0].count+4*j;
//eeprom_write_u8_ext(j*4+i,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,j*4+i,&l_temp,1);
l_data |= (u32)l_temp<<(8*i);
}
#ifdef EEPROM_EXT_STATE_MACHILE_ENABLE
#else
//写入ram的值
//eeprom_write_one_element_seq(EEPROM_AREA_ID_0,j,l_data);
#endif
}
#else
l_buf[0]=0xffu;
l_buf[1]=0xffu;
l_buf[2]=0xffu;
l_buf[3]=0xffu;
nvm_write_bytes(NVM_TYPE_EEPROM,0,&l_buf[0],4);
#endif
//擦除
g_eeprom_input_test[EEPROM_AREA_ID_0].flag=1u;
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_0].test_count[59]++;
#endif
}
if(g_eeprom_input_test[EEPROM_AREA_ID_0].flag==0x5)
{
g_eeprom_input_test[EEPROM_AREA_ID_0].flag=1u;
//写入ram的值
g_eeprom_input_test[EEPROM_AREA_ID_0].count++;
for(i = 0; i < EEPROM_AREA0_ADDR_TOTAL_U8; i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x99+i + g_eeprom_input_test[EEPROM_AREA_ID_0].count;
//eeprom_write_u8_ext(0+i,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,0+i,&l_temp,1);
}
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_0].test_count[60]++;
#endif
eeprom_state_machine_area_resatrt(EEPROM_AREA_ID_0);
}
if(g_eeprom_input_test[EEPROM_AREA_ID_0].flag==0x6)
{
g_eeprom_input_test[EEPROM_AREA_ID_0].flag=1u;
//写入ram的值
g_eeprom_input_test[EEPROM_AREA_ID_0].count++;
for(i = 0; i < (EEPROM_AREA0_ADDR_TOTAL_U8/4); i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x99+i + g_eeprom_input_test[EEPROM_AREA_ID_0].count;
//eeprom_write_u8_ext(0+i,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,0+i,&l_temp,1);
}
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_0].test_count[61]++;
#endif
eeprom_state_machine_area_resatrt(EEPROM_AREA_ID_0);
//g_eeprom_ext.page_count=0u;
}
if(g_eeprom_input_test[EEPROM_AREA_ID_1].flag==0x2)
{
g_eeprom_input_test[EEPROM_AREA_ID_1].flag=1u;
//写入ram的值
g_eeprom_input_test[EEPROM_AREA_ID_1].count++;
for(i = 0; i < 1; i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x56+i + g_eeprom_input_test[EEPROM_AREA_ID_1].count;
//eeprom_write_u8_ext(0+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,0+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
}
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_1].test_count[62]++;
#endif
}
if(g_eeprom_input_test[EEPROM_AREA_ID_1].flag==0x3)
{
g_eeprom_input_test[EEPROM_AREA_ID_1].count++;
#if 0
for( j=0;j<(EEPROM_AREA1_ADDR_TOTAL_U32/4);j++)
{
l_data=0u;
for(i = 0; i < 4; i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x56+i + g_eeprom_input_test[EEPROM_AREA_ID_1].count+4*j;
//eeprom_write_u8_ext(j*4+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,j*4+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
//eeprom_write_u8_ext1(j*4+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
l_data |= (u32)l_temp<<(8*i);
}
#ifdef EEPROM_EXT_STATE_MACHILE_ENABLE
#else
//写入ram的值
//eeprom_write_one_element_seq(EEPROM_AREA_ID_1,j,l_data);
#endif
}
#else
l_buf[0]=0xffu;
l_buf[1]=0xffu;
l_buf[2]=0xffu;
l_buf[3]=0xffu;
nvm_write_bytes(NVM_TYPE_EEPROM,0+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_buf[0],4);
#endif
//擦除
g_eeprom_input_test[EEPROM_AREA_ID_1].flag=1u;
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_1].test_count[63]++;
#endif
}
if(g_eeprom_input_test[EEPROM_AREA_ID_1].flag==0x5)
{
g_eeprom_input_test[EEPROM_AREA_ID_1].flag=1u;
//写入ram的值
g_eeprom_input_test[EEPROM_AREA_ID_1].count++;
for(i = 0; i < EEPROM_AREA1_ADDR_TOTAL_U8; i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x99+i + g_eeprom_input_test[EEPROM_AREA_ID_1].count;
//eeprom_write_u8_ext(0+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,0+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
}
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_1].test_count[64]++;
#endif
eeprom_state_machine_area_resatrt(EEPROM_AREA_ID_1);
}
if(g_eeprom_input_test[EEPROM_AREA_ID_1].flag==0x6)
{
g_eeprom_input_test[EEPROM_AREA_ID_1].flag=1u;
//写入ram的值
g_eeprom_input_test[EEPROM_AREA_ID_1].count++;
for(i = 0; i < (EEPROM_AREA1_ADDR_TOTAL_U8/4); i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x99+i + g_eeprom_input_test[EEPROM_AREA_ID_1].count;
//eeprom_write_u8_ext(0+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,0+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
}
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_1].test_count[65]++;
#endif
eeprom_state_machine_area_resatrt(EEPROM_AREA_ID_1);
//g_eeprom_ext.page_count=0u;
}
if(g_eeprom_input_test[EEPROM_AREA_ID_1].flag==0x7)
{
g_eeprom_input_test[EEPROM_AREA_ID_1].flag=1u;
//写入ram的值
g_eeprom_input_test[EEPROM_AREA_ID_1].count++;
for(i = 0; i < 1; i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x99+i + g_eeprom_input_test[EEPROM_AREA_ID_1].count;
//eeprom_write_u8_ext(0+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,0+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
//eeprom_write_u8_ext1(0+i+EEPROM_AREA1_RAM_ADDR_START-EEPROM_AREA0_RAM_ADDR_START,&l_temp,1);
}
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_1].test_count[66]++;
#endif
//eeprom_state_machine_area_resatrt(EEPROM_AREA_ID_1);
//g_eeprom_ext.page_count=0u;
}
#endif
}
#ifdef EEPROM_INPUT_TEST
/*---------------------------------------------------------------------------
|Prototype :
|Called by :
|Preconditions :
|Input parameters :
|Output parameters :
|Return value :
|Description : --
----------------------------------------------------------------------------*/
void eeprom_ext_input_test(void)
{
u16 i,j;
u8 l_temp;
u8 l_buf[4];
u32 l_data;
//if(g_eeprom_input_test[EEPROM_AREA_ID_0].flag==0x6)
{
g_eeprom_input_test[EEPROM_AREA_ID_0].flag=1u;
//写入ram的值
g_eeprom_input_test[EEPROM_AREA_ID_0].count++;
for(i = 0; i < (EEPROM_AREA0_ADDR_TOTAL_U8/4); i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x99+i + g_eeprom_input_test[EEPROM_AREA_ID_0].count;
//eeprom_write_u8_ext(0+i,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,0+i,&l_temp,1);
}
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_0].test_count[61]++;
#endif
//eeprom_state_machine_area_resatrt(EEPROM_AREA_ID_0);
//g_eeprom_ext.page_count=0u;
}
//if(g_eeprom_input_test[EEPROM_AREA_ID_1].flag==0x6)
{
g_eeprom_input_test[EEPROM_AREA_ID_1].flag=1u;
//写入ram的值
g_eeprom_input_test[EEPROM_AREA_ID_1].count++;
for(i = 0; i < (EEPROM_AREA1_ADDR_TOTAL_U8/4); i++) //EEPROM_AREA0_ADDR_TOTAL_U8
{
wdog_task();
l_temp = 0x99+i + g_eeprom_input_test[EEPROM_AREA_ID_1].count;
//eeprom_write_u8_ext(0+i,&l_temp,1);
nvm_write_bytes(NVM_TYPE_EEPROM,0+i,&l_temp,1);
}
#ifdef EEPROM_EXT_DEBUG_EN
g_eeprom_ext_test[EEPROM_AREA_ID_1].test_count[61]++;
#endif
//eeprom_state_machine_area_resatrt(EEPROM_AREA_ID_1);
//g_eeprom_ext.page_count=0u;
}
}
#endif
#endif