2025-04-26 16:03:23 +08:00

461 lines
14 KiB
C
Raw Permalink 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.

/** ##########################################################################
** 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