flash.c

来自「不开销缓存RAM的430Flash读写程序」· C语言 代码 · 共 257 行

C
257
字号
#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 + =
减小字号Ctrl + -
显示快捷键?