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

📄 writeflash.c

📁 向flash写入数据的程序,用于嵌入式开发
💻 C
字号:
/***************************************************************************************

* 生成日期:	2006-11-30
* 文件名:		writeFlash.c
* 作者:		李敬东
* 功能说明:	在80C186或数据区和程序区为统一空间的环境下在FLASH芯片(29EE020)中写入数据
* 主要函数清单:
	void WriteFlash(unsigned char pageNo)
	void ReadFlash(unsigned char pageNo)
* 使用说明: 本例程是运行在80C186单片机环境下,由于80C186为16位地址线,所以共用了2片29EE020,
                以下操作是按字写入读出,使用着可根据具体情况进行调整;
            本例程所用FLASH数据区以0x80000为起始地址,到0x8FFFF共64K空间,共分为256页,每次操作可在其中一页上写入数据;
            由于程序区和数据区都在同一个FLASH芯片上,根据FLASH芯片的特点,写操作的执行需调入到RAM空间中进行
            29EE020芯片为分页存储,每页128字节,每次写FLASH时需一次写入一页,不能只写入一部分,写过程中不能停止,也不能读取FLASH
                (FH98主控板地址线为16位,所以使用2片29EE020,所以该例程中写FLASH时写入的是128字)
            
	
*****************************************************************************************/

#include <DOS.H>

#define FLASH_BASE      0x8000 //FLASH芯片起始段地址
#define FLASH_C1        0xAAAA
#define FLASH_C0        0x5554
#define FLASH_ADDR      0x9000
#define DT_DATA_ADDR	   0xA000
#define WRITE_FLASH_COMMAND_CODE1 0xAAAA
#define WRITE_FLASH_COMMAND_CODE2 0x5555
#define WRITE_FLASH_COMMAND_CODE3 0xA0A0


#define WriteFlash_SEG    0d035h //WriFlash()函数在程序区的段地址,这里设为0d035h
#define WriteFlash_OFFSET 0006h  //WriFlash()函数在程序区的偏移地址,这里设为0006h
#define RAM_SEG           0600h  //占用RAM区空间的段地址
#define RAM_OFFSET        0000h  //占用RAM区空间的偏移地址
#define CODE_LEN          0800h  //调用函数代码的长度

typedef void (*FlashType)(unsigned char);

//写FLASH
void WriteFlash(unsigned char pageNo,unsigned int *pData)
{//pageNo FLASH页号,//pData 指向数据变量的指针
	unsigned int far *addrw;
	unsigned char far *addrb;
	unsigned int i;
	unsigned char read1,read2;

	addrw = (unsigned int far *)MK_FP(FLASH_BASE,FLASH_C1);
	*addrw = WRITE_FLASH_COMMAND_CODE1;  //写FLASH控制字
	addrw = (unsigned int far *)MK_FP(FLASH_BASE,FLASH_C0);
	*addrw = WRITE_FLASH_COMMAND_CODE2;  //写FLASH控制字
	addrw = (unsigned int far *)MK_FP(FLASH_BASE,FLASH_C1);
	*addrw = WRITE_FLASH_COMMAND_CODE3;  //写FLASH控制字
	addrw = (unsigned int far *)MK_FP(FLASH_ADDR,pageNo*256);

	for(i=0;i<128;i++)
	{
		*addrw++ = *pData++             //写入所需数据;
	}
	addrb = (unsigned char *)MK_FP(FLASH_ADDR,pageNo*256+255);
	do
	{
		read1 = (*addrb) & 0x40;
		read2 = (*addrb) & 0x40;
	}
	while(read1^read2);

	for(i=0;i<5000;i++);
	return;
}

//读FLASH
void ReadFlash(unsigned char pageNo,unsigned int *pData)
{
	unsigned int far *addrw;
	unsigned char i;

	addrw = (byte *)MK_FP(FLASH_ADDR,pageNo*256);
	for(i=0;i<128;i++) 
   	*pData++ = *addrw++; //读出数据
}

//在写FLASH前,先将函数调入RAM区再执行
void WriteFlashProcess(unsigned char pageNo)
{
	asm
	{//从代码区将函数WriteFlash()调入RAM区,调入代码的长度为CODE_LEN
		push ds
		push es
		mov dx,WriteFlash_SEG     //WriFlash()函数在程序区的段地址
		mov ds,dx
		mov si,WriteFlash_OFFSET  //WriFlash()函数在程序区的偏移地址
		mov dx,RAM_SEG            //占用RAM区空间的段地址
		mov es,dx
		mov di,RAM_OFFSET         //占用RAM区空间的偏移地址
		mov cx,CODE_LEN           //调用的代码的长度
		rep movsb
		pop es
		pop ds
	}

	FlashFunc = (FlashType)0x06000000L;//注意和RAM_SEG、RAM_OFFSET相对应

	disable();
	(*FlashFunc)(pageNo);
	enable();
}

 

⌨️ 快捷键说明

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