把张教主的FLASH写EEPROM的移到MC9S08QG8怎么不成,哪出错了?<br />//MC9S08QG8<br /><br />#include <hidef.h> /* for EnableInterrupts macro */<br />#include "derivative.h" /* include peripheral declarations */<br /><br /><br />//自己定义一个汇编NOP指令的宏<br /><br />#define NOP() asm(nop)<br />#define SIZE_FUNC_RAM 50 //擦写在RAM中的空间.<br /><br />//函数类型声明<br /><br />void WriteEE(byte*, byte*, byte); //写一串数据字节到E2<br />void EraseEE(byte*); //擦除E2数据页<br /><br /><br />//定义一些数据段<br />//==============================================================<br />// Following data are declared as EEPROM (Flash emulation)<br />// Refer to PRM file for address mapping<br />//==============================================================<br />// PRM文件定义---是EEPROM定义.*/<br />// ROM = READ_ONLY 0XE000 TO 0XF5FF;<br />// EPROM = READ_ONLY 0xF600 TO 0xFDFF;<br />// ROM1 = READ_ONLY 0xFE00 TO 0xFFCF;<br />// END<br />//PLACEMENT /* Here all predefined and user segments are placed into the SEGMENTS defined above. */<br />// EEPROM INTO EPROM;<br /><br /><br /><br /><br /><br />#pragma CONST_SEG EEPROM<br />const byte EE_Data[2048]; //保留一页Flash空间作为E2模拟<br />//#pragma CONST_SEG DEFALUT //default data segment<br />//==============================================================<br />// Following data are declared in the direct addressing area<br />// for fast access (address < 0x100)<br />//==============================================================<br />#pragma DATA_SEG SHORT MY_ZEROPAGE //direct addressing data segment<br />byte testData[8]={'1', '2', '3', '4', '5', '6', '7', '8'}; //测试时被写入E2的数据<br /><br />//==============================================================<br />// Following data are declared in the common data area<br />// (address >= 0x100)<br />//==============================================================<br /><br />#pragma DATA_SEG DEFALUT //default data segment<br /><br /><br />void MCU_init(void); //初始化MCU<br /><br /><br />//主程序入口<br /><br />void main(void) {<br /><br />MCU_init();<br /><br />EnableInterrupts;<br /> EraseEE((byte*)EE_Data);<br />WriteEE((byte*)EE_Data, testData, 8);<br />for(;;) {<br />__RESET_WATCHDOG(); // feeds the dog<br /><br />}<br /><br />}<br /><br /><br />//MCU初始化子程序<br /><br />void MCU_init(void)<br />{<br />// 配置时钟频率<br /> FCDIV = 0x27; //set FCLK base on 8MHz Fbus 200K<br />}<br /><br /><br />//下面这段代码是专门为启动Flash编程命令然后查询编程结束标志<br /><br />//在执行之前必须被拷贝到RAM区(任意地址),然后从RAM中运行<br /><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); //return with error flag<br />}<br />while(!FSTAT_FCCF) { //wait for FCCF=1<br />__RESET_WATCHDOG(); <br />}<br />return(1); //return with success<br />}<br /><br /><br />//定义上面一段代码的长度,编译后不超过50字节<br />//写一串数据到模拟E2区,大部分代码是在Flash区内运行的,只是上面关键的一小段代码必须拷贝到RAM区才能运行<br /><br />void WriteEE(byte* eeAddr, byte* datBuff, byte byteCount)<br />{<br />byte i;<br />byte *srcPtr;<br />byte codeBuff[SIZE_FUNC_RAM]; //buffer size is slightly bigger than the length of ExecEePrgCmd function<br /><br />//这里示范的是将关键代码拷贝到局部变量(堆栈)区。用户可以将代码拷贝到静态数据区,一样使用<br /><br />//Copy ExecEePrgCmd code into RAM<br />srcPtr = (byte*)ExecEePrgCmd; //function entry in Flash<br />for (i=0;i<SIZE_FUNC_RAM;i++) { //do byte copy<br />codeBuff = srcPtr;<br />}<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 />((byte (*)(byte))codeBuff)(0x20); //编程一个字节 在前面加 (void)就没有了报警 -C1420<br />EnableInterrupts;<br />byteCount--;<br />}<br />}<br /><br /><br />//擦除E2页面,原理基本同上//=============================================================================<br />// Erase a page of EEPROM (Flash emulated)<br />//=============================================================================<br />void EraseEE(byte* eeAddr)<br />{<br />byte i;<br />byte *srcPtr;<br />byte codeBuff[SIZE_FUNC_RAM]; //buffer size is slightly bigger than the length of ExecEePrgCmd function<br /><br />//Copy ExecEePrgCmd code into RAM<br />srcPtr = (byte*)ExecEePrgCmd; //function entry in Flash<br />for (i=0;i<SIZE_FUNC_RAM;i++) { //do byte copy<br />codeBuff = srcPtr;<br />}<br /><br />FSTAT_FACCERR = 1; //clear any pending Flash error flag<br /><br />*eeAddr = 0; //latch memory address<br />DisableInterrupts;<br />((byte (*)(byte))codeBuff)(0x40); //do page erase在前面加 (void)就没有了报警 -C1420<br />EnableInterrupts;<br />}<br /><br /> |
|