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

📄 部分例程:flash_c(丁丁).htm

📁 很全的flash芯片驱动程序包括:SST28SF040
💻 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&nbsp;&nbsp;unsigned int<BR>#define 
        ulong unsigned long<BR>#include &lt;reg52.h&gt;<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>&nbsp; uint i;<BR>uchar xdata 
        *flash;<BR><BR>P1=0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//P1口如被占用暂停读取<BR>while(P1!=0xff);<BR>address.addr_l=ad;<BR>P1=(P1&amp;0xc0) 
        | (address.addr.a21/0x20); 
        //设置bank线,每块8K字节<BR>flash=0x8000+address.addr_i.a10%0x2000; 
        //flash窗口地址范围<BR>0x8000-0x9ffff<BR>for(i=0;i&lt;n;i++)&nbsp;&nbsp;//读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);&nbsp;&nbsp;//等待按键<BR>cls(8);setcursor(0,0); 
        &nbsp;//提示正在发送<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);&nbsp;&nbsp;//读出一个字节<BR>puthex(*pst); 
        //输出改字节的HEX码<BR>putbyte(' 
        ');&nbsp;&nbsp;//输出一个空格,格开每个字节<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; &nbsp;<BR>uchar 
        xdata *pst; 
        //定义个指向外部xdata的指针<BR><BR>P1=0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果P1被占用则等待<BR>while(P1!=0xff);&nbsp;&nbsp;&nbsp;<BR><BR>address.addr_l=addr;&nbsp;&nbsp;<BR><BR>pst=0x8000+0x5555%0x2000; 
        //往flash写入钥匙串<BR>P1=(P1&amp;0xc0) | 
        (0x55&gt;&gt;5);<BR>*pst=0xaa;<BR><BR>pst=0x8000+0x2aaa%0x2000;<BR>P1=(P1&amp;0xc0) 
        | 
        (0x2a&gt;&gt;5);<BR>*pst=0x55;<BR><BR>pst=0x8000+0x5555%0x2000;<BR>P1=(P1&amp;0xc0) 
        | 
        (0x55&gt;&gt;5);<BR>*pst=0x80;<BR><BR><BR>pst=0x8000+0x5555%0x2000;<BR>P1=(P1&amp;0xc0) 
        | 
        (0x55&gt;&gt;5);<BR>*pst=0xaa;<BR><BR>pst=0x8000+0x2aaa%0x2000;<BR>P1=(P1&amp;0xc0) 
        | 
        (0x2a&gt;&gt;5);<BR>*pst=0x55;<BR><BR>if(addr==0xffffffff)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果地址是0xffffffff则改为片擦,这是为了方<BR>便,省得多做一个函数<BR>{<BR>pst=0x8000+0x5555%0x2000; 
        //片擦<BR>P1=(P1&amp;0xc0) | 
        (0x55&gt;&gt;5);<BR>*pst=0x10;<BR>}<BR>else<BR>{<BR>pst=0x8000+address.addr_i.a10%0x2000;&nbsp;&nbsp;//按照输入的地址擦<BR>除当前所在的块<BR>P1=(P1&amp;0xc0) 
        | (address.addr.a21/0x20); 
        <BR>*pst=0x30;<BR>}<BR>for(delay=0;delay&lt;20000;delay++);&nbsp;&nbsp;//延时等待写入完成<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;&nbsp;&nbsp;&nbsp;//P1如被占用等待<BR>while(P1!=0xff);<BR><BR>address.addr_l=addr_w;<BR><BR>pst=0x8000+0x5555%0x2000;&nbsp;&nbsp;//输入钥匙串<BR>P1=(P1&amp;0xc0) 
        | 
        (0x55&gt;&gt;5);<BR>*pst=0xaa;<BR><BR>pst=0x8000+0x2aaa%0x2000;<BR>P1=(P1&amp;0xc0) 
        | (0x2a&gt;&gt;5);<BR>*pst=0x55;<BR><BR>pst=0x8000+0x5555%0x2000; 
        <BR>P1=(P1&amp;0xc0) | 
        (0x55&gt;&gt;5);<BR>*pst=0xa0;<BR><BR>pst=0x8000+address.addr_i.a10%0x2000;&nbsp;&nbsp;//输入地址和数据<BR>P1=(P1&amp;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); &nbsp; 
        <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&lt;0x80000;n++) 
        //最大烧写512K字节<BR>{<BR>x=0;<BR>while(!inbufsign) 
        <BR>{<BR>x++;<BR>if(x&gt;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 + -