133 lines
3.7 KiB
C
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
|
|
********************************************************/ |