?? flash.c
字號:
#include "Config.h"
#include CPU
#define ON 1
#define OFF 0
#define SAVEWORD ON /*雙字節(jié)數(shù)讀寫函數(shù)編譯開關(guān)*/
#define SAVELONG ON /*四字節(jié)數(shù)讀寫函數(shù)編譯開關(guān)*/
#define SAVEFLOAT OFF /* 浮點數(shù)讀寫函數(shù)編譯開關(guān)*/
#define MAXNUM 32 /*最大數(shù)據(jù)量(字節(jié))*/
#define FLASH_SAVEADDR (0x1080) /*Flash數(shù)據(jù)存儲區(qū)首地址*/
#define FLASH_COPYADDR (0x1000) /*Flash備份存儲區(qū)首地址*/
union LongChar //長整字節(jié) 復(fù)合結(jié)構(gòu)
{ unsigned long int Long;
struct ByteL4
{
unsigned char BHH;
unsigned char BHL;
unsigned char BLH;
unsigned char BLL;
}Bytes;
};
union FloatChar //浮點字節(jié) 復(fù)合結(jié)構(gòu)
{ 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內(nèi)的數(shù)據(jù)先保存起來
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++; // 恢復(fù)Flash內(nèi)的其他數(shù)據(jù)
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內(nèi)的數(shù)據(jù)先保存起來
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++; // 恢復(fù)Flash內(nèi)的其他數(shù)據(jù)
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內(nèi)的數(shù)據(jù)先保存起來
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++; // 恢復(fù)Flash內(nèi)的其他數(shù)據(jù)
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內(nèi)的數(shù)據(jù)先保存起來
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++; // 恢復(fù)Flash內(nèi)的其他數(shù)據(jù)
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
//==============================================================================================
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -