// flash.c
// 擦除、写和读FLASH存储器
// 目标器件C8051F340
// 开发工具KEIL C51
/*****************************************************************************/ // 作者:牛余朋
// 现于北京一科研单位工作
// 可以私人承接电子产品开发
// 联系电话:158********
// QQ:41877690:火牛
/*****************************************************************************/
#include "C8051F340.h"
#include
#include "flash.h"
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
unsigned char xdata data_array[DATA_SIZE];
WriteFlash(unsigned int address, unsigned char write_data)
{
unsigned char xdata *pwrite; // 程序存储器空间的指针FLASH 指向待写地址unsigned char i;
//------------------第一步
// 首先读出参数整个扇区的数据
for(i=0;i data_array[i]=ReadFlash(i); //------------------第二步 // 下面开始擦除整个参数扇区的数据 EA=0; // 关全局中断 FLKEY = 0xA5; FLKEY = 0xF1; FLSCL = 0x80; // 设置FLASH标度寄存器对2MHz 系统时钟PSCTL = 0x03; // 将PSWE 和PSEE 置 1 MOVX 指令对应的 pwrite = DATA_SECTOR_ADDRESS; // 将指针指向待擦除页 *pwrite = 0; // 启动擦除过程 PSCTL = 0; // 清除PSEE, PSWE //------------------第三步 //以上擦除完毕,开始根据指定的偏移地址改写缓冲区data_array[DATA_SIZE] data_array[address] = write_data; //------------------第四步 // 以上改写缓冲区data_array[512]完毕,现在开始将缓冲区data_array[DATA_SIZE]中的所有数据重新写入flash PFE0CN = 0; // Clear the FLBWE bit (register PFE0CN) to select single-byte write mode. PSCTL = 0x01; // Set the PSWE bit (register PSCTL) // Clear the PSEE bit (register PSCTL) for(i=0;i { FLKEY = 0xA5; // Write the first key code to FLKEY: 0xA5. FLKEY = 0xF1; // Write the second key code to FLKEY: 0xF1 *pwrite = data_array[i]; // 写入字节 pwrite++; } PSCTL = 0; // Clear the PSWE bit.禁止FLASH写 EA=1; // 开全局中断 } unsigned char ReadFlash(unsigned int address) { unsigned char code *pread; // 程序存储器空间的指针FLASH 指向待读地址unsigned int test; EA=0; // 关全局中断 pread =DATA_SECTOR_ADDRESS+address; test = *pread; EA=1; // 开全局中断 }