Board logo

标题: 编译擦除/写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