文档库 最新最全的文档下载
当前位置:文档库 › C8051F340读写flash

C8051F340读写flash

// 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; // 开全局中断

}

相关文档