如何往flash里面写入int型数据,张老师

[复制链接]
6639|19
 楼主| dianqi123 发表于 2007-5-26 11:11 | 显示全部楼层 |阅读模式
<br />/*-------------DoEraseFlash:擦除指定flash区------------*/&nbsp;<br />void&nbsp;DoEarseFlash(void)<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;FLBPR=0xff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设置flash保护区<br />&nbsp;&nbsp;&nbsp;&nbsp;FLCR_ERASE=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1-&gtERASE,0-&gtMASS(页擦除)<br />&nbsp;&nbsp;&nbsp;&nbsp;FLCR_MASS=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;c=FLBPR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读FLBPR&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde00))=0x99;//向被擦写的单元写任意字符<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt100;c++);&nbsp;&nbsp;&nbsp;//延时10us<br />&nbsp;&nbsp;&nbsp;&nbsp;FLCR_HVEN=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1-&gtHVEN&nbsp;(加高压)<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt1000;c++);&nbsp;&nbsp;//延时时间必须&gt1.6ms<br />&nbsp;&nbsp;&nbsp;&nbsp;FLCR_ERASE=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0-&gtErase<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt100;c++);&nbsp;&nbsp;&nbsp;//10us<br />&nbsp;&nbsp;&nbsp;&nbsp;FLCR_HVEN=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0-&gtHVEN(取消高压)<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt100;c++);&nbsp;&nbsp;&nbsp;//延时10us<br />&nbsp;&nbsp;}<br /><br />/*-------------------------------------------------------*/<br />/*-----------DoWriteFlash:实际执行的写入函数-----------*/<br />void&nbsp;DoWriteFlash()<br />&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;int&nbsp;c;<br />&nbsp;&nbsp;&nbsp;&nbsp;FLBPR=0xff;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;FLCR_PGM=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1-&gtPGM,编程状态&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;c=FLBPR;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读FLBPR&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde00))=0x88;//0x88-&gtC000,选中flash行&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt200;c++);&nbsp;&nbsp;&nbsp;&nbsp;//10us<br />&nbsp;&nbsp;&nbsp;&nbsp;FLCR_HVEN=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//1-&gtHVEN<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt100;c++);&nbsp;&nbsp;&nbsp;&nbsp;//10us&nbsp;&nbsp;<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde00))=12;//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />&nbsp;&nbsp;&nbsp;&nbsp;FLCR_PGM=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0-&gtPGM&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt100;c++);&nbsp;&nbsp;&nbsp;&nbsp;//10us<br />&nbsp;&nbsp;&nbsp;&nbsp;FLCR_HVEN=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//0-&gtHVEN&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt100;c++);&nbsp;&nbsp;&nbsp;&nbsp;//10us<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;}<br />现在在地址0xde00里写char类型的数据没有问题,但是如何写超过255的数呢<br />譬如我想写3456,我将DoWriteFlash改为<br />*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde00))=34;//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde01))=56;//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br /><br />可是为什么不对呢?
mcuall 发表于 2007-5-26 14:19 | 显示全部楼层

一次只能写一个吧

  
 楼主| dianqi123 发表于 2007-5-26 15:38 | 显示全部楼层

如果一次写一个那写一个int型数据怎么写呢?譬如3456

如果一次写一个那写一个int型数据怎么写呢?譬如3456
computer00 发表于 2007-5-26 15:50 | 显示全部楼层

3456是十进制的吧? 要转换为十六进制才能写入

3456转换为十六进制就是0xD80,&nbsp;还要看你系统是大端结构还是小端结构。<br /><br />如果是大端结构,则将0x0D写在前面的地址,而0x80写在后面的地址.<br />如果是小端结构,则刚好相反.<br /><br /><br />自己转换比较麻烦,可以直接在程序里写,使用移位操作,<br /><br /><br />*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde00))=(3456&gt&gt8);//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde01))=(3456&0xFF);//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />
张明峰 发表于 2007-5-27 06:49 | 显示全部楼层

楼主应该了解一下数据表达方式

8位单片机中一个8位宽的字节是最基本的数据描述单位,其他所有数据类型,如int、long、float等都是由多个字节构成。你现在可以将1个字节写入Flash,那就重复写入该过程将其他字节顺叙写入即可。
free_tech 发表于 2007-5-28 08:57 | 显示全部楼层

支持页写功能

你可以一次写入16个字节,准备好要写入的数据,可以一次写入8个INT型
 楼主| dianqi123 发表于 2007-5-29 17:37 | 显示全部楼层

既然可以

  
 楼主| dianqi123 发表于 2007-5-29 17:41 | 显示全部楼层

既然可以一次写入8个int数据,为什么按照我的写法写3456不对

既然可以一次写入8个int数据,为什么按照我的写法写3456不对呢
 楼主| dianqi123 发表于 2007-5-29 17:49 | 显示全部楼层

一定要先转换成16进制才能写马?

一定要先转换成16进制才能写马?为什么我写char类型小于255都可以
computer00 发表于 2007-5-30 02:17 | 显示全部楼层

晕晕晕....楼主还没弄明白....

一个16位的整型分成2个字节,字节1和字节2.<br /><br />你往字节1写入了34,往字节2写入了56,那么读回来的结果是多少?<br /><br />就是34*256+56,而不是3456.&nbsp;3456是我们十进制的写法,可是MCU里面的高字节<br />和低字节里面可不是分别保存着3456,而是对应的十六进制的高字节和低字节。<br />如果照你所想,那一个16位的int岂不是最大是255255了???&nbsp;可实际上16位的<br />最大值是65535,即255*256+255.&nbsp;而不是直接将两个十进制的连起来,而应该将<br />两个十六进制的连起来,既0xFFFF.
HotPower 发表于 2007-5-30 03:30 | 显示全部楼层

不喜欢这种写法,确实有些晕~~~

  
free_tech 发表于 2007-5-30 08:35 | 显示全部楼层

对dianqi123:010101010101。。。

计算机只认0和1,所谓的int&nbsp;就是16位最大1111&nbsp;1111&nbsp;1111&nbsp;1111,8位&nbsp;机一次<br />只处理8个位,它的数据线是8位.一次只能写byte,&nbsp;&nbsp;&nbsp;3456,=0b0000&nbsp;1101&nbsp;1000&nbsp;0000,超出处理能力,所以必须分成2个8位来处理,多看一些汇编例子
 楼主| dianqi123 发表于 2007-5-30 17:03 | 显示全部楼层

多谢老师的解答

参照了各位老师的建议,现在int型数据可以写入了,是转化成16进制写的,但又出现了一个问题,具体程序如下:<br />&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde00))=(3456&gt&gt8);//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde01))=(3456&0xFF);//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde02))=(1278&gt&gt8);//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />&nbsp;&nbsp;&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde03))=(1278&0xFF);//将数据写入相应的flash地址&nbsp;<br />我现在想存两个数据,3456,1278,我如果单独存其中一个都没有问题,但是为什么存两个就老是复位,不知道什么原因&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;
 楼主| dianqi123 发表于 2007-5-30 17:29 | 显示全部楼层

为什么不能连续写数据

  
 楼主| dianqi123 发表于 2007-5-30 18:37 | 显示全部楼层

如何往flash里写入多个int型数据

  
 楼主| dianqi123 发表于 2007-5-31 10:18 | 显示全部楼层

如何写呢

写flash的时候遇到一个问题,我想保存的数据存的起始地址是0xde00,<br />譬如存入3456,<br />&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde00))=(3456&gt&gt8);//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde01))=(3456&0xFF);//将数据写入相应的flash地址<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />读的时候<br />&nbsp;m=*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde00));&nbsp;//00,01地址写入KWH<br />&nbsp;&nbsp;&nbsp;n=*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde01));<br />&nbsp;&nbsp;m=m&lt&lt8;<br />&nbsp;&nbsp;kwh=m+n;&nbsp;&nbsp;读出的数据没有问题<br />现在我想存两个int型数据,如3456,1278,仍采用上述方法,将1278存在0xde02,0xde0<br />3地址,程序如下:<br />&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde00))=(3456&gt&gt8);//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde01))=(3456&0xFF);//将数据写入相应的flash地址<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />&nbsp;&nbsp;*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde02))=(1278&gt&gt8);//将数据写入相应的flash地址<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde03))=(1278&0xFF);//将数据写入相应的flash地址&nbsp;<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt350;c++);<br />读的时候m=*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde00));&nbsp;//00,01地址写入KWH<br />&nbsp;&nbsp;&nbsp;n=*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde01));//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;p=*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde02));//02,03地址写入WH<br />&nbsp;&nbsp;&nbsp;q=*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(0xde03));//将数据写入相应的flash地址<br />&nbsp;&nbsp;&nbsp;m=m&lt&lt8;<br />&nbsp;&nbsp;&nbsp;p=p&lt&lt8;<br />&nbsp;&nbsp;&nbsp;kwh=m+n;<br />&nbsp;&nbsp;&nbsp;dwh=p+q;&nbsp;<br />这时候却老出现复位的现象,不知程序哪里有问题
 楼主| dianqi123 发表于 2007-5-31 14:29 | 显示全部楼层

老师,很多初学者flash的编程都存在问题

包括如何写道RAM中去执行
 楼主| dianqi123 发表于 2007-6-1 10:09 | 显示全部楼层

老师帮下忙

  
张明峰 发表于 2007-6-1 12:22 | 显示全部楼层

读数据太夸张了点

kwh&nbsp;=&nbsp;*((unsigned&nbsp;int&nbsp;*)0xde00);<br />dwh&nbsp;=&nbsp;*((unsigned&nbsp;int&nbsp;*)0xde02);
张明峰 发表于 2007-6-1 12:48 | 显示全部楼层

基于9S08AW32的参考代码

#pragma&nbsp;DATA_SEG&nbsp;DEFALUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//default&nbsp;data&nbsp;segment<br />volatile&nbsp;byte&nbsp;ramCode[64];&nbsp;//开辟64字节RAM区为Flash编程专用<br /><br />//==============================================================<br />//&nbsp;Read&nbsp;a&nbsp;string&nbsp;of&nbsp;byte&nbsp;from&nbsp;EEPROM&nbsp;(Flash&nbsp;emulated)<br />//==============================================================<br />void&nbsp;ReadEE(byte*&nbsp;eeAddr,&nbsp;byte*&nbsp;datBuff,&nbsp;byte&nbsp;byteCount)<br />{<br />&nbsp;&nbsp;&nbsp;while(byteCount)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*datBuff++&nbsp;=&nbsp;*eeAddr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteCount--;<br />&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//==============================================================<br />//&nbsp;Code&nbsp;to&nbsp;enable&nbsp;and&nbsp;poll&nbsp;for&nbsp;Flash&nbsp;programming<br />//&nbsp;Must&nbsp;copy&nbsp;into&nbsp;RAM&nbsp;area&nbsp;before&nbsp;actual&nbsp;calling<br />//==============================================================<br />byte&nbsp;ExecEePrgCmd(byte&nbsp;cmd)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FCMD&nbsp;=&nbsp;cmd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//set&nbsp;command<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FSTAT_FCBEF&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//command&nbsp;launched&nbsp;and&nbsp;FCBEF&nbsp;cleared<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;at&nbsp;least&nbsp;4&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(FSTAT_FPVIOL&nbsp;||&nbsp;FSTAT_FACCERR)&nbsp;{&nbsp;//exit&nbsp;if&nbsp;encounter&nbsp;any&nbsp;error<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!FSTAT_FCCF)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;for&nbsp;FCCF=1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__RESET_WATCHDOG();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<br />}<br /><br />//==============================================================<br />//&nbsp;Write&nbsp;a&nbsp;string&nbsp;of&nbsp;byte&nbsp;to&nbsp;EEPROM&nbsp;(Flash&nbsp;emulated)<br />//==============================================================<br />void&nbsp;WriteEE(byte*&nbsp;eeAddr,&nbsp;byte*&nbsp;datBuff,&nbsp;byte&nbsp;byteCount)<br />{<br />&nbsp;&nbsp;&nbsp;byte&nbsp;i;<br />&nbsp;&nbsp;&nbsp;byte&nbsp;*srcPtr,&nbsp;*dstPtr;<br />&nbsp;&nbsp;&nbsp;byte&nbsp;(*FuncInRam)(byte);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//Copy&nbsp;ExecEePrgCmd&nbsp;code&nbsp;into&nbsp;RAM<br />&nbsp;&nbsp;&nbsp;srcPtr&nbsp;=&nbsp;(byte*)ExecEePrgCmd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//function&nbsp;entry&nbsp;in&nbsp;Flash<br />&nbsp;&nbsp;&nbsp;dstPtr&nbsp;=&nbsp;ramCode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//function&nbsp;entry&nbsp;in&nbsp;RAM<br />&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt64;i++)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;byte&nbsp;copy<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dstPtr&nbsp;=&nbsp;srcPtr;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;FuncInRam&nbsp;=&nbsp;(byte&nbsp;(*)(byte))ramCode;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;FSTAT_FACCERR&nbsp;=&nbsp;1;&nbsp;//clear&nbsp;any&nbsp;pending&nbsp;Flash&nbsp;error&nbsp;flag<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;while&nbsp;(byteCount)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*eeAddr++&nbsp;=&nbsp;*datBuff++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//latch&nbsp;data&nbsp;byte&nbsp;and&nbsp;memory&nbsp;address<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisableInterrupts;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FuncInRam(0x20);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//byte&nbsp;program,&nbsp;single&nbsp;byte&nbsp;mode<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnableInterrupts;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteCount--;<br />&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//==============================================================<br />//&nbsp;Erase&nbsp;a&nbsp;page&nbsp;of&nbsp;EEPROM&nbsp;(Flash&nbsp;emulated)<br />//==============================================================<br />void&nbsp;EraseEE(byte*&nbsp;eeAddr)<br />{<br />&nbsp;&nbsp;&nbsp;byte&nbsp;i;<br />&nbsp;&nbsp;&nbsp;byte&nbsp;*srcPtr,&nbsp;*dstPtr;<br />&nbsp;&nbsp;&nbsp;byte&nbsp;(*FuncInRam)(byte);<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//Copy&nbsp;ExecEePrgCmd&nbsp;code&nbsp;into&nbsp;RAM<br />&nbsp;&nbsp;&nbsp;srcPtr&nbsp;=&nbsp;(byte*)ExecEePrgCmd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//function&nbsp;entry&nbsp;in&nbsp;Flash<br />&nbsp;&nbsp;&nbsp;dstPtr&nbsp;=&nbsp;ramCode;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//function&nbsp;entry&nbsp;in&nbsp;RAM<br />&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt64;i++)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;byte&nbsp;copy<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dstPtr&nbsp;=&nbsp;srcPtr;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;FuncInRam&nbsp;=&nbsp;(byte&nbsp;(*)(byte))ramCode;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;FSTAT_FACCERR&nbsp;=&nbsp;1;&nbsp;//clear&nbsp;any&nbsp;pending&nbsp;Flash&nbsp;error&nbsp;flag<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;*eeAddr&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//latch&nbsp;memory&nbsp;address<br />&nbsp;&nbsp;&nbsp;DisableInterrupts;<br />&nbsp;&nbsp;&nbsp;FuncInRam(0x40);&nbsp;&nbsp;&nbsp;//do&nbsp;page&nbsp;erase<br />&nbsp;&nbsp;&nbsp;EnableInterrupts;<br />}<br /><br />上述代码摘自本人编写的一个DIY设计(完成我老爸交给的一个控制任务),运行于9S08AW32/60芯片。基本上适用于其他9S08系列,但不能用于908系列。<br />由于RAM的大量富裕,所以单独开辟64字节RAM(ramCode)为Flash编程关键代码的运行区。实际代码长度(ExecEePrgCmd模块)可能随C编译器优化级别的设置稍有变化,但不会超过64字节。你可以将ramCode定义在调用函数的堆栈区(和FuncInRam类似的局部变量),但要确保整个项目所定义的堆栈区有足够的空间。<br /><br />最后对dianqi123提一些建议:1)多看看芯片数据手册,Flash编程的流程写得很详细,照着做就可以,我就是照着做的,没有其它窍门;2)仔细领会C语言编程的基本技术。看了你的代码,就算Flash能编程了,你的设计最后能否可靠运行还是个大问号;3)必须理解最最基本的数据在单片机内存储和表达方式;4)成功要靠自己的努力钻研,而不是守株待兔。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

19

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部