首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

编译擦除/写Flash实例程序出问题

编译擦除/写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系列单片机来,麻烦多了!
strongchen,你能帮我看看吗?
asm("ldhx #_DoEarseFlash");
codewarrior中嵌汇编的话不需要引号,只用asm() 或者
asm {
  ...
  ...
}
_DoEarseFlash是函数名字的话,利用立即数寻址是会有问题的。
你可以设置一个变量,比如说unsigned int DoEarseFlash_addr;
DoEarseFlash_addr=(unsigned int)_DoEarseFlash;
asm ( ldhx DoEarseFlash_addr);
这样也可以得到地址的。
非常感谢seuafu2005,我试试
终于调试成功,这个单片机的Flash擦写比51的如C8051F020麻烦多了!
熟能生巧。
海纳百川  有容乃大
wjckzdh能不能讲述一下GP32C.h是匠老大定义的啥东东!!???
wjckzdh以及各位高手:您们好!
我和你的情况差不多,也是刚刚入门.我的功能、是实现Flash的擦除功能,我的代码段已经写好了,但现在是把函数拷贝到Ram区,不能调用函数执行,你那里有事例,不知能否共享让我借鉴一下!
返回列表