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
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;
|
|
}
|