📄 flash.c
字号:
return(Data);
}
/****************************************************************************
* 名 称:Flash_WriteWord()
* 功 能:向Flash写入一个整型变量
* 入口参数:Addr:被写入FlashROM单元的地址
Data:待写入的整型变量(2字节数据)
* 出口参数:无
* 说 明: 该函数保存数据将占用Addr和Addr+1两个存储单元
* 范 例:Flash_WriteWord(2,1234);将常数1233写入2~3单元
Flash_WriteWord(4,a);将整型变量a写入4~5单元
****************************************************************************/
void Flash_WriteWord (unsigned int Addr,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
Flash_Erase(FLASH_SAVEADDR);
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
DISABLE_INT;
if(i==Addr)
{
*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
}
RESTORE_INT;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/****************************************************************************
* 名 称:Flash_ReadWord()
* 功 能:从FlashROM读回一个整型变量
* 入口参数:Addr:待读出变量FlashROM单元的起始地址(存入的地址)
* 出口参数:读回的整型变量值
****************************************************************************/
unsigned int Flash_ReadWord (unsigned int Addr)
{ unsigned int Data;
unsigned char *Flash_ptrA; // Segment A pointer
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Data=*(Flash_ptrA+Addr)*256+*(Flash_ptrA+Addr+1);
return(Data);
}
/****************************************************************************
* 名 称:Flash_WriteLong()
* 功 能:向FlashROM写入一个长整型变量
* 入口参数:Addr:被写入FlashROM单元的地址
Data:待写入的长整型变量(4字节数据)
* 出口参数:无
* 说 明: 该函数保存数据将占用Addr到Addr+3 共4个存储单元
* 范 例:Flash_WriteLong(7,123456);将长整型数123456写入7~10单元
Flash_WriteLong(11,a);将长整型变量a写入11~14单元
****************************************************************************/
void Flash_WriteLong (unsigned int Addr,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
Flash_Erase(FLASH_SAVEADDR);
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
DISABLE_INT;
if(i==Addr)
{
*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
}
RESTORE_INT;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/****************************************************************************
* 名 称:Flash_ReadLong()
* 功 能:从FlashROM读回一个长整型变量
* 入口参数:Addr:待读出变量所在FlashROM单元的起始地址(存入的地址)
* 出口参数:读回的长整型变量值
****************************************************************************/
unsigned long int Flash_ReadLong (unsigned int Addr)
{
unsigned char *Flash_ptrA; // Segment A pointer
union LongChar Data;
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Flash_ptrA+=Addr;
Data.Bytes.BHH=*Flash_ptrA++;
Data.Bytes.BHL=*Flash_ptrA++;
Data.Bytes.BLH=*Flash_ptrA++;
Data.Bytes.BLL=*Flash_ptrA++;
return(Data.Long);
}
/****************************************************************************
* 名 称:Flash_WriteFloat()
* 功 能:向FlashROM写入一个浮点型变量
* 入口参数:Addr:被写入FlashROM单元的地址
Data:待写入的浮点型变量(4字节数据)
* 出口参数:无
* 说 明: 该函数保存数据将占用Addr到Addr+3 共4个存储单元
* 范 例:Flash_WriteFloat(15,3.14159);将浮点数3.14159写入15~18单元
Flash_WriteFloat(19,a);将浮点变量a写入19~22单元
****************************************************************************/
void Flash_WriteFloat (unsigned int Addr,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
Flash_Erase(FLASH_SAVEADDR);
FCTL1 = FWKEY + WRT; // Set WRT bit for write operation
FCTL3 = FWKEY; // Clear Lock bit
for (i=0; i<MAXNUM; i++)
{
DISABLE_INT;
if(i==Addr)
{
*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
Flash_ptrB+=4;
}
else
{
*Flash_ptrA++ = *Flash_ptrB++; // 恢复Flash内的其他数据
Flash_Busy(); //Busy
}
RESTORE_INT;
}
FCTL1 = FWKEY; // Clear WRT bit
FCTL3 = FWKEY + LOCK; // Set LOCK bit
}
/****************************************************************************
* 名 称:Flash_ReadFloat()
* 功 能:从FlashROM读回一个浮点型变量
* 入口参数:Addr:待读出变量所在FlashROM单元的起始地址(存入的地址)
* 出口参数:读回的浮点型变量值
****************************************************************************/
float Flash_ReadFloat (unsigned int Addr)
{
unsigned char *Flash_ptrA; // Segment A pointer
union FloatChar Data;
Flash_ptrA = (unsigned char *) FLASH_SAVEADDR;// Initialize Flash segment A pointer
Flash_ptrA+=Addr;
Data.Bytes.BHH=*Flash_ptrA++;
Data.Bytes.BHL=*Flash_ptrA++;
Data.Bytes.BLH=*Flash_ptrA++;
Data.Bytes.BLL=*Flash_ptrA++;
return(Data.Float);
}
//==============================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -