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

用MC9S12D64自制BootLoader时对FLASH操作的问题

说得具体点,程序考到RAM中执行的吗?注意延时以及操作顺序
51,freescale,c,asm,protel,fpga

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

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

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

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

 

 

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

用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编辑过]

技术是永远可以追求的
也许是中断向量表的问题
你有设置中断向量表吗
返回列表