微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > c8051f310 flash写擦除

c8051f310 flash写擦除

时间:10-02 整理:3721RD 点击:
想实现这么一个功能:经过按键调整后的数值储存起来,断电后重启要能记忆住。根据数据手册的要求做了几次试验都没能成功,看哪位高手指点一下。先谢谢各位了。芯片是C8051F310.

//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include "c8051F410.h"
#include "F410_FlashPrimitives.h"
#include<intrins.h>
//#include "F410_FlashPrimitives.h"
#include <absacc.h>
//-----------------------------------------------------------------------------
// Function Prototypes
//-----------------------------------------------------------------------------
void          FLASH_ByteWrite (FLADDR addr, char byte);
unsigned char FLASH_ByteRead  (FLADDR addr);
void          FLASH_PageErase (FLADDR addr);
//-----------------------------------------------------------------------------
// FLASH_ByteWrite
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   :
//   1) FLADDR addr - address of the byte to write to
//                    valid range is from 0x0000 to 0x7DFE for 32K devices
//                    valid range is from 0x0000 to 0x3FFE for 16K devices
//   2) char byte - byte to write to Flash.
//
// This routine writes <byte> to the linear FLASH address <addr>.
//-----------------------------------------------------------------------------
void FLASH_ByteWrite (FLADDR addr, char byte)
{
   bit EA_SAVE = EA;                   // Preserve EA
  char xdata * data pwrite;           // FLASH write pointer
   EA = 0;                             // Disable interrupts
  VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold
  RSTSRC = 0x02;                      // Enable VDD monitor as a reset source
   pwrite = (char xdata *) addr;
  FLKEY  = 0xA5;                      // Key Sequence 1
  FLKEY  = 0xF1;                      // Key Sequence 2
  PSCTL |= 0x01;                      // PSWE = 1 which enables writes
   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold
   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source
  // XBYTE[addr]=byte;
*pwrite = byte;                     // Write the byte
  PSCTL &= ~0x01;                     // PSWE = 0 which disable writes
   EA = EA_SAVE;                       // Restore interrupts
}
//-----------------------------------------------------------------------------
// FLASH_ByteRead
//-----------------------------------------------------------------------------
//
// Return Value :
//      unsigned char - byte read from Flash
// Parameters   :
//   1) FLADDR addr - address of the byte to read to
//                    valid range is from 0x0000 to 0x7DFE for 32K devices
//                    valid range is from 0x0000 to 0x3FFE for 16K devices
//
// This routine reads a <byte> from the linear FLASH address <addr>.
//-----------------------------------------------------------------------------
unsigned char FLASH_ByteRead (unsigned  int addr)
{
   bit EA_SAVE = EA;                   // Preserve EA
   UCHAR code * data pread;             // FLASH read pointer
   unsigned char byte;
   EA = 0;                             // Disable interrupts
   pread = (char code *) addr;
   byte = *pread;                      // Read the byte
   EA = EA_SAVE;                       // Restore interrupts
   return byte;
}
//-----------------------------------------------------------------------------
// FLASH_PageErase
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   :
//   1) FLADDR addr - address of any byte in the page to erase
//                    valid range is from 0x0000 to 0x7BFF for 32K devices
//                    valid range is from 0x0000 to 0x3DFF for 16K devices
//
// This routine erases the FLASH page containing the linear FLASH address
// <addr>.  Note that the page of Flash containing the Lock Byte cannot be
// erased if the Lock Byte is set.
//
//-----------------------------------------------------------------------------
void FLASH_PageErase (FLADDR addr)
{
   bit EA_SAVE = EA;                   // Preserve EA
   char xdata * data pwrite;           // FLASH write pointer
   EA = 0;   
  // PCA0MD &= ~(1<<6);                         // Disable interrupts
   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold
   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source
   pwrite = (char xdata *) addr;
   FLKEY  = 0xA5;                      // Key Sequence 1
   FLKEY  = 0xF1;                      // Key Sequence 2
   PSCTL  = 0x03;                      // PSWE = 1; PSEE = 1
   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold
   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source
   *pwrite = 0;                        // Initiate page erase
   PSCTL &= ~0x03;                     // PSWE = 0; PSEE = 0
   
   EA = EA_SAVE;                       // Restore interrupts
}
//-----------------------------------------------------------------------------
// End Of File
//-----------------------------------------------------------------------------

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top