You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

207 lines
5.1 KiB

#include "eeprom.h"
typedef union _eeprom_info
{
struct
{
uint8_t isSave;
uint8_t Mode;
uint8_t Reserved[SECTOR_SIZE_BYTE - 3];
uint8_t CheckSum;
}eeprom_data;
uint8_t eeprom_buffer[SECTOR_SIZE_BYTE];
}EEPROM_INFO;
static EEPROM_INFO eeprom_info;
/*-------------------------------------------------------------------------*//**
* @brief FlashMem_Do_PageWt
* @param[in] tPageAddr
* @param[in] tBuf
* @return None
*//*-------------------------------------------------------------------------*/
void FlashMem_Do_PageWt( uint32_t tPageAddr, uint32_t* tBuf )
{
uint32_t UserID_Buf;
UserID_Buf = 0x4F17DC86;
HAL_FMC_PageWrite( UserID_Buf, tPageAddr, tBuf );
}
/*-------------------------------------------------------------------------*//**
* @brief FlashMem_Do_PageEr
* @param[in] tPageAddr
* @return None
*//*-------------------------------------------------------------------------*/
void FlashMem_Do_PageEr( uint32_t tPageAddr )
{
uint32_t UserID_Buf;
UserID_Buf = 0xA901358F;
HAL_FMC_PageErase( UserID_Buf, tPageAddr );
}
void FlashMEM_Clock_Initialization(void)
{
// enable peripheral clock
HAL_SCU_Peripheral_EnableClock2( PPCLKEN2_FMCLKE, PPxCLKE_Enable );
// init crc
HAL_CRC_Init();
}
bool EEPROM_Read_Mode(uint8_t* pMode)
{
uint8_t i;
uint16_t checksum_init = 0x5AA5;
uint16_t checksum_result;
__disable_irq();
memcpy(&eeprom_info.eeprom_buffer[0], (uint32_t *)CONFIG_ADDRESS, SECTOR_SIZE_BYTE);
__enable_irq();
if(eeprom_info.eeprom_data.isSave != true)
{
return false;
}
// CRC Block Calculation
CRC->INIT = checksum_init;
CRC->CR = 0
| MODS_UserMode // Set User Mode
| CRC_RLTCLR // Initialize CRC_RLT Register With CRC_INIT
| CRC_16 // Polynomial Selection bit : CRC-16
| CRC_NOINC // Address Not Auto Increment
;
CRCRun();
for(i = 0 ; i < (SECTOR_SIZE_BYTE-1) ; i++)
{
CRC->IN = eeprom_info.eeprom_buffer[i];
}
CRCStop();
checksum_result = CRC->RLT;
if((checksum_result & 0xFF) == eeprom_info.eeprom_data.CheckSum)
{
*pMode = eeprom_info.eeprom_data.Mode;
return true;
}
return false;
}
bool EEPROM_Write_Mode(uint8_t Mode)
{
uint8_t i;
uint16_t checksum_init = 0x5AA5;
uint16_t checksum_result;
if(eeprom_info.eeprom_data.isSave == true)
{
if(eeprom_info.eeprom_data.Mode == Mode)
return true;
}
memset(&eeprom_info.eeprom_buffer[0], 0, SECTOR_SIZE_BYTE);
eeprom_info.eeprom_data.isSave = true;
eeprom_info.eeprom_data.Mode = Mode;
// CRC Block Calculation
CRC->INIT = checksum_init;
CRC->CR = 0
| MODS_UserMode // Set User Mode
| CRC_RLTCLR // Initialize CRC_RLT Register With CRC_INIT
| CRC_16 // Polynomial Selection bit : CRC-16
| CRC_NOINC // Address Not Auto Increment
;
CRCRun();
for(i = 0 ; i < (SECTOR_SIZE_BYTE-1) ; i++)
{
CRC->IN = eeprom_info.eeprom_buffer[i];
}
CRCStop();
checksum_result = CRC->RLT;
eeprom_info.eeprom_data.CheckSum = checksum_result & 0xFF;
__disable_irq();
FlashMem_Do_PageEr(CONFIG_ADDRESS);
FlashMem_Do_PageWt(CONFIG_ADDRESS, (uint32_t *)&eeprom_info.eeprom_buffer[0]);
__enable_irq();
return true;
}
#if 0
void EEPROM_Read_Setting_Data(void)
{
#if 0
__disable_irq();
memcpy(&Save_control_Info, (uint32_t *)CONFIG_ADDRESS, SECTOR_SIZE_BYTE);
__enable_irq();
if(Save_control_Info.SaveFlag != EEPROM_SAVE_CHECK_FLAG_DATA)
{
Save_control_Info.SaveFlag = EEPROM_SAVE_CHECK_FLAG_DATA; // 1
Save_control_Info.SaveActionMode = ACTION_MODE_ACTION_AUTO_1; // 2
Save_control_Info.isPowerOnReservation = FALSE; // 3
Save_control_Info.isPowerOnSaturDay = FALSE; // 4
Save_control_Info.PowerOn_Hour = 0; // 5
Save_control_Info.PowerOn_Min = 0; // 6
Save_control_Info.isPowerOffReservation = FALSE; // 7
Save_control_Info.PowerOff_Hour = 0; // 8
Save_control_Info.PowerOff_Min = 0; // 9
Save_control_Info.FanActionTime_1 = 0; // 10
Save_control_Info.FanActionTime_2 = 0; // 11
}
#endif
}
void EEPROM_Write_Seting_Data(void)
{
#if 0
if(Control_Info.isEepromSave == TRUE)
{
Control_Info.isEepromSave = FALSE;
__disable_irq();
FlashMem_Do_PageEr(CONFIG_ADDRESS);
FlashMem_Do_PageWt(CONFIG_ADDRESS, (uint32_t *)&Save_control_Info);
__enable_irq();
}
#endif
}
#endif