⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash.c

📁 MSP430FE425的16位低功耗单片机的FLASH通用程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -