标题:
编译擦除/写Flash实例程序出问题
[打印本页]
作者:
wjckzdh
时间:
2005-10-31 12:53
标题:
编译擦除/写Flash实例程序出问题
本人刚接触freescale单片机的新手,我现在在用HC908SR12作实验。以前一直从事51的,我从网上下载了著名的“匠人笔记”里的那篇擦除/写Flash的程序,确实完全按照手册上说的步骤进行flash操作,但那段关键的把Flash中的程序拷贝到RAM中执行的程序在编译时还是有点问题:
faddr=addr; //擦除flash的首地址
//将擦除程序从Flash区拷贝到RAM区PrgOfRam
asm("ldhx #_DoEarseFlash"); //擦除程序的首地址->HX
asm("sthx _pbase"); //HX->内存变量pbase
asm("ldhx #_EarseFlash_END"); //擦除程序的末地址->HX
asm("sthx _pend"); //HX->内存变量pend
memcpy((void *)PrgOfRam,(void *)pbase,pend-pbase);
//在RAM区执行擦除程序
asm("ldhx #_PrgOfRam"); //擦除程序在RAM区的首地址
asm("jsr ,X"); //执行RAM区域的擦除程序
比如上面这条指令asm("ldhx #_DoEarseFlash");,编译时不认识DoEarseFlash,Codewarrior的编译错误提示为:Immediate/Global address expected,意思应该为ldhx后面应指明为具体地址或者全局地址,可能是DoEarseFlash没有声明为全局函数的缘故,但无论我是在main.c里声明并定义,还是在我的MC68HC908SR12.h里声明,都出现这个编译错误。其它变量如pbase,PrgOfRam都一样,编译时都不认识,当然在.map文件里也看不到这些变量和函数的具体地址,我不知道这些变量和函数在MC68HC908SR12.h.h(他的GP32C.h)文件里怎么声明?能否给个实例!
我已经给匠人Email了,可能他忙暂时没有回复!
版主和各位高手能否帮帮我!谢谢!
感觉freescale的Flash比起51里的如C8051F系列单片机来,麻烦多了!
作者:
wjckzdh
时间:
2005-11-1 08:35
strongchen,你能帮我看看吗?
作者:
seuafu2005
时间:
2005-11-1 09:42
asm("ldhx #_DoEarseFlash");
codewarrior中嵌汇编的话不需要引号,只用asm() 或者
asm {
...
...
}
_DoEarseFlash是函数名字的话,利用立即数寻址是会有问题的。
你可以设置一个变量,比如说unsigned int DoEarseFlash_addr;
DoEarseFlash_addr=(unsigned int)_DoEarseFlash;
asm ( ldhx DoEarseFlash_addr);
这样也可以得到地址的。
作者:
wjckzdh
时间:
2005-11-1 12:32
非常感谢seuafu2005,我试试
作者:
wjckzdh
时间:
2005-11-3 12:33
终于调试成功,这个单片机的Flash擦写比51的如C8051F020麻烦多了!
作者:
strongchen
时间:
2005-11-3 14:36
熟能生巧。
作者:
ctypyb2002
时间:
2006-7-23 17:02
wjckzdh能不能讲述一下GP32C.h是匠老大定义的啥东东!!???
作者:
Jun
时间:
2006-8-1 13:41
wjckzdh以及各位高手:您们好!
我和你的情况差不多,也是刚刚入门.我的功能、是实现Flash的擦除功能,我的代码段已经写好了,但现在是把函数拷贝到Ram区,不能调用函数执行,你那里有事例,不知能否共享让我借鉴一下!
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0