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

📄 flash.c

📁 不开销缓存RAM的430Flash读写程序
💻 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 + -