打印

MPC82G516 IAP问题

[复制链接]
3953|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kknd2|  楼主 | 2010-12-16 18:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟刚用单片机,有个问题请教一下
我现在使用MPC82G516开发产品
用到要将相关设置数据存入IAP,但是通过ICP Programmer烧入芯片后,程序就出现乱码、死机。
请问IAP设定的地址边界怎么确定?跟ISP的大小有什么关系?
ICP programmer在设定上有什么注意?Programming Area是选AP还是AP+IAP?Load file时是选AP还是IAP?

用keil编译有什么注意的?

不好意思问这么多,还请不吝赐教,谢谢!
沙发
MG_FAE| | 2010-12-16 18:35 | 只看该作者
小弟刚用单片机,有个问题请教一下
我现在使用MPC82G516开发产品
用到要将相关设置数据存入IAP,但是通过ICP Programmer烧入芯片后,程序就出现乱码、死机。
请问IAP设定的地址边界怎么确定?跟ISP的大小有什么关系 ...
kknd2 发表于 2010-12-16 18:07


IAP 设定您要的IAP空间低位址开始,建议您设置F0,从F000开始放你的数据IAP,
编程空间需要设置AP+IAP

使用特权

评论回复
板凳
David_ming| | 2010-12-16 19:43 | 只看该作者
请问IAP设定的地址边界怎么确定?跟ISP的大小有什么关系?

   整个64K flash分成3个区域,应用程序区、数据flash区、引导程序区;应用程序区和数据flash区统一编址,且都可以跑程序,引导程序区独立编址。先确定用多大的IAP空间,若用到ISP就插入ISP(我觉得ICP其实比ISP好用,占用2个口),
          IAP首地址 = 64K - ISP空间大小 - IAP空间大小;

ICP programmer在设定上有什么注意?
   没啥主意的,按照所需设置熔丝,烧录就行了。

Programming Area是选AP还是AP+IAP?
   一般选AP就行了,区别我就不知道了:lol ,AP+IAP与AP的区别等待楼主澄清。

Load file时是选AP还是IAP?
   如果选AP就把HEX或BIN从0x0000地址开始放,若IAP就可以选择加一个地址偏移量,一般选AP就行了。

用keil编译有什么注意的?
   没啥主意的,跟ATmel的51一样的用法。

不对的楼主指正啊

使用特权

评论回复
地板
kknd2|  楼主 | 2010-12-17 14:45 | 只看该作者
我使用的是U2编程器。
我也是将page address设定从0xF000开始,但烧入后总不成功
我只试着只写一个byte,就出现之前的问题
///////////////////////////////////////////////////////////////
#define ReadCommand        0x01
#define PrgCommand        0x02
#define EraseCommand        0x03

#define PerSector        512
#define waittime        0x02

void G516Flash_enable(void)
{
        ISPCR=ISPCR & 0x18;
        ISPCR=ISPCR | waittime;
        ISPCR=ISPCR | 0x80;
}

void Do_IAP()
{
        G516Flash_enable();
        SCMD=0x46;
        SCMD=0xB9;
        _nop_();
}
void G516Flash_page_erase(int page_address)
{
        IFMT=IFMT & 0xf8;
        IFMT=IFMT | EraseCommand;
        IFADRH=(uchar)(page_address>>8);
        IFADRL=(uchar)(page_address&0x00FF);
        Do_IAP();
}

void G516Flash_byte_program(int byte_address, char dta)
{
        IFMT=IFMT & 0xf8;
        IFMT=IFMT | PrgCommand;
        IFADRH=(uchar)(byte_address>>8);
        IFADRL=(uchar)(byte_address&0x00FF);
       
        IFD=dta;
        Do_IAP();
}

char G516Flash_byte_read(int byte_address)
{
        IFMT=IFMT & 0xf8;
        IFMT=IFMT | ReadCommand;
        IFADRH=(uchar)(byte_address>>8);
        IFADRL=(uchar)(byte_address&0x00FF);
        Do_IAP();
        return(IFD);
}                               

///////////////////////////////////
void save()
{
G516Flash_page_erase(0xf000);
G516Flash_byte_program(0xf000,data[16]);
}

void read()
{
G516Flash_byte_read(0xf000);
data[16]=IFD;
}

代码有问题么?

使用特权

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

本版积分规则

0

主题

5

帖子

0

粉丝