/* * IAP.c * * Created on: 2022年03月12日 * Author: User */ /* Includes ------------------------------------------------------------------*/ #include uint8_t EEPROM_Array[4] = {0}; //保存温度的数组 uint16_t Save_Value1; uint16_t Save_Value2; static uint8_t Flash_ReadData(uint16_t); //读一字节 static void FLASH_WriteData(uint8_t, uint16_t); //写一字节(写之前需要先擦除) static void Flash_EraseBlock(uint16_t); //扇区擦除 static void Get_TempValue(void); //恢复储存的温度 static void Save_TempValue(void); static void Flash_ReadArr(unsigned int fui_Address, unsigned char fuc_Length, unsigned char *fucp_SaveArr); static void Flash_WriteArr(unsigned int fui_Address, unsigned char fuc_Length, unsigned char *fucp_SaveArr); /* Public variables-----------------------------------------------------------*/ IAP_t xdata IAP = { EEPROM_Array, Save_TempValue, Get_TempValue}; /* * @name Get_TempValue * @brief 获取温度的值 * @param None * @retval None */ static void Get_TempValue(void) { Flash_ReadArr(EEPROM_Array_ADDR, 4, EEPROM_Array); Public.Setting_Temp1 = EEPROM_Array[0]; Public.Setting_Temp1 <<= 8; Public.Setting_Temp1 |= EEPROM_Array[1]; Public.Setting_Temp2 = EEPROM_Array[2]; Public.Setting_Temp2 <<= 8; Public.Setting_Temp2 |= EEPROM_Array[3]; Save_Value1 = Public.Setting_Temp1; Save_Value2 = Public.Setting_Temp2; } /* * @name Save_TempValue * @brief 保存温度的值 * @param None * @retval None */ static void Save_TempValue(void) { if ((Save_Value1 != Public.Setting_Temp1) || (Save_Value2 != Public.Setting_Temp2)) { IAP.EEPROM_Array[0] = (Public.Setting_Temp1 >> 8) & 0xFF; IAP.EEPROM_Array[1] = Public.Setting_Temp1 & 0xFF; IAP.EEPROM_Array[2] = (Public.Setting_Temp2 >> 8) & 0xFF; IAP.EEPROM_Array[3] = Public.Setting_Temp2 & 0xFF; Flash_EraseBlock(EEPROM_Array_ADDR); Flash_WriteArr(EEPROM_Array_ADDR, 4, EEPROM_Array); } } /* * @name FLASH_WriteData * @brief 写入一字节(写入之前需要先擦除) * @param None * @retval None */ static void FLASH_WriteData(uint8_t dat, uint16_t addr) { EA = 0; //关闭总中断 INSCON = 0x80; //设置操作区域为EEPROM IAP_DATA = dat; IAP_CMD = 0xF00F; // Flash解锁 IAP_ADDR = addr; IAP_CMD = 0xB44B; //字节编程 IAP_CMD = 0xE11E; //触发一次操作 触发后自动锁定 INSCON = 0x00; //关闭写EEPROM操作 EA = 1; } /* * @name Flash_EraseBlock * @brief 扇区擦除(每扇区为32字节) * @param None * @retval None */ static void Flash_EraseBlock(uint16_t addr) { EA = 0; //关闭总中断 INSCON = 0x80; //设置操作区域为EEPROM IAP_CMD = 0xF00F; // Flash解锁 IAP_ADDR = addr; //写入擦除地址 IAP_CMD = 0xD22D; //选择操作方式,扇区擦除 IAP_CMD = 0xE11E; //触发后IAP_ADDRL&IAP_ADDRH指向0xFF,同时自动锁定 INSCON = 0x00; //关闭EEPROM操作 EA = 1; } /* * @name Flash_WriteArr * @brief 写入一个数组 * @param address len savearray * @retval None */ static void Flash_WriteArr(unsigned int fui_Address, unsigned char fuc_Length, unsigned char *fucp_SaveArr) { unsigned char fui_i = 0; EA = 0; for (fui_i = 0; fui_i < fuc_Length; fui_i++) { FLASH_WriteData(*(fucp_SaveArr++), fui_Address++); } EA = 1; } /* * @name Flash_ReadArr * @brief 读出一个数组 * @param address len savearray * @retval None */ static void Flash_ReadArr(unsigned int fui_Address, unsigned char fuc_Length, unsigned char *fucp_SaveArr) { INSCON = 0x80; while (fuc_Length--) *(fucp_SaveArr++) = *((unsigned char code *)(fui_Address++)); //读取数据 } /******************************************************** End Of File ********************************************************/