介绍一下我进行的设计:移植了网络上公开的OpenTCP/IP和Webserver到自己的项目中(可在freescale站上找到链接,在sourceforge中的开源项目),但是需要增加功能,让免费的TCP/IP协议栈支持自我进行IP地址的修改,方便现场调试和批量生产时的地址设定。 我采用的办法是向协议栈主程序(大循环程序)发送UDP包,程序受到特定格式的UDP包后按照包内自定义的码字进行flash《擦除+编程》,修改IP地址。 尝试了很多次,主程序编译后实际烧录后在3C页面执行,在RAM中放了一段擦除程序,从3C页面强制跳转到RAM中(地址大约在0x3200)的擦除程序后试图擦除非页面化区0x4000位置开始的第一个sector,里面包含了IP地址的所有信息,一直没有成功。 单步进RAM中程序去错误是在擦除那段代码上,在擦除前先要对目标扇区的某个地址赋值,赋一个任意的dummy数值,单步发现在这个赋值操作后FSTAT的ACCERR发生置位提示发生错误,后面程序段自然没有继续正常执行下去的可能了。很奇怪! 主要代码如下: 1.定义字串RAM_Func: ------------------------------------------- static unsigned char Ram_Fcnt[36]={0xC6,0x40,0x7b,0x01,0x06,0x58,0x7b,0x01, 0x05,0x86,0xff,0x7a,0x40,0x00,0x1e,0x01, 0x05,0x20,0x0a,0x1e,0x01,0x05, 0x10,0x05,0x1f,0x01,0x05,0x40,0xfb,0x0a }; (说明一下,以上对应实际源代码 static void OP_in_RAM() { *(volatile byte *far) (0x4000) = 0x00; // Write data to the flash memory FCMD = 0x40; // Initiate command FSTAT = 0x80; // Launch the command if(FSTAT_PVIOL ) return; if(FSTAT_ACCERR ) return; while(FSTAT_CCIF ==0 ) ; //idle loop waiting earasure op. completed return; } 抓flash内容得到上述Ram_Fcnt字串。 ) 主程序中如下设计: -------------------------------------- FCLKDIV = 0xCF; //我用的外部晶振25MHz FPROT = 0;//或者写0b10110100; //Enter critical region FSTAT = 0x30; /* Clear PVIOL & ACERR flag */ __asm SEI; __asm pshc; __asm movb 1,SP+,CCR_reg; asm { /* Jump to RAM code */ JSR Ram_Fcnt //单步进去,发现第1~2个汇编指令开始执行就错,经查,对应的实际代码是用dummy数值对擦除目标区赋值。此后RAM子程序返回,进入莫名奇妙的代码执行后死机。跳转后PPAGE内容一直好像不正常,甚至是一些不可能的值。 } __asm movb CCR_reg, 1,-SP; __asm pulc; __asm CLI;
以往和陈刚还有安富利的梅生联系过,一直侧重在提示是否是中断未被关闭,本人对此觉得可能不大。是否有其他问题在里面呢? 请TX们指教。
[此贴子已经被作者于2008-9-29 22:54:42编辑过] |