|
各位大侠 帮忙看看 程序哪里出问题了 时序看了好久 试了好 几种组合 搞不定啊
#pragma CODE_SEG FLASH_ROUTINES1
unsigned char gvfEraserFlash(unsigned int Addr,unsigned char Data)
{
unsigned char *p=(unsigned char *)Addr;
unsigned int i=2000;
FLCR_ERASE=1;
if(FLBPR)
*p=Data;
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
FLCR_HVEN=1;
while(i--)asm(NOP);
FLCR_ERASE=0;
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
FLCR_HVEN=0;
asm(NOP);
return 1;
}
#pragma CODE_SEG FLASH_ROUTINES2
unsigned char gvfWriteFlash(unsigned int Addr,unsigned char Data)
{
unsigned char i=240;
FLCR_PGM=1;
(void)(FLBPR == 0);
*(unsigned char *)Addr=Data;
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
FLCR_HVEN=1;
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
*(unsigned char *)Addr=Data;
while(i--)asm(NOP);
FLCR_PGM=0;
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
asm(NOP);
FLCR_HVEN=0;
asm(NOP);
asm(NOP);
return 1;
}
#pragma CODE_SEG DEFAULT
/*********************************************** */
#define SIZE_FUNC_RAM 127
void CopyInRAMEraser(unsigned int addr,unsigned char data)
{
unsigned char *srcPtr, *dstPtr;
unsigned char count=0;
unsigned char (*DoFlash)(unsigned int addr,unsigned char data);
srcPtr = (unsigned char *)0xC200;
dstPtr = (unsigned char *)0x01C0; //
DoFlash=(unsigned char *)0x01C0;
for (count = 0; count<SIZE_FUNC_RAM; count++, dstPtr++,srcPtr++)
{
*dstPtr = *srcPtr;
}
DisableInterrupts;
(*DoFlash)(addr,data);
EnableInterrupts;
}
void CopyInRAMWrite(unsigned int addr,unsigned char data)
{
unsigned char *srcPtr, *dstPtr;
unsigned char count=0;
unsigned char (*DoFlash)(unsigned int addr,unsigned char data);
srcPtr = (unsigned char *)0xC300;
dstPtr = (unsigned char *)0x01C0; //
DoFlash=(unsigned char *)0x01C0;
for (count = 0; count<SIZE_FUNC_RAM; count++, dstPtr++,srcPtr++)
{
*dstPtr = *srcPtr;
}
DisableInterrupts;
(*DoFlash)(addr,data);
EnableInterrupts;
}
上电初始化后 运行
CopyInRAMEraser(0xc000,0);
gvfDelay1ms(20);
CopyInRAMWrite(0xc000,0xaa);
然后读取ROM值(0XCOOO)
FF FF FF FF……
本来初始化其值为13 88 读取 程序的确初始化完成,运行程序 ROM擦写完成,但是CopyInRAMWrite(0xc000,0xaa);并没有运行完成,也就是0xc000处的值为0xff 程序中并未用中断,单步调试也看出 子函数的确拷贝到RAM中了,运行完这两个函数后 其它的功能一切正常,就是写入数据写不进 |
|