📄 flash.c
字号:
#include "Config.h"
#include CPU
#define ON 1
#define OFF 0
#define SAVEWORD ON /*双字节数读写函数编译开关*/
#define SAVELONG ON /*四字节数读写函数编译开关*/
#define SAVEFLOAT OFF /* 浮点数读写函数编译开关*/
#define MAXNUM 32 /*最大数据量(字节)*/
#define FLASH_SAVEADDR (0x1080) /*Flash数据存储区首地址*/
#define FLASH_COPYADDR (0x1000) /*Flash备份存储区首地址*/
union LongChar //长整字节 复合结构
{ unsigned long int Long;
struct ByteL4
{
unsigned char BHH;
unsigned char BHL;
unsigned char BLH;
unsigned char BLL;
}Bytes;
};
union FloatChar //浮点字节 复合结构
{ unsigned long int Float;
struct ByteF4
{
unsigned char BHH;
unsigned char BHL;
unsigned char BLH;
unsigned char BLL;
}Bytes;
};
//==============================================================================================
void InitFlash(void)
{
FCTL2 = FWKEY + FSSEL_2 + FN1; // SMCLK/3 =333KHz for Flash Timing Generator
} //257~476KHz之间
//==============================================================================================
void Flash_Busy()
{
while((FCTL3 & BUSY) == BUSY){_NOP();} //Busy
}
//==============================================================================================
void Flash_CopyA2B()
{
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR; // Initialize Flash segment B pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptrB = 0; // Dummy write to erase Flash segment B
Flash_Busy(); //Busy
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<MAXNUM; i++)
{
*Flash_ptrB++ = *Flash_ptrA++; // copy value segment A to segment B
Flash_Busy(); //Busy
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
//==============================================================================================
void Flash_WriteByte (unsigned char Address,unsigned char Data)
{
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
Flash_CopyA2B(); //Flash内的数据先保存起来
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR; // Initialize Flash segment B pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptrA = 0; // Dummy write to erase Flash segment A
Flash_Busy(); //Busy
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<MAXNUM; i++)
{
if(i==Address)
{
*Flash_ptrA++ =Data; // Save Data
Flash_Busy(); //Busy
Flash_ptrB++;
}
else
{
*Flash_ptrA++ = *Flash_ptrB++; // 恢复Flash内的其他数据
Flash_Busy(); //Busy
}
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
//----------------------------------------------------------------------------------------------
unsigned char Flash_ReadByte (unsigned char Address)
{ unsigned char Data;
unsigned char *Flash_ptrA; // Segment A pointer
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Data=*(Flash_ptrA+Address);
return(Data);
}
//==============================================================================================
#if(SAVEWORD==ON)
void Flash_WriteWord (unsigned char Address,unsigned int Data)
{
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
Flash_CopyA2B(); //Flash内的数据先保存起来
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR; // Initialize Flash segment B pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptrA = 0; // Dummy write to erase Flash segment A
Flash_Busy(); //Busy
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<MAXNUM; i++)
{
if(i==Address)
{
*Flash_ptrA++ =Data/256; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =Data%256; // Save Data
Flash_Busy(); //Busy
Flash_ptrB+=2;
}
else
{
*Flash_ptrA++ = *Flash_ptrB++; // 恢复Flash内的其他数据
Flash_Busy(); //Busy
}
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
//----------------------------------------------------------------------------------------------
unsigned int Flash_ReadWord (unsigned char Address)
{ unsigned int Data;
unsigned char *Flash_ptrA; // Segment A pointer
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Data=*(Flash_ptrA+Address)*256+*(Flash_ptrA+Address+1);
return(Data);
}
#endif
//==============================================================================================
#if(SAVELONG==ON)
void Flash_WriteLong (unsigned char Address,unsigned long int Data)
{
union LongChar LData;
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
LData.Long=Data;
Flash_CopyA2B(); //Flash内的数据先保存起来
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR; // Initialize Flash segment B pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptrA = 0; // Dummy write to erase Flash segment A
Flash_Busy(); //Busy
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<MAXNUM; i++)
{
if(i==Address)
{
*Flash_ptrA++ =LData.Bytes.BHH; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =LData.Bytes.BHL; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =LData.Bytes.BLH; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =LData.Bytes.BLL; // Save Data
Flash_Busy(); //Busy
Flash_ptrB+=4;
}
else
{
*Flash_ptrA++ = *Flash_ptrB++; // 恢复Flash内的其他数据
Flash_Busy(); //Busy
}
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
//----------------------------------------------------------------------------------------------
unsigned long int Flash_ReadLong (unsigned char Address)
{
unsigned char *Flash_ptrA; // Segment A pointer
union LongChar Data;
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Flash_ptrA+=Address;
Data.Bytes.BHH=*Flash_ptrA++;
Data.Bytes.BHL=*Flash_ptrA++;
Data.Bytes.BLH=*Flash_ptrA++;
Data.Bytes.BLL=*Flash_ptrA++;
return(Data.Long);
}
#endif
//==============================================================================================
#if(SAVEFLOAT==ON)
void Flash_WriteFloat (unsigned char Address,float Data)
{
union FloatChar FData;
unsigned char *Flash_ptrA; // Segment A pointer
unsigned char *Flash_ptrB; // Segment B pointer
unsigned int i;
FData.Float=Data;
Flash_CopyA2B(); //Flash内的数据先保存起来
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Flash_ptrB = (unsigned char *) FLASH_COPYADDR; // Initialize Flash segment B pointer
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY; // Clear Lock bit
*Flash_ptrA = 0; // Dummy write to erase Flash segment A
Flash_Busy(); //Busy
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
for (i=0; i<MAXNUM; i++)
{
if(i==Address)
{
*Flash_ptrA++ =FData.Bytes.BHH; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =FData.Bytes.BHL; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =FData.Bytes.BLH; // Save Data
Flash_Busy(); //Busy
*Flash_ptrA++ =FData.Bytes.BLL; // Save Data
Flash_Busy(); //Busy
}
else
{
*Flash_ptrA++ = *Flash_ptrB++; // 恢复Flash内的其他数据
Flash_Busy(); //Busy
Flash_ptrB+=4;
}
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
//----------------------------------------------------------------------------------------------
float Flash_ReadFloat (unsigned char Address)
{
unsigned char *Flash_ptrA; // Segment A pointer
union FloatChar Data;
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR; // Initialize Flash segment A pointer
Flash_ptrA+=Address;
Data.Bytes.BHH=*Flash_ptrA++;
Data.Bytes.BHL=*Flash_ptrA++;
Data.Bytes.BLH=*Flash_ptrA++;
Data.Bytes.BLL=*Flash_ptrA++;
return(Data.Float);
}
#endif
//==============================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -