Board logo

标题: 用MC9S12D64自制BootLoader时对FLASH操作的问题 [打印本页]

作者: onion2829    时间: 2005-11-16 15:04

说得具体点,程序考到RAM中执行的吗?注意延时以及操作顺序
作者: seuafu2005    时间: 2005-11-18 10:03

不管单步还是全速,代码都是在chip上跑的。BDM只是一个通讯接口。

“MC9S12D64的RAM是用来存放变量的区域.它单独有一个程序指针来读指令”不太理解你要表达什么。你对flash进行读写操作的程序一定要放到RAM中跑,不是说你的变量放在RAM里面,是整个代码放在RAM里面。

另外,要记得查看相应的标志位,比如accessError,看有没有错误。

在进行下个操作之前也要等前一个操作完成,标志位置位才行。

 

 

[此贴子已经被作者于2005-11-18 10:03:10编辑过]


作者: 朱兴全    时间: 2005-11-24 09:02     标题: 用MC9S12D64自制BootLoader时对FLASH操作的问题

请教:

我现在用的是MC9S12D64芯片,我想做一个BootLoader在单片机中,我在对FLASH存储器进行操作时发现用单步执行的方式能成功的清除一个扇区也能对清除部分进行一个字一个字的写入,但是只要用全速运行时,扇区清除功能都不能实现,请各位大侠帮忙.

我的程序有两部分,$4000--$7FFF为BootLoader,$C000开始的程序为常规功能部分,其中程序运行在特别条件下调用BootLoader重新对常规部分编程(用SCI传送新数据).

我查寻资料后发现单步执行的方式的代码好象是在主机和BDM上.全速运行代码在目标板,有些参考资料中也提到了将程序COPY到RAM中的问题,MC9S12D64的RAM是用来存放变量的区域.它单独有一个程序指针来读指令.

MC9S12D64,它有64KFLASH,页面号为3C,3D,3E,3F,当不对程序存放区域作特殊指定时,复位中断指定到$C000,程序代码放到$3C8000的页面中,我的改写功能程序和正常功能程序调用关系如下:

void main(void)
{
    BootStartUp();//改写功能程序
    FCLKDIV=0;
    DisableInterrupts;

    //正常功能程序

    Initial();                 // 初始化
    EnableInterrupts;
    MainControl();
}

void BootStartUp(void)
{
  dword FLASH_addr;
  word SetData;
  byte ibyte;

  SCI1BD_SBR = 39;
  SCI1CR2_TE = 1;
  SCI1CR2_RE = 1;

  EnableInterrupts;
  SetSCICode(0x55);
  SetSCICode(0x55);
  DisableInterrupts;
  FCLKDIV=61;
  FLASH_addr=0x3C8000;
  EraseSectorInternal(FLASH_addr);
  SetSCICode(0x56);
  SetData=0x55AA;
  for(ibyte=0;ibyte<256;ibyte++)
  {
    SetSCICode(0x33);
    SetSCICode(ibyte);
    IFsh1_SetWordFlash(FLASH_addr+ibyte*2,SetData);
  }
}

byte EraseSectorInternal(dword Addr)
{
  SetSCICode(FSEC);
  EnterCritical();
  ClearFlags();//FSTAT = 48;
  SetSCICode(0xA1);
  if (FSTAT_CBEIF == 0) {
    ExitCritical();
    return ERR_BUSY;
  }
  SetSCICode(0xA2);
  *(word *far) Addr = IFsh1_EraseData;
  SetSCICode(0xA3);
  FCMD = 64;
  SetSCICode(0xA4);
  FSTAT = 128;
  SetSCICode(0xA5);
  if ((FSTAT_PVIOL == 1)||(FSTAT_ACCERR == 1)) {
  SetSCICode(0xA6);
  SetSCICode(FSTAT);
  SetSCICode(FPROT);
    ExitCritical(); 
    return ERR_NOTAVAIL;
  }
  SetSCICode(0xA7);
  while (FSTAT_CBEIF == 0);
  while (FSTAT_CCIF == 0); 
  SetSCICode(0xA8);
  ExitCritical();          
  return ERR_OK;
}

当用单步执行时能正常清除$3C8000开始一个扇区的所有内容并能执行写入将$55AA写入到该扇区内,用全速执行时通过串口查对数据执行到A4.

我用的晶震为12MHz,未启用PLL,IFsh1_EraseData为0x10,它可以为任意数,问题出在什么地方请各位大侠指点.

[此贴子已经被作者于2005-11-19 11:15:13编辑过]

[此贴子已经被作者于2005-11-24 9:02:15编辑过]


作者: ben_jk    时间: 2005-12-7 21:40

也许是中断向量表的问题
你有设置中断向量表吗




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0