#pragma DATA_SEG DEFALUT //default data segment<br />volatile byte ramCode[64]; //开辟64字节RAM区为Flash编程专用<br /><br />//==============================================================<br />// Read a string of byte from EEPROM (Flash emulated)<br />//==============================================================<br />void ReadEE(byte* eeAddr, byte* datBuff, byte byteCount)<br />{<br /> while(byteCount) {<br /> *datBuff++ = *eeAddr++;<br /> byteCount--;<br /> }<br />}<br /><br />//==============================================================<br />// Code to enable and poll for Flash programming<br />// Must copy into RAM area before actual calling<br />//==============================================================<br />byte ExecEePrgCmd(byte cmd)<br />{<br /> FCMD = cmd; //set command<br /> FSTAT_FCBEF = 1; //command launched and FCBEF cleared<br /> NOP(); //wait at least 4 nop<br /> NOP();<br /> NOP();<br /> NOP();<br /> if (FSTAT_FPVIOL || FSTAT_FACCERR) { //exit if encounter any error<br /> return(0);<br /> }<br /> while(!FSTAT_FCCF) //wait for FCCF=1<br /> __RESET_WATCHDOG(); <br /> return(1);<br />}<br /><br />//==============================================================<br />// Write a string of byte to EEPROM (Flash emulated)<br />//==============================================================<br />void WriteEE(byte* eeAddr, byte* datBuff, byte byteCount)<br />{<br /> byte i;<br /> byte *srcPtr, *dstPtr;<br /> byte (*FuncInRam)(byte);<br /> <br /> //Copy ExecEePrgCmd code into RAM<br /> srcPtr = (byte*)ExecEePrgCmd; //function entry in Flash<br /> dstPtr = ramCode; //function entry in RAM<br /> for (i=0;i<64;i++) { //do byte copy<br /> dstPtr = srcPtr;<br /> }<br /> FuncInRam = (byte (*)(byte))ramCode;<br /> <br /> FSTAT_FACCERR = 1; //clear any pending Flash error flag<br /> <br /> while (byteCount) {<br /> *eeAddr++ = *datBuff++; //latch data byte and memory address<br /> DisableInterrupts;<br /> FuncInRam(0x20); //byte program, single byte mode<br /> EnableInterrupts;<br /> byteCount--;<br /> }<br />}<br /><br />//==============================================================<br />// Erase a page of EEPROM (Flash emulated)<br />//==============================================================<br />void EraseEE(byte* eeAddr)<br />{<br /> byte i;<br /> byte *srcPtr, *dstPtr;<br /> byte (*FuncInRam)(byte);<br /> <br /> //Copy ExecEePrgCmd code into RAM<br /> srcPtr = (byte*)ExecEePrgCmd; //function entry in Flash<br /> dstPtr = ramCode; //function entry in RAM<br /> for (i=0;i<64;i++) { //do byte copy<br /> dstPtr = srcPtr;<br /> }<br /> FuncInRam = (byte (*)(byte))ramCode;<br /> <br /> FSTAT_FACCERR = 1; //clear any pending Flash error flag<br /> <br /> *eeAddr = 0; //latch memory address<br /> DisableInterrupts;<br /> FuncInRam(0x40); //do page erase<br /> 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)成功要靠自己的努力钻研,而不是守株待兔。
|