请教:
我现在用的是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编辑过] |