📄 部分例程:flash_c(丁丁).htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0037)http://www.mcu51.com/list.asp?id=1177 -->
<HTML><HEAD><TITLE>部分例程:flash.c(丁丁)</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312"><LINK
href="部分例程:flash_c(丁丁).files/style.css" rel=stylesheet>
<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
<BODY>
<DIV align=center>
<CENTER></CENTER></DIV>
<DIV align=center>
<CENTER>
<TABLE cellSpacing=0 borderColorDark=#ffffff cellPadding=0 width="97%"
borderColorLight=#000000 border=1>
<TBODY>
<TR>
<TD width="100%" bgColor=#d0d0d0>
<P align=center>文章编号:1177----加入日期:2004-2-24 </P></TD></TR>
<TR>
<TD width="100%">
<P align=right><A href="javascript:self.close()">『关闭窗口』</A></P></TD></TR>
<TR>
<TD width="100%">
<P align=center><B>部分例程:flash.c(丁丁)</B></P></TD></TR>
<TR>
<TD width="100%">
<BLOCKQUOTE><BR>//******************************************************************************<BR>****<BR>//本函数模块来自"51单片机世界",作者版主丁丁(聂小猛)。<BR>//主页地址<A
href="http://www.mcu51.com/"
target=_blank>http://www.mcu51.com/</A><BR>//本程序为本站推出的"MCU51-63K仿真器"及"DX-51多功能试验板"而设计的,详情请到本站<BR>查看.<BR>//"51单片机世界"版权所有,未经允许,不得抄袭作为商业用途<BR>//******************************************************************************<BR>****<BR>//SST39F020的读写函数<BR>#define
uchar unsigned char<BR>#define uint unsigned int<BR>#define
ulong unsigned long<BR>#include <reg52.h><BR>#include
"study.h"<BR>//***********************************************************<BR>//读N个flash中的字节,每次最多65535字节<BR>//入口:在flash中的物理地址,读出来放在内存中的指针首位置,读出多少个字节<BR>readeprom(ulong
ad,uchar *pst,uint n)<BR>{<BR>union {ulong addr_l;struct {uint a32;uint
a10;}addr_i;struct {uchar <BR>a3;uint a21;uchar a0;}addr;}
address;<BR> uint i;<BR>uchar xdata
*flash;<BR><BR>P1=0xff; //P1口如被占用暂停读取<BR>while(P1!=0xff);<BR>address.addr_l=ad;<BR>P1=(P1&0xc0)
| (address.addr.a21/0x20);
//设置bank线,每块8K字节<BR>flash=0x8000+address.addr_i.a10%0x2000;
//flash窗口地址范围<BR>0x8000-0x9ffff<BR>for(i=0;i<n;i++) //读N个字节<BR>{<BR>*(pst++)=*(flash++);<BR>if(flash==0x9fff)
//如果地址跨页则翻到下一个bank<BR>{<BR>P1++;<BR>flash=0x8000;<BR>}<BR>}<BR>}<BR><BR>//*********************************<BR>//读全部flash数据,从串口输出<BR>void
readflash(void)<BR>{<BR>union {ulong addr_l;struct {uchar a3;uchar
a2;uint a10;}<BR>addr_i;struct {uchar a3,a2,a1,a0;}addr;}
address;<BR>uchar xdata c[1];//用来读一个字节的缓存<BR>uchar
*pst=c;<BR><BR>cls(8);setcursor(0,0);
//清屏,设置光标到左上方<BR>lcdstring("请准备好计算机接收软件,波特率19200bps.按任意键开始发<BR>送。");
//输出提示到液晶<BR>while(getkey(1000)==0); //等待按键<BR>cls(8);setcursor(0,0);
//提示正在发送<BR>lcdstring("FLASH中的数据正在从串口发送中..按任意键结束");<BR>putstring("以下是大虾51学习板中flash中的内容\r\n");
<BR>address.addr_l=0x00000; //读出全部的数据,起始地址为0<BR>do<BR>{<BR>if
(address.addr.a0%16==0)<BR>{
//输出格式,每16个字符一行,输出地址,形成HEX形式数<BR>据<BR>CR;puthex(address.addr.a2);puthex<BR>(address.addr.a1);puthex(address.addr.a0);putbyte(':');<BR>}<BR>readeprom(address.addr_l,pst,1); //读出一个字节<BR>puthex(*pst);
//输出改字节的HEX码<BR>putbyte('
'); //输出一个空格,格开每个字节<BR>address.addr_l++;
//地址加一<BR>}while(getkey(1)==0);
//没有按键继续发送<BR>}<BR><BR>//**************************************<BR>//擦除flash块,地址为0xffffffff时执行片擦,其他地址擦除当前位置的4K字节块<BR>//入口:要擦除的地址<BR>void
erasesector(ulong addr)<BR>{ <BR>//定义一个联合,以便地址计算更快速<BR>union {ulong
addr_l;struct {uchar a3;uchar a2;uint a10;}<BR>addr_i;struct {uchar
a3;uint a21;uchar a0;}addr;} address;<BR>uint delay; <BR>uchar
xdata *pst;
//定义个指向外部xdata的指针<BR><BR>P1=0xff; //如果P1被占用则等待<BR>while(P1!=0xff); <BR><BR>address.addr_l=addr; <BR><BR>pst=0x8000+0x5555%0x2000;
//往flash写入钥匙串<BR>P1=(P1&0xc0) |
(0x55>>5);<BR>*pst=0xaa;<BR><BR>pst=0x8000+0x2aaa%0x2000;<BR>P1=(P1&0xc0)
|
(0x2a>>5);<BR>*pst=0x55;<BR><BR>pst=0x8000+0x5555%0x2000;<BR>P1=(P1&0xc0)
|
(0x55>>5);<BR>*pst=0x80;<BR><BR><BR>pst=0x8000+0x5555%0x2000;<BR>P1=(P1&0xc0)
|
(0x55>>5);<BR>*pst=0xaa;<BR><BR>pst=0x8000+0x2aaa%0x2000;<BR>P1=(P1&0xc0)
|
(0x2a>>5);<BR>*pst=0x55;<BR><BR>if(addr==0xffffffff) //如果地址是0xffffffff则改为片擦,这是为了方<BR>便,省得多做一个函数<BR>{<BR>pst=0x8000+0x5555%0x2000;
//片擦<BR>P1=(P1&0xc0) |
(0x55>>5);<BR>*pst=0x10;<BR>}<BR>else<BR>{<BR>pst=0x8000+address.addr_i.a10%0x2000; //按照输入的地址擦<BR>除当前所在的块<BR>P1=(P1&0xc0)
| (address.addr.a21/0x20);
<BR>*pst=0x30;<BR>}<BR>for(delay=0;delay<20000;delay++); //延时等待写入完成<BR>}<BR><BR>//**************************<BR>//在flash中写入一个字节<BR>//入口:写入的地址,写入的字节<BR>void
writeflash(ulong addr_w,uchar ch)<BR>{<BR>union {ulong addr_l;struct
{uchar a3;uchar a2;uint a10;}<BR>addr_i;struct {uchar a3;uint a21;uchar
a0;}addr;} address;<BR>uchar xdata
*pst;<BR><BR>P1=0xff; //P1如被占用等待<BR>while(P1!=0xff);<BR><BR>address.addr_l=addr_w;<BR><BR>pst=0x8000+0x5555%0x2000; //输入钥匙串<BR>P1=(P1&0xc0)
|
(0x55>>5);<BR>*pst=0xaa;<BR><BR>pst=0x8000+0x2aaa%0x2000;<BR>P1=(P1&0xc0)
| (0x2a>>5);<BR>*pst=0x55;<BR><BR>pst=0x8000+0x5555%0x2000;
<BR>P1=(P1&0xc0) |
(0x55>>5);<BR>*pst=0xa0;<BR><BR>pst=0x8000+address.addr_i.a10%0x2000; //输入地址和数据<BR>P1=(P1&0xc0)
| (address.addr.a21/0x20);
<BR>*pst=ch;<BR><BR>}<BR><BR>//******************************<BR>//写入一个文件,需要从计算机串口输出<BR>void
write_file(void)<BR>{<BR>ulong n;<BR>uint x;<BR>uchar ch;<BR><BR>cls(8);
setcursor(0,0);
//清屏,光标移到左上角<BR>lcdstring("警告!改变flash内容可能导致汉字无法显示!按取消键返回,其他键<BR>继续!");<BR>while((ch=getkey(1000))==0x00);
//等待按键<BR>if(ch=='C') return; //如果收到Cancel<BR>键则退出<BR>cls(8);
setcursor(0,0);
<BR>lcdstring("串口波特率19200bps,正在等待计算机发来的文件信息...");<BR><BR>putstring("\r\n请选择好要发送的文件,并输入写文件密码(1234),输入完成<BR>后请在1秒种之内点发送,ESC返回.");
<BR>if(getbyte()!='1')return;
//校验烧写密码,这是为了防<BR>止误烧<BR>if(getbyte()!='2')return;<BR>if(getbyte()!='3')return;<BR>if(getbyte()!='4')return;<BR>putstring("\r\n");<BR><BR>erasesector(0xffffffff);
//擦除整块flash<BR><BR>for(n=0;n<0x80000;n++)
//最大烧写512K字节<BR>{<BR>x=0;<BR>while(!inbufsign)
<BR>{<BR>x++;<BR>if(x>60000) goto isOut;
//接收超时退出<BR>}<BR>writeflash(n,getbyte());<BR>}<BR>isOut:
putstring("\r\n烧写完毕!");<BR>}<BR><BR><BR>(文章推荐人:dhdO)
<BR><BR></BLOCKQUOTE></TD></TR>
<TR>
<TD width="100%">
<P align=center> </P></TD></TR></TBODY></TABLE><A
href="http://www.mcu51.com/bbs" target=_blank>返回大虾论坛</A> <A
href="http://www.mcu51.com/default.asp" target=_blank>返回首页</A>
</CENTER></DIV></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -