/** ########################################################################## ** Filename : ** Project : ** Module : ** Processor : ** Version : 1.0 ** 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 "error.h" #include "eeprom.h" #include "eeprom_seq.h" #include "eeprom_state_machine.h" #include "system_voltage_manage.h" #include "wdog.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 ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - C O N S T A N T S ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- - F U N C T I O N P R O T O T Y P E ----------------------------------------------------------------------------*/ /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description : 擦除数据 ----------------------------------------------------------------------------*/ eeprom_statys_t eeprom_erase_page(u32 page_addr) { eeprom_statys_t l_flash_status ; #ifdef EEPROM_EXT_JUDGE_PAGE_ADDR assert_param(page_addr>=EEPROM_FLASH_ADDR_START); assert_param(page_addr=EEPROM_FLASH_ADDR_START); assert_param(addr<=EEPROM_AERA_END_ADDR); assert_param((addr&FLASH_ADDRS_ALIGN_RES_MASK)==0u); #endif wdog_task(); if (FL_FAIL == FL_FLASH_Program_Word(FLASH, addr, data)) { l_flash_status = EFLASH_STATUS_BUSY; } else { l_flash_status = EFLASH_STATUS_SUCCESS; } return l_flash_status; } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : |Output parameters : |Return value : |Description :初始化 ----------------------------------------------------------------------------*/ u16 eeprom_drv_init(u8 area_id) { u16 i; u16 l_page0_status, l_page1_status; #ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO #else u16 l_page0_auxi, l_page1_auxi; #endif //u16 l_addr_index = 0u; //u16 l_eeprom_status = 0u, l_read_status = EFLASH_READ_FAILED; u16 l_flash_status = EFLASH_STATUS_SUCCESS; u8 l_flag_out=0u; assert_param(area_id=EEPROM_AREA_TOTAL) { l_flash_status = EFLASH_STATUS_PPADRER_ERROR; //return l_flash_status; } else { /* Get Page0 status */ l_page0_status = (*(__IO eflash_operate_t*)EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id)); /* Get Page1 status */ l_page1_status = (*(__IO eflash_operate_t*)EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id)); #ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO #else /* Get Page0 status */ l_page0_auxi = (*(__IO eflash_operate_t*)(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id)+EFLASH_OPERATION_LEN)); /* Get Page1 status */ l_page1_auxi = (*(__IO eflash_operate_t*)(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id)+EFLASH_OPERATION_LEN)); #endif /* Check for invalid header states and repair if necessary */ switch (l_page0_status) { case EFLASH_ERASED: if (l_page1_status == EFLASH_VALID_PAGE) /* Page0 erased, Page1 valid */ { //其实不需要每次都擦除, #if 1 //其实没必要,每次都删除 if(g_eeprom_ext[area_id].first_reset_flag != EEPROM_FLAG_NOT_FIRST_RESET) { for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++) { l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ); if(l_flash_status != EFLASH_STATUS_SUCCESS) { break; } } /* If erase operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { //return l_flash_status; l_flag_out=1u; break; } } #endif } #ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO else if (l_page1_status == EFLASH_RECEIVE_DATA) /* Page0 erased, Page1 receive */ { //g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR; /* Erase Page0 */ for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++) { l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ); if(l_flash_status != EFLASH_STATUS_SUCCESS) { break; } } /* If erase operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { l_flag_out=1u; break; } /* Mark Page1 as valid */ l_flash_status = eeprom_program_u32(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id), EFLASH_VALID_PAGE); /* If program operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { l_flag_out=1u; break; } g_eeprom_ext[area_id].state = EFLASH_STATE_IDLE; break; } #endif else /* First EEPROM access (Page0&1 are erased) or invalid state -> format EEPROM */ { #ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO #else if( l_page0_auxi == EFLASH_RECEIVE_DATA ) { //正在转移,不用格式化--并且把FFFFF清成0, l_flash_status = eeprom_program_u32(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id), EFLASH_VALID_PAGE); if (l_flash_status != EFLASH_STATUS_SUCCESS) { //return l_flash_status; l_flag_out=1u; break; } g_eeprom_ext[area_id].state = EFLASH_STATE_IDLE; } else if(l_page1_auxi == EFLASH_RECEIVE_DATA ) { //正在转移,不用格式化--并且把FFFFF清成0, l_flash_status = eeprom_program_u32(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id), EFLASH_VALID_PAGE); if (l_flash_status != EFLASH_STATUS_SUCCESS) { //return l_flash_status; l_flag_out=1u; break; } g_eeprom_ext[area_id].state = EFLASH_STATE_IDLE; } else #endif { /* Erase both Page0 and Page1 and set Page0 as valid page */ l_flash_status = eeprom_format(area_id); /* If erase/program operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { //return l_flash_status; l_flag_out=1u; break; } g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR; } } break; #ifdef EEPROM_FLASH_CAN_REWRITE_TO_BIT_ZERO case EFLASH_RECEIVE_DATA: if (l_page1_status == EFLASH_VALID_PAGE) /* Page0 receive, Page1 valid */ { #ifdef EEPROM_EXT_STATE_MACHILE_ENABLE //--其实可以考虙删除PAGE0,重新在状态机中搬 /* Erase Page1 */ for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++) { //wdog_task(); //wdt_disable(); l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ); //wdog_init(); //wdog_task(); if(l_flash_status != EFLASH_STATUS_SUCCESS) { break; } } /* If erase operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { l_flag_out=1u; break; } //g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR; g_eeprom_ext[area_id].trans_page_count =0u; g_eeprom_ext[area_id].transfer_state = EFLASH_PAGE_TRANSFER_STATE_WRITE_NEW_DATA; #else /* Transfer data from Page1 to Page0 */ //--其实可以考虙删除PAGE0,重新在状态机中搬 eeprom_reset_page_transfer_continus(area_id,g_eeprom_ext[area_id].page_cur_id, g_logic_page_write_data[area_id]); #endif } else if(l_page1_status == EFLASH_ERASED) /* Page0 receive, Page1 erased */ { /* Erase Page1 */ //g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR; for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++) { l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ); if(l_flash_status != EFLASH_STATUS_SUCCESS) { break; } } /* If erase operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { l_flag_out=1u; break; } /* Mark Page0 as valid */ l_flash_status = eeprom_program_u32(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id), EFLASH_VALID_PAGE); /* If program operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { l_flag_out=1u; break; } g_eeprom_ext[area_id].state = EFLASH_STATE_IDLE; } else /* Invalid state -> format eeprom */ { /* Erase both Page0 and Page1 and set Page0 as valid page */ l_flash_status = eeprom_format(area_id); /* If erase/program operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { //return l_flash_status; l_flag_out=1u; break; } g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR; } break; #endif case EFLASH_VALID_PAGE: if (l_page1_status == EFLASH_VALID_PAGE) /* Invalid state -> format eeprom */ { /* Erase both Page0 and Page1 and set Page0 as valid page */ l_flash_status = eeprom_format(area_id); /* If erase/program operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { //return l_flash_status; l_flag_out=1u; break; } g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR; } else if (l_page1_status == EFLASH_ERASED) /* Page0 valid, Page1 erased */ { /* Erase Page1 */ #if 1 //其实没必要,每次都删除 if(g_eeprom_ext[area_id].first_reset_flag != EEPROM_FLAG_NOT_FIRST_RESET) { for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++) { l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ); if(l_flash_status != EFLASH_STATUS_SUCCESS) { break; } } /* If erase operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { //return l_flash_status; l_flag_out=1u; break; } } #endif } else /* Page0 valid, Page1 receive */ { #ifdef EEPROM_EXT_STATE_MACHILE_ENABLE for(i = 0; i < EEPROM_AREAx_EFLASH_PAGE_NUM(area_id); i ++) { //wdog_task(); //wdt_disable(); l_flash_status = eeprom_erase_page(EFLASH_AREAx_PAGE1_BASE_ADDRESS(area_id) + i * EFLASH_PAGE_SIEZ); //wdog_init(); //wdog_task(); if(l_flash_status != EFLASH_STATUS_SUCCESS) { break; } } /* If erase operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { l_flag_out=1u; break; } g_eeprom_ext[area_id].trans_page_count =0u; g_eeprom_ext[area_id].transfer_state = EFLASH_PAGE_TRANSFER_STATE_WRITE_NEW_DATA; #else /* Transfer data from Page0 to Page1 */ //--其实可以考虙删除PAGE1,重新在状态机中搬 eeprom_reset_page_transfer_continus(area_id,g_eeprom_ext[area_id].page_cur_id, g_logic_page_write_data[area_id]); #endif } break; default: /* Any other state -> format eeprom */ /* Erase both Page0 and Page1 and set Page0 as valid page */ l_flash_status = eeprom_format(area_id); /* If erase/program operation was failed, a Flash error code is returned */ if (l_flash_status != EFLASH_STATUS_SUCCESS) { //return l_flash_status; l_flag_out=1u; break; } g_eeprom_ext[area_id].first_reset_flag = EEPROM_FLAG_FIRST_RESET_CLEAR; break; } } if(l_flag_out==0u) { l_flash_status = EFLASH_STATUS_SUCCESS; } return l_flash_status; } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : area_id: Var片区;virt_addr: Variable virtual address;data: Global variable contains the read variable value |Output parameters : |Return value : Success or error status: * - 0: if variable was found * - 1: if the variable was not found * - EFLASH_NO_VALID_PAGE: if no valid page was found. |Description :读取一个U32 ----------------------------------------------------------------------------*/ u16 eeprom_read_one_element(u8 area_id,u16 virt_addr, u32* data) { u16 l_valid_page = EFLASH_PAGE0; u16 l_addr_value = 0x5555, l_read_status = EFLASH_READ_FAILED; u32 l_addr, l_page_start_addr; assert_param(area_id (l_page_start_addr + EFLASH_OPERATION_LEN)) { /* Get the current location content to be compared with virtual address */ l_addr_value = (*(__IO eflash_operate_t*)l_addr); /* Compare the read address with the virtual address */ if (l_addr_value == (virt_addr + EEPROM_VIRT_ADDRESS_OFFSET)) { /* Get content of l_addr-EFLASH_OPERATION_LEN which is variable value */ *data = (*(__IO eflash_operate_t*)(l_addr - EFLASH_OPERATION_LEN)); /* In case variable value is read, reset l_read_status flag */ l_read_status = EFLASH_READ_OK; break; } else { /* Next address location */ l_addr = l_addr - EFLASH_ELEMENT_LEN; } } //如果讀取,沒有該數據,返回一個默認值 if(l_read_status!=EFLASH_READ_OK) { *data= EEPROM_EXT_UN_WRITE_INIT; } /* Return l_read_status value: (0: variable exist, 1: variable doesn't exist) */ return l_read_status; } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : area_id: Var片区;virt_addr: 16 bit virtual address of the variable data: 16 bit data to be written as variable value |Output parameters : |Return value : Success or error status: * - EFLASH_STATUS_SUCCESS: on success * - EFLASH_PAGE_FULL: if valid page is full * - EFLASH_NO_VALID_PAGE: if no valid page was found * - Flash error code: on write Flash error |Description :快速定位地址; ----------------------------------------------------------------------------*/ void eeprom_get_current_page_addr(u8 area_id,u16 *p_valid_page,u32 *p_addr) { u16 l_valid_page = EFLASH_PAGE0; //eeprom_statys_t l_status_res = EFLASH_STATUS_SUCCESS; u32 l_current_addr = 0u; u32 l_addr, l_page_end_addr; /* Get active Page for read operation */ l_valid_page = eeprom_find_valid_page(area_id,EFLASH_READ_FROM_VALID_PAGE); /* Check if there is no valid page */ if (l_valid_page == EFLASH_NO_VALID_PAGE) { *p_valid_page = EFLASH_NO_VALID_PAGE; *p_addr = EFLASH_READ_NOT_VALID_ADDR_CUR; //表示没有 有效的页 return ; } *p_valid_page = l_valid_page; /* Get the valid Page start l_addr */ l_addr = (u32)(EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) + (u32)(l_valid_page * EFLASH_AREAx_MASS_PAGE_SIZE(area_id)) + EFLASH_PAGE_FIRST_VARIABLE_ADDRESS); /* Get the valid Page end l_addr */ l_page_end_addr = (u32)((EFLASH_AREAx_PAGE0_BASE_ADDRESS(area_id) - EFLASH_OPERATION_LEN) + (u32)((1 + l_valid_page) * EFLASH_AREAx_MASS_PAGE_SIZE(area_id))); /* Check each active page address starting from begining */ while (l_addr <= l_page_end_addr) { /* Verify if l_addr and l_addr+EFLASH_OPERATION_LEN contents are all 0xF */ #if (EFLASH_OPERATION_LEN == 2) if ((*(__IO eflash_operate_t*)l_addr) == 0xFFFFFFFF) #elif (EFLASH_OPERATION_LEN == 4) if (((*(__IO eflash_operate_t*)l_addr) == 0xFFFFFFFF) && ((*(__IO eflash_operate_t*)(l_addr - EFLASH_OPERATION_LEN)) == 0xFFFFFFFF)) //我认为目前-4是合理的 因为数据在地址前面 #endif { /* Set variable data */ //向前找,如果先找到FFFF,则认为是空的,当前可以填的。 l_current_addr = l_addr; *p_addr = l_current_addr; /* Return program operation status */ return ;//l_current_addr; } else { /* Next address location */ l_addr = l_addr + EFLASH_ELEMENT_LEN; } } l_current_addr = l_page_end_addr; *p_addr = l_current_addr; //对齐到实际地址 /* Return EFLASH_PAGE_FULL in case the valid page is full */ return ;//l_current_addr; } /*--------------------------------------------------------------------------- |Prototype : |Called by : |Preconditions : |Input parameters : Erases EFLASH_PAGE0 and EFLASH_PAGE1 and writes EFLASH_VALID_PAGE header to EFLASH_PAGE0 |Output parameters : |Return value : Status of the last operation (Flash write or erase) done during * EEPROM formating |Description : ----------------------------------------------------------------------------*/ eeprom_statys_t eeprom_format(u8 area_id) { eeprom_statys_t l_status_res = EFLASH_STATUS_SUCCESS; u8 i; assert_param(area_id= EEPROM_AREAx_ADDR_TOTAL_U32(area_id)) { g_eeprom_ext[area_id].trans_page_count = 0; l_status_res = EFLASH_STATUS_BUSY; g_eeprom_ext[area_id].eflash_page_index = 0; g_eeprom_ext[area_id].transfer_state = EFLASH_PAGE_TRANSFER_STATE_ERASE; g_eeprom_ext[area_id].erase_state = EFLASH_PAGE_ERASE_STATE_WAIT_LAST_OPERATION; #ifdef EEPROM_EXT_DEBUG_EN g_eeprom_ext_test[area_id].test_count[8]++; #endif break; } } l_status_res = EFLASH_STATUS_BUSY; break; case EFLASH_PAGE_TRANSFER_STATE_ERASE: l_status_res = eeprom_erase_page(g_eeprom_ext[area_id].page_addr_old + g_eeprom_ext[area_id].eflash_page_index * EFLASH_PAGE_SIEZ); if (l_status_res != EFLASH_STATUS_SUCCESS) { return l_status_res; } #ifdef EEPROM_EXT_DEBUG_EN g_eeprom_ext_test[area_id].test_count[9]++; #endif g_eeprom_ext[area_id].eflash_page_index ++; if(g_eeprom_ext[area_id].eflash_page_index >= EEPROM_AREAx_EFLASH_PAGE_NUM(area_id)) { #ifdef EEPROM_EXT_DEBUG_IO_EN EEPROM_EXT_TEST_ON(area_id); #endif l_status_res = eeprom_program_u32(g_eeprom_ext[area_id].page_addr_new, EFLASH_VALID_PAGE); #ifdef EEPROM_EXT_DEBUG_IO_EN EEPROM_EXT_TEST_OFF(area_id); #endif #ifdef EEPROM_EXT_DEBUG_EN g_eeprom_ext_test[area_id].test_count[10]++; #endif } else { l_status_res = EFLASH_STATUS_BUSY; #ifdef EEPROM_EXT_DEBUG_EN g_eeprom_ext_test[area_id].test_count[11]++; #endif } break; default: l_status_res = EFLASH_STATUS_CMD_INVALID; break; } return (l_status_res); } /*--------------------------------------------------------------------------- |Prototype : |Called by : None |Preconditions : None |Input parameters : |Output parameters : None |Return value : None |Description : ----------------------------------------------------------------------------*/ err_flag_e ram_read_bytes_for_eeprom(u32 addr,u8 *p_data,u16 len) { err_flag_e l_result; u8 *p_src; u16 i; if( (addrEEPROM_RAM_ADDR_END) || ((addr+len)>(EEPROM_RAM_ADDR_END+1u)) ) { l_result = ERR_FAILED; } else { p_src = (u8 *)(addr); for (i = 0; i < len; i++) { p_data[i] = p_src[i]; /*lint !e511*/ } l_result = ERR_OK; } return l_result; } /*--------------------------------------------------------------------------- |Prototype : |Called by : None |Preconditions : None |Input parameters : |Output parameters : None |Return value : None |Description ----------------------------------------------------------------------------*/ err_flag_e ram_write_bytes_for_eeprom(u32 addr,u8 *p_data,u16 len) { err_flag_e l_result; u8 *p_addr; u16 i; if( (addrEEPROM_RAM_ADDR_END) || ((addr+len)>(EEPROM_RAM_ADDR_END+1u)) ) { l_result = ERR_FAILED; } else { p_addr = (u8 *)(addr); for (i = 0; i < len; i++) { p_addr[i] = p_data[i] ; /*lint !e511*/ } l_result = ERR_OK; } return l_result; } /*--------------------------------------------------------------------------- |Prototype : |Called by : None |Preconditions : None |Input parameters : |Output parameters : None |Return value : None |Description ----------------------------------------------------------------------------*/ u8 eeprom_read_u8_ext(u32 w_addr, u8 *p_data, u16 b_number) { u8 l_result ; l_result = ram_read_bytes_for_eeprom(w_addr+EEPROM_RAM_ADDR_START,p_data,b_number); return l_result; } /*--------------------------------------------------------------------------- |Prototype : |Called by : None |Preconditions : None |Input parameters : |Output parameters : None |Return value : None |Description ----------------------------------------------------------------------------*/ u8 eeprom_write_u8_ext(u32 w_addr, u8 *p_data, u16 b_number) { u8 l_result ; #ifdef EEPROM_EXT_STATE_MACHILE_ENABLE #else u16 l_start_addr; u16 l_offset; u16 l_len; u16 i; u32 *p_u32; u32 l_data; #endif l_result = ram_write_bytes_for_eeprom(w_addr+EEPROM_RAM_ADDR_START,p_data,b_number); #ifdef EEPROM_EXT_STATE_MACHILE_ENABLE #else l_offset = w_addr&(u32)0x03u; l_start_addr = (w_addr-l_offset)/4u; l_len = ((b_number+l_offset)/0x04u+1u); for(i = 0; i < l_len; i++) { if( ((w_addr+EEPROM_RAM_ADDR_START)>=EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_0) ) && ((w_addr+EEPROM_RAM_ADDR_START+b_number)<=EEPROM_AREAx_RAM_ADDR_END(EEPROM_AREA_ID_0) ) ) { p_u32 = (u32*)(l_start_addr*4u+EEPROM_RAM_ADDR_START); l_data = *p_u32; eeprom_write_one_element_seq(EEPROM_AREA_ID_0,l_start_addr,l_data); } else if( ((w_addr+EEPROM_RAM_ADDR_START)>=EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_1) ) && ((w_addr+EEPROM_RAM_ADDR_START+b_number)<=EEPROM_AREAx_RAM_ADDR_END(EEPROM_AREA_ID_1) ) ) { p_u32 = (u32*)(l_start_addr*4u+EEPROM_RAM_ADDR_START); l_data = *p_u32; l_offset = (EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_1)-EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_0))/4; eeprom_write_one_element_seq(EEPROM_AREA_ID_1,l_start_addr-l_offset,l_data); } else { } p_u32++; } #endif return l_result; } /*--------------------------------------------------------------------------- |Prototype : |Called by : None |Preconditions : None |Input parameters : |Output parameters : None |Return value : None |Description ----------------------------------------------------------------------------*/ u8 eeprom_ext_get_state(u8 area_id) { assert_param(area_id1u eeprom_area_init(EEPROM_AREA_ID_1); #endif } /*--------------------------------------------------------------------------- |Prototype : |Called by : None |Preconditions : None |Input parameters : |Output parameters : None |Return value : None |Description 任务 ----------------------------------------------------------------------------*/ void eeprom_task(void) { eeprom_test_task(); #if 0 //if(g_eeprom_input_test.flag==0x1) { //g_eeprom_input_test.flag=2u; //g_eeprom_input_test.count++; //eeprom_ext_input_test(); //eeprom_ext_restart(); if(SVD_ISR_SVDR_Msk != FL_SVD_GetLatchedPowerStatus(SVD)) { return ; //l_result; } #ifdef EEPROM_EXT_STATE_MACHILE_ENABLE { eeprom_state_machine_task(EEPROM_AREA_ID_0); #if EEPROM_AREA_TOTAL >1u eeprom_state_machine_task(EEPROM_AREA_ID_1); #endif } #endif } #else #ifdef EEPROM_EXT_STATE_MACHILE_ENABLE u8 l_power_grade; l_power_grade = system_voltage_manage_mode_get(FUNC_SYSTEM_VOLTAGE_MANAGE_ID); if( ( (l_power_grade == SYSTEM_VOLTAGE_MODE_NORMAL) || (l_power_grade == SYSTEM_VOLTAGE_MODE_HIGH) ) //电压不能低于9v && (SVD_ISR_SVDR_Msk == FL_SVD_GetLatchedPowerStatus(SVD)) ) { #ifdef EEPROM_EXT_DEBUG_EN //g_eeprom_ext_test.test_count[37]++; #endif #ifdef EEPROM_EXT_STATE_MACHILE_ENABLE eeprom_state_machine_task(EEPROM_AREA_ID_0); #if EEPROM_AREA_TOTAL >1u eeprom_state_machine_task(EEPROM_AREA_ID_1); #endif #endif } else { #ifdef EEPROM_EXT_DEBUG_EN //g_eeprom_ext_test.test_count[38]++; #endif } #endif #endif } #if 0 // /*--------------------------------------------------------------------------- |Prototype : |Called by : None |Preconditions : None |Input parameters : |Output parameters : None |Return value : None |Description 测试用 ----------------------------------------------------------------------------*/ u8 eeprom_write_u8_ext1(u32 w_addr, u8 *p_data, u16 b_number) { u8 l_result ; u16 l_start_addr; u16 l_offset; u16 l_len; u16 i; u32 *p_u32; u32 l_data; l_result = ram_write_bytes_for_eeprom(w_addr+EEPROM_RAM_ADDR_START,p_data,b_number); #if 0 //def EEPROM_EXT_STATE_MACHILE_ENABLE #else l_offset = w_addr&(u32)0x03u; l_start_addr = (w_addr-l_offset)/4u; l_len = ((b_number+l_offset)/0x04u+1u); for(i = 0; i < l_len; i++) { if( ((w_addr+EEPROM_RAM_ADDR_START)>=EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_0) ) && ((w_addr+EEPROM_RAM_ADDR_START+b_number)<=EEPROM_AREAx_RAM_ADDR_END(EEPROM_AREA_ID_0) ) ) { p_u32 = (u32*)(l_start_addr*4u+EEPROM_RAM_ADDR_START); l_data = *p_u32; eeprom_write_one_element_seq(EEPROM_AREA_ID_0,l_start_addr,l_data); } else if( ((w_addr+EEPROM_RAM_ADDR_START)>=EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_1) ) && ((w_addr+EEPROM_RAM_ADDR_START+b_number)<=EEPROM_AREAx_RAM_ADDR_END(EEPROM_AREA_ID_1) ) ) { p_u32 = (u32*)(l_start_addr*4u+EEPROM_RAM_ADDR_START); l_data = *p_u32; l_offset = (EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_1)-EEPROM_AREAx_RAM_ADDR_START(EEPROM_AREA_ID_0))/4; eeprom_write_one_element_seq(EEPROM_AREA_ID_1,l_start_addr-l_offset,l_data); } else { } p_u32++; } #endif return l_result; } #endif #endif