在线时间166 小时
UID417103
注册时间2012-3-31
NXP金币0
该用户从未签到
金牌会员
- 积分
- 1072
- 最后登录
- 2023-4-10
|
如题,最近做XDT256的bootloader遇到了一个问题,就是擦flash总是出现问题,代码如下:
byte PFlash_EraseSector(dword Addr)
{
dword Addr1 = Addr;
if((Addr>Addr1) || ((Addr<0x00780000)||(Addr1>0x0079FFFF)) && ((Addr<0x007E0000)||(Addr1>0x007FBFFF))) return ERR_RANGE;
DisableInterrupts;
FSTAT = 0x30; // clear ACCERR and PVIOL
while(!(FSTAT & FSTAT_CBEIF_MASK)); // wait if command in progress
*(word *far) Addr = 0;
FCMD = 0x40; // Erase all memory bytes in a sector
FSTAT = 0x80; // launch command
while(!(FSTAT & FSTAT_CCIF_MASK)); // wait for done
if((FSTAT & (FSTAT_ACCERR_MASK | FSTAT_PVIOL_MASK)) != 0)
{
EnableInterrupts;
return ERR_NOTAVAIL;
}
EnableInterrupts;
return ERR_OK;
}
在上电初始化时,将其copy到RAM中。如下:
void Code_Move(byte *source,byte *dest,word size)
{
while(size--)
{
*dest++ = *source++;
}
}
根据map文件,查看函数大小,将函数copy到RAM。
prm文件设置如下:
/* non-paged RAM */
//RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;
RAM_DEF = READ_WRITE DATA_NEAR 0x2000 TO 0x3BFF;//15K
RAM_CODE = READ_WRITE DATA_NEAR 0x3C00 TO 0x3FFF;//1K
/* non-banked FLASH */
//ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF;
//ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;
BOOT_MEM = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xEFFF;//12k
FLASH_MEM = READ_ONLY DATA_NEAR IBCC_NEAR 0xF000 TO 0xF3FF RELOCATE_TO 0x3C00;//1K
ROM = READ_ONLY DATA_NEAR IBCC_NEAR 0xF400 TO 0xFEFF;//2.75k
问题是在烧入boot后下电再上电,便无法成功擦flash,初步排查应该是没能成功copy至RAM。
请求大神帮忙分析下原因,感激不尽。。
|
|