📄 writeflash.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 + -