打印

HC08 Flash与Ram的编程问题,张老师

[复制链接]
2508|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dianqi123|  楼主 | 2007-5-19 13:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在Flash的编程与擦除操作中,代码都要在Ram中执行,如何将写与擦除代码拷到RAM中?ddtv兄曾发表过一贴:
uchar FlashBuf[80];
uchar page_data;
uchar Temp;
uint page_addr;

void delayms(uint t);
void delayus1(void);
void do_write(void);
void page_erase(void);
void do_erase(void);
//页写,最大32B
void page_write(void)
{
    FLCR_PGM = 1;   //编程位
    (void)(FLBPR == 0); //读FLASH保护寄存器
    *(volatile uchar *)page_addr = 0x01; //向目标页写任意数
    delayus1(); //tnvs>10us
    memcpy((void *)FlashBuf,(void *)do_write,(uint)page_erase-(uint)do_write); //flash程序考到RAM中 
    asm("ldhx FlashBuf");     //加载擦除程序在RAM区的首地址
    asm("jsr ,X");          //执行RAM区域的擦除程序
}

//要在RAM中执行的页写程序
void do_write(void)
{
    uchar i,j;
    
    FLCR_HVEN = 1;  //高压位
    delayus1(); //tpgs>5us

    for(i=0;i<20;i++)   //写20B
    {                   //数据送入flash地址
        *((volatile uchar *)page_addr+i)= i;
        for (j=0;j<22;j++); //延时30us--40us,据说不能调用延时程序
    }

    FLCR_PGM = 0; //编程位
    delayus1(); //tnvh>5us
    FLCR_HVEN = 0; //高压位
    delayus1();// trcv>1us
}

void delayus1(void)
{
    Temp = 60;
    while(--Temp){}
}

//页擦除程序,最小64B
void page_erase(void)
{
    FLCR_ERASE = 1;     //擦除位
    FLCR_MASS  = 0;     //整体擦除位
    (void)(FLBPR == 0); //读FLASH保护寄存器

    *(volatile uchar *)page_addr = 0; //写任意数
    Temp = 20;
    while(--Temp){};    //延时
    memcpy((void *)FlashBuf,(void *)do_erase,(uint)delay100us-(uint)do_erase); //flash程序考到RAM中 
    asm("ldhx FlashBuf");     //加载擦除程序在RAM区的首地址
    asm("jsr ,X");          //执行RAM区域的擦除程序
}    

void do_erase(void)
{
    FLCR_HVEN = 1;  //高压
    delayms(4);     //terase>4ms
    FLCR_ERASE = 0;
    Temp = 20;
    while(--Temp){}; //tnvh>5us
    
    FLCR_HVEN = 0;
    Temp = 10;
    while(--Temp){};     //Trcv>1us 
}
    
void delayms(uint t) {
    uchar i;
      
    do
    {
        for(i=255; i>0; i--)
        {asm nop; asm nop;}
    }while(--t);
}

void main(void)
{
    page_addr = 0xde00; 
    page_data = 0;
    page_erase();
    
    page_write();
}

其中的 
memcpy((void *)FlashBuf,(void *)do_erase,(uint)delay100us-(uint)do_erase); //flash程序考到RAM中 
    asm("ldhx FlashBuf");     //加载擦除程序在RAM区的首地址
    asm("jsr ,X");          //执行RAM区域的擦除程序
这段程序甚是不解,哪位老师能给我提供如何将程序从Flash中拷到Ram的例程,非常感谢,
张老师能给我你的联系方式吗?我的QQ:120990401,msn:dianqi123@163.com,急切期待

相关帖子

沙发
dianqi123|  楼主 | 2007-5-19 13:42 | 只看该作者

最好是C语言例程

最好是C语言例程,谢谢

使用特权

评论回复
板凳
张明峰| | 2007-5-21 21:34 | 只看该作者

HC08系列

HC08系列单片机片内都有固化了的ROM程序完成Flash的擦除和编程,请查阅某一单片机相关的文档找出ROM程序的入口地址直接调用即可。

使用特权

评论回复
地板
dianqi123|  楼主 | 2007-5-23 15:58 | 只看该作者

如何找出ROM程序的入口地址?如何直接调用?

使用特权

评论回复
5
dianqi123|  楼主 | 2007-5-23 15:59 | 只看该作者

张老师能否举例说明一下啊

使用特权

评论回复
6
dianqi123|  楼主 | 2007-5-23 16:12 | 只看该作者

在CW3.1版本里,FLASH块寄存器FLBPR并没有定义

在CW3.1版本里,头文件里并没有对FLASH块寄存器FLBPR定义,但在读写的时候都要用到这个寄存器,如何用C语言对这个寄存器进行定义

使用特权

评论回复
7
张明峰| | 2007-5-27 06:42 | 只看该作者

看应用笔记AN1831

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

19

帖子

0

粉丝