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

📄 flash.c

📁 C8051F340在应用中读写FLASH
💻 C
字号:

// 	flash.c

// 擦除、写和读 FLASH存储器 
// 目标器件 C8051F340 
// 开发工具 KEIL C51 

/*****************************************************************************/
// 作者:牛余朋 
// 现于北京一科研单位工作
// 可以私人承接电子产品开发
// 联系电话:15811095191
// QQ:41877690:火牛
/*****************************************************************************/

#include "C8051F340.h" 
#include <stdio.h> 
#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_SIZE;i++)
 	 data_array[i]=ReadFlash(i);

 //------------------第二步	
 // 下面开始擦除整个参数扇区的数据 
 EA=0;	 // 关全局中断

 FLKEY = 0xA5;
 FLKEY = 0xF1;
 FLSCL = 0x80;       			// 设置 FLASH标度寄存器 对 2MHz 系统时钟  
 PSCTL = 0x03;       			// 将 PSWE 和 PSEE 置 1 MOVX 指令对应的 FLASH页 
 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<DATA_SIZE;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;	  // 开全局中断

  return test;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -