EEPROM问题,请张教主救命啊.

[复制链接]
 楼主| win2000_li 发表于 2008-5-9 11:15 | 显示全部楼层 |阅读模式
这个程序是按照张教主的改了一点点.<br />但是不能用啊.我是用在MC9S08SG8上的.<br />一运行,程序就会死机,总线频率发生频繁变化.后重启.<br />我主要是拿来用,在底层操作也不熟.请张教主指点.请大家帮我一下.<br /><br />看一看这个程序哪里出了问题的.<br />/*&nbsp;This&nbsp;is&nbsp;a&nbsp;linker&nbsp;parameter&nbsp;file&nbsp;for&nbsp;the&nbsp;mc9s08sg8&nbsp;*/<br /><br />NAMES&nbsp;END&nbsp;/*&nbsp;CodeWarrior&nbsp;will&nbsp;pass&nbsp;all&nbsp;the&nbsp;needed&nbsp;files&nbsp;to&nbsp;the&nbsp;linker&nbsp;by&nbsp;command&nbsp;line.&nbsp;But&nbsp;here&nbsp;you&nbsp;may&nbsp;add&nbsp;your&nbsp;own&nbsp;files&nbsp;too.&nbsp;*/<br /><br />SEGMENTS&nbsp;/*&nbsp;Here&nbsp;all&nbsp;RAM/ROM&nbsp;areas&nbsp;of&nbsp;the&nbsp;device&nbsp;are&nbsp;listed.&nbsp;Used&nbsp;in&nbsp;PLACEMENT&nbsp;below.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;EEPROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;READ_ONLY&nbsp;&nbsp;&nbsp;&nbsp;0xE000&nbsp;TO&nbsp;0xE3FF;<br />&nbsp;&nbsp;&nbsp;&nbsp;Z_RAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;READ_WRITE&nbsp;&nbsp;&nbsp;0x0080&nbsp;TO&nbsp;0x00FF;<br />&nbsp;&nbsp;&nbsp;&nbsp;RAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;READ_WRITE&nbsp;&nbsp;&nbsp;0x0100&nbsp;TO&nbsp;0x027F;<br />&nbsp;&nbsp;&nbsp;&nbsp;ROM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;READ_ONLY&nbsp;&nbsp;&nbsp;&nbsp;0xE400&nbsp;TO&nbsp;0xFFAD;<br />&nbsp;/*&nbsp;INTVECTS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;&nbsp;READ_ONLY&nbsp;&nbsp;&nbsp;&nbsp;0xFFC0&nbsp;TO&nbsp;0xFFFF;&nbsp;Reserved&nbsp;for&nbsp;Interrupt&nbsp;Vectors&nbsp;*/<br />END<br /><br />PLACEMENT&nbsp;/*&nbsp;Here&nbsp;all&nbsp;predefined&nbsp;and&nbsp;user&nbsp;segments&nbsp;are&nbsp;placed&nbsp;into&nbsp;the&nbsp;SEGMENTS&nbsp;defined&nbsp;above.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT_RAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;non-zero&nbsp;page&nbsp;variables&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTO&nbsp;&nbsp;RAM;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;_PRESTART,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;startup&nbsp;code&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;STARTUP,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;startup&nbsp;data&nbsp;structures&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;ROM_VAR,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;constant&nbsp;variables&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;STRINGS,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;string&nbsp;literals&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;VIRTUAL_TABLE_SEGMENT,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;C++&nbsp;virtual&nbsp;table&nbsp;segment&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;DEFAULT_ROM,<br />&nbsp;&nbsp;&nbsp;&nbsp;COPY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;copy&nbsp;down&nbsp;information:&nbsp;how&nbsp;to&nbsp;initialize&nbsp;variables&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTO&nbsp;&nbsp;ROM;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;_DATA_ZEROPAGE,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;zero&nbsp;page&nbsp;variables&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;MY_ZEROPAGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;INTO&nbsp;&nbsp;Z_RAM;<br />END<br /><br /><br />STACKSIZE&nbsp;0x50<br /><br />VECTOR&nbsp;0&nbsp;_Startup&nbsp;/*&nbsp;Reset&nbsp;vector:&nbsp;this&nbsp;is&nbsp;the&nbsp;default&nbsp;entry&nbsp;point&nbsp;for&nbsp;an&nbsp;application.&nbsp;*/<br /><br /><br /><br /><br /><br />#include&quot;DSD.h&quot;<br />#include&quot;MC9S08SG8.h&quot;<br /><br />#define&nbsp;SIZE_FUNC_RAM&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//擦写在RAM中的空间.<br /><br />//函数类型声明<br />void&nbsp;WriteEE(byte*,&nbsp;byte*,&nbsp;byte);&nbsp;&nbsp;&nbsp;//写一串数据字节到E2<br />void&nbsp;EraseEE(byte*);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//擦除E2数据页<br /><br />#pragma&nbsp;CONST_SEG&nbsp;EEPROM<br />const&nbsp;byte&nbsp;EE_Data[1023];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//保留一页Flash空间作为E2模拟<br />//==============================================================<br />//&nbsp;Following&nbsp;data&nbsp;are&nbsp;declared&nbsp;in&nbsp;the&nbsp;direct&nbsp;addressing&nbsp;area<br />//&nbsp;for&nbsp;fast&nbsp;access&nbsp;(address&nbsp;&lt&nbsp;0x100)<br />//==============================================================<br />#pragma&nbsp;DATA_SEG&nbsp;SHORT&nbsp;MY_ZEROPAGE&nbsp;//direct&nbsp;addressing&nbsp;data&nbsp;segment<br />byte&nbsp;testData[8]&nbsp;=&nbsp;&quot;12345678&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//测试时被写入E2的数据<br /><br />//==============================================================<br />//&nbsp;Following&nbsp;data&nbsp;are&nbsp;declared&nbsp;in&nbsp;the&nbsp;common&nbsp;data&nbsp;area<br />//&nbsp;(address&nbsp;&gt=&nbsp;0x100)<br />//==============================================================<br />#pragma&nbsp;DATA_SEG&nbsp;DEFALUT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//default&nbsp;data&nbsp;segment<br /><br />//MCU初始化子程序<br />void&nbsp;MCU_init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SOPT1&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;SOPT2&nbsp;=&nbsp;0x00;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ICSC1_CLKS&nbsp;&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;ICSC1_IREFS&nbsp;=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;ICSC1_RDIV&nbsp;&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;ICSC2_BDIV&nbsp;&nbsp;=&nbsp;2;<br />&nbsp;&nbsp;&nbsp;&nbsp;ICSTRM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0xB5;&nbsp;//自调整&nbsp;&nbsp;0x96<br />&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;配置时钟频率<br />&nbsp;&nbsp;&nbsp;&nbsp;FCDIV_PRDIV8&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;FCDIV_DIV&nbsp;=&nbsp;19;&nbsp;//set&nbsp;FCLK&nbsp;base&nbsp;on&nbsp;8MHz&nbsp;Fbus&nbsp;&nbsp;200K<br />}<br /><br /><br />//下面这段代码是专门为启动Flash编程命令然后查询编程结束标志<br />//在执行之前必须被拷贝到RAM区(任意地址),然后从RAM中运行<br />//=============================================================================<br />byte&nbsp;ExecEePrgCmd(byte&nbsp;cmd)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FCMD&nbsp;=&nbsp;cmd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//set&nbsp;command<br />&nbsp;&nbsp;&nbsp;&nbsp;FSTAT_FCBEF&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;//command&nbsp;launched&nbsp;and&nbsp;FCBEF&nbsp;cleared<br />&nbsp;&nbsp;&nbsp;&nbsp;_asm&nbsp;NOP;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//wait&nbsp;at&nbsp;least&nbsp;4&nbsp;nop<br />&nbsp;&nbsp;&nbsp;&nbsp;_asm&nbsp;NOP;<br />&nbsp;&nbsp;&nbsp;&nbsp;_asm&nbsp;NOP;<br />&nbsp;&nbsp;&nbsp;&nbsp;_asm&nbsp;NOP;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(FSTAT_FPVIOL&nbsp;||&nbsp;FSTAT_FACCERR)&nbsp;&nbsp;&nbsp;//exit&nbsp;if&nbsp;encounter&nbsp;any&nbsp;error<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;with&nbsp;error&nbsp;flag<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__RESET_WATCHDOG();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;with&nbsp;success<br />}<br /><br /><br />//定义上面一段代码的长度,编译后不超过50字节<br />//写一串数据到模拟E2区,大部分代码是在Flash区内运行的,只是上面关键的一小段代码必须拷贝到RAM区才能运行<br />void&nbsp;WriteEE(byte*&nbsp;eeAddr,&nbsp;byte*&nbsp;datBuff,&nbsp;byte&nbsp;byteCount)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;*srcPtr;<br />&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;codeBuff[SIZE_FUNC_RAM];&nbsp;//buffer&nbsp;size&nbsp;is&nbsp;slightly&nbsp;bigger&nbsp;than&nbsp;the&nbsp;length&nbsp;of&nbsp;ExecEePrgCmd&nbsp;function<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//这里示范的是将关键代码拷贝到局部变量(堆栈)区。用户可以将代码拷贝到静态数据区,一样使用<br />&nbsp;&nbsp;&nbsp;&nbsp;//Copy&nbsp;ExecEePrgCmd&nbsp;code&nbsp;into&nbsp;RAM<br />&nbsp;&nbsp;&nbsp;&nbsp;srcPtr&nbsp;=&nbsp;(byte*)ExecEePrgCmd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//function&nbsp;entry&nbsp;in&nbsp;Flash<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&ltSIZE_FUNC_RAM;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;codeBuff&nbsp;=&nbsp;srcPtr;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;FSTAT_FACCERR&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//clear&nbsp;any&nbsp;pending&nbsp;Flash&nbsp;error&nbsp;flag<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(byteCount)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*eeAddr++&nbsp;=&nbsp;*datBuff++;&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;&nbsp;&nbsp;Disable_Interrupts;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//禁止任何中断,很重要!!!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((byte&nbsp;(*)(byte))codeBuff)(0x20);&nbsp;&nbsp;&nbsp;//编程一个字节&nbsp;在前面加&nbsp;(void)就没有了报警&nbsp;-C1420<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enable_Interrupts;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byteCount--;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />//擦除E2页面,原理基本同上//=============================================================================<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;&nbsp;byte&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;*srcPtr;<br />&nbsp;&nbsp;&nbsp;&nbsp;byte&nbsp;codeBuff[SIZE_FUNC_RAM];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//buffer&nbsp;size&nbsp;is&nbsp;slightly&nbsp;bigger&nbsp;than&nbsp;the&nbsp;length&nbsp;of&nbsp;ExecEePrgCmd&nbsp;function<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;//Copy&nbsp;ExecEePrgCmd&nbsp;code&nbsp;into&nbsp;RAM<br />&nbsp;&nbsp;&nbsp;&nbsp;srcPtr&nbsp;=&nbsp;(byte*)ExecEePrgCmd;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//function&nbsp;entry&nbsp;in&nbsp;Flash<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;SIZE_FUNC_RAM;&nbsp;i++)&nbsp;&nbsp;//do&nbsp;byte&nbsp;copy<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;codeBuff&nbsp;=&nbsp;srcPtr;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;FSTAT_FACCERR&nbsp;=&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//clear&nbsp;any&nbsp;pending&nbsp;Flash&nbsp;error&nbsp;flag<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;*eeAddr&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//latch&nbsp;memory&nbsp;address<br />&nbsp;&nbsp;&nbsp;&nbsp;Disable_Interrupts;<br />&nbsp;&nbsp;&nbsp;&nbsp;((byte&nbsp;(*)(byte))codeBuff)(0x40);&nbsp;&nbsp;&nbsp;&nbsp;//do&nbsp;page&nbsp;erase在前面加&nbsp;(void)就没有了报警&nbsp;-C1420<br />&nbsp;&nbsp;&nbsp;&nbsp;Enable_Interrupts;<br />}<br /><br />//主程序入口<br />void&nbsp;main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;MCU_init();<br />&nbsp;&nbsp;&nbsp;&nbsp;Enable_Interrupts;<br />&nbsp;&nbsp;&nbsp;&nbsp;EraseEE((byte*)EE_Data);<br />&nbsp;&nbsp;&nbsp;&nbsp;WriteEE((byte*)EE_Data,&nbsp;testData,&nbsp;8);<br />&nbsp;&nbsp;&nbsp;&nbsp;for(;;)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_asm&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_asm&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__RESET_WATCHDOG();&nbsp;//&nbsp;feeds&nbsp;the&nbsp;dog<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /><br />
张明峰 发表于 2008-5-9 13:52 | 显示全部楼层

好像漏了点什么

prm文件中的placement部分没有看到EEPROM段的指派。<br /><br />PLACEMENT&nbsp;/*&nbsp;Here&nbsp;all&nbsp;predefined&nbsp;and&nbsp;user&nbsp;segments&nbsp;are&nbsp;placed&nbsp;into&nbsp;the&nbsp;SEGMENTS&nbsp;defined&nbsp;above.&nbsp;*/<br />&nbsp;&nbsp;&nbsp;...<br /><font color=#FF0000>&nbsp;&nbsp;&nbsp;MyEEData&nbsp;&nbsp;&nbsp;&nbsp;INTO&nbsp;&nbsp;&nbsp;EEPROM;</font><br />END<br /><br />#pragma&nbsp;CONST_SEG&nbsp;<font color=#FF0000>MyEEData</font><br />const&nbsp;byte&nbsp;EE_Data[1023];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//保留一页Flash空间作为E2模拟<br />
 楼主| win2000_li 发表于 2008-5-9 14:14 | 显示全部楼层

谢谢,继续请教.

好的,我把以下这两条不要就可以了<br />//#pragma&nbsp;CONST_SEG&nbsp;EEPROM<br />//const&nbsp;byte&nbsp;EE_Data[1023];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//保留一页Flash空间作为E2模拟<br /><br />调用函数时是这样<br />EraseEE((byte*)0xE000);<br />WriteEE((byte*)0xE000,&nbsp;testData,&nbsp;8);<br /><br />我看了结果,在0xE000处开始确时写了8个测试字节.<br /><br />问题1:<br />如果加与不加有什么区别呢???<br /><br /><br />问题2:<br />#define&nbsp;SIZE_FUNC_RAM&nbsp;50&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//擦写在RAM中的空间.<br /><br />这个数字为什么不能改啊??<br /><br />我一改到就会死机啊.<br /><br />因为我想写EEPROM时少占用些RAM资源.<br />&nbsp;<br />我的单片机里只有256.<br /><br /><br />问题3:<br />这条语句怎么理解不到,请老师指点.<br />((byte&nbsp;(*)(byte))codeBuff)(0x40);<br /><br /><br />问题4:<br />我的应用还要读函数,想请教在如何写**(思路)<br /><br /><br />诚心请教张教主.<br /><br />
 楼主| win2000_li 发表于 2008-5-9 14:50 | 显示全部楼层

顶起!!!

对了,我刚刚做了实验,用您的方式来做的.<br /><br />是正确的.<br /><br />
张明峰 发表于 2008-5-9 17:22 | 显示全部楼层

回答如下:

问题1:<br />源程序中用#pragma声明的段并不是直接对应到prm文件中的SEGMENTS中定义的各段。它必须通过PLACEMENT声明将两者联系起来。如果PLACEMENT中没有指派用户定义的特殊段具体到哪一个内存段,则将被放到缺省段中。对于你定义的const类型变量,会和程序代码合在一起存放。你在擦除EE数据时把部分代码也擦除了,当然一起全乱了;<br /><br />问题2:<br />50这个数据可以改。你可以把它改大,保证不出问题。但如果改小,就会有问题(改成49应该没有问题)这个数据只是确定把Flash区的代码拷贝到RAM去的长度。具体长度是函数ExecEePrgCmd编译后的代码长度。我得到50这个数是看了最终该函数的代码字节大概是40多字节,故放50。如果数据太小拷贝不完整,RAM中的代码就无法执行了。<br /><br />问题3:<br />这是标准C语言中对函数指针的定义方式。ramBuff在定义时是普通数据数组。代码被拷贝到这里后要在这里运行,所以数组的首地址就成了函数入口。为了使编译器能产生正确的代码,需将数据指针强制转换为函数指针。看来兄弟C语言学艺不精啊。<br /><br />问题4:<br />读Flash中模拟的EE数据再简单不过,就象读RAM中的数据一模一样。飞思卡尔的8位单片机架构决定了RAM和Flash属于同一线性寻址空间。<br />
yewuyi 发表于 2008-5-11 19:59 | 显示全部楼层

FLASH模拟EE~~

  
 楼主| win2000_li 发表于 2008-5-12 22:11 | 显示全部楼层

谢谢张工的答复.

谢谢张工的回复,让我明白很多.<br /><br />我再仔细读一下PDF,在你的这些函数加一些其它功能.<br /><br />如计算偏移量,计算EEPROM剩余空间.读取函数等.<br /><br />继续努力,加强学习.哈哈!!<br /><br />谢谢张工指点.<br /><br />最后还是想说点,如果把flash写成一个标准的API,我想用起来会更好。<br /><br />尤其是像我这种初学者来说,那就太好。加一些说明,更有注于理解。<br /><br />
yewuyi 发表于 2008-5-21 21:59 | 显示全部楼层

今日再次进来看到此帖,对张工的这段有点疑问!

张工在5楼回复内容的一段如下:<br />问题1:<br />源程序中用#pragma声明的段并不是直接对应到prm文件中的SEGMENTS中定义的各段。它必须通过PLACEMENT声明将两者联系起来。如果PLACEMENT中没有指派用户定义的特殊段具体到哪一个内存段,则将被放到缺省段中。对于你定义的const类型变量,会和程序代码合在一起存放。你在擦除EE数据时把部分代码也擦除了,当然一起全乱了;<br /><br /><br />问题:<br />LZ在连接文件因为没有指定const&nbsp;byte&nbsp;EE_Data[1023]的定位地址,所以编译器把EE_Data[1023]强制放到DEFAULT中去了,从而导致程序代码和代码合在一起存放,但使用FLASH模拟EEPROM,这两个数据段本来就都是共同都放在ROM段中的啊?!这样解释擦除EE数据时会冲掉部分代码是不是不太合适?<br /><br />呵呵,我没怎么用过FSL,也没用过FSL的FLASH模拟EE,但我猜测这样解释是不是更完整一点:<br />因为FLASH的特性,擦除是按页操作的,所以在用FLASH模拟EE的时候要注意把EE的连接定位放到一个单独的ROM上,并且在这个页上不应该有应用程序代码,如果不在连接文件中单独划出一个页做EE模拟,那么按照编译连接的规则,其最终的连接定位是连续的,一般用FLASH模拟EE区的时候,MCU会先执行一个擦除整页操作,所以整个页上的数据都会被KILL掉,如果应用程序代码中的有那么一段不开眼的‘闯入者’自然也难以幸免,从而导致用户应用代码丢失的故障现象。<br /><br />呵呵,请张工指教一下,晚上翻FSL的选型手册,看到QG系列的低功耗特性时非常兴奋,还想着明天早上找FREETECH问问价格好不好的,但仔细一翻,没有LCD驱动,呵呵,白忙乎了^^^<br />
hotpower 发表于 2008-5-21 22:14 | 显示全部楼层

学习学习~~~没实战过没资格发表见解~~~

  
张明峰 发表于 2008-5-22 09:26 | 显示全部楼层

8楼正解, 100%

感谢yewuyi朋友精准的补充说明。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

142

主题

718

帖子

1

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