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