在线时间0 小时
UID178503
注册时间2010-3-26
NXP金币0
该用户从未签到
新手上路

- 积分
- 12
- 最后登录
- 1970-1-1
|
以下的是对FLASH操作,当我单步执行时,能正确读写FLASH,当我全速度执行时,PC却走到了0X100出去,为什么呢?在unsigned char ROM_PGM(unsigned int address,unsigned char data,unsigned char cmd) 有一个指针, (*((volatile unsigned char *)(address))) = data;//write to somewhere in flash ,当我删了,程序可执行,问题就出在这里,请高手指点帮我讲解下,谢谢
#define FLASH_CMD_BYTEPROG 0x20
#define FLASH_CMD_PAGEERASE 0x40
void pagehandle()
{
flash_page_erase(0xf800);
flash_byte_prog(0xf800,0x55);
flash_byte_prog(0xf801,0xaa);
flash_byte_prog(0xf802,0xa5);
tab[0] = flash_byte_read(0xf800);
tab[1] = flash_byte_read(0xf801);
tab[2] = flash_byte_read(0xf802);
}
unsigned char ROM_PGM(unsigned int address,unsigned char data,unsigned char cmd)
{
__RESET_WATCHDOG();
DisableInterrupts;
if (FSTAT&0x10)
{ //Check to see if FACCERR is set
FSTAT = FSTAT|0x10; //write a 1 to FACCERR to clear
}
(*((volatile unsigned char *)(address))) = data;//write to somewhere in flash
FCMD = cmd;
FSTAT = FSTAT|0x80; //Put FCBEF at 1.
asm nop
asm nop
asm nop
asm nop
if(FSTAT&0x30)
{ //check to see if FACCERR or FVIOL are set
EnableInterrupts;
return (0xFF); //if so, error.
}
while ((FSTAT&0x40)==0);
EnableInterrupts;
return(0);
}
void flash_byte_prog(unsigned int addr, unsigned char data)
{
//FCMD = 0X20;
ROM_PGM(addr,data,FLASH_CMD_BYTEPROG);
}
static void flash_page_erase(unsigned int addr)
{
//FCMD = 0X40;
ROM_PGM(addr,0,FLASH_CMD_PAGEERASE);
}
static unsigned char flash_byte_read(unsigned int addr)
{
return *(unsigned char *)addr;
}
|
|