#include "eeprom.h" 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; 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; }