2023-03-06 09:51:44 +08:00

133 lines
3.7 KiB
C

/*
* IAP.c
*
* Created on: 2022年03月12日
* Author: User
*/
/* Includes ------------------------------------------------------------------*/
#include <main.h>
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
********************************************************/