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.

151 lines
3.8 KiB

#include "eeprom.h"
#pragma pack(push, 1)
typedef union _eeprom_info
{
struct
{
uint8_t isSave;
uint16_t SensorMAX;
uint16_t SensorMIN;
uint8_t Reserved[SECTOR_SIZE_BYTE - 6];
uint8_t CheckSum;
}eeprom_data;
uint8_t eeprom_buffer[SECTOR_SIZE_BYTE];
}EEPROM_INFO;
#pragma pack(pop)
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_SettingValue(uint16_t* pGetMax, uint16_t* pGetMin)
{
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)
{
*pGetMax = eeprom_info.eeprom_data.SensorMAX;
*pGetMin = eeprom_info.eeprom_data.SensorMIN;
return true;
}
return false;
}
bool EEPROM_Write_SettingValue(uint16_t SetMax, uint16_t SetMin)
{
uint8_t i;
uint16_t checksum_init = 0x5AA5;
uint16_t checksum_result;
if(eeprom_info.eeprom_data.isSave == true)
{
if(eeprom_info.eeprom_data.SensorMAX == SetMax && eeprom_info.eeprom_data.SensorMIN == SetMin)
return true;
}
memset(&eeprom_info.eeprom_buffer[0], 0, SECTOR_SIZE_BYTE);
eeprom_info.eeprom_data.isSave = true;
eeprom_info.eeprom_data.SensorMAX = SetMax;
eeprom_info.eeprom_data.SensorMIN = SetMin;
// 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;
}