在线时间0 小时
UID155802
注册时间2009-7-29
NXP金币0
该用户从未签到
新手上路

- 积分
- 36
- 最后登录
- 1970-1-1
|
各位好:
我做的一个DZ60Flash 擦写的程序,怎么就执行不了呢?能看到擦和写的子程序调到RAM里,也是在RAM里执行的,也能正常跳出;擦写子程序完全按照DZ60 手册的流程编写,不知什么问题就是擦和写的功能,附上代码,请高手赐教!
*******************************************************************************************************************************************
byte (* pointERom_fun)(),(* pointERam_fun)(),(* pointWRom_fun)(),(* pointWRam_fun)();//定义擦除函数指针和指向擦出函数指针的指针
byte *pointERom_fun_temp, *pointERam_fun_temp, *pointWRom_fun_temp, *pointWRam_fun_temp;
byte ProgmData[30]={0,0};
/**************************************************************************************
函数名: void DZ60_Init(void)
功 能: 系统时钟
说 明: 系统时钟设置请勿随意修改
输 入:无
**************************************************************************************
void DZ60_Init(void)
{
SOPT1=0X00; //disable COP, enable stop mode
MCGC2=0X36;
//BDIV=%00 总线周期/1
//RANGE=1选择高频范围
//HGO=1高增益运行配置外部振荡器
//EREFS=1使用外部晶振
//ERCLKEN=1外部时钟处于激活状态
while(!MCGSC_OSCINIT);
asm SEI //关中断
MCGC1=0XB0;
while(MCGSC_IREFST);
while((MCGSC_CLKST)^(0X02)); //PEI--->FBE
MCGC2_LP=1;
asm CLI //开中断
MCGC1_RDIV=0X02; // /4
MCGC3_VDIV=0X04; // *16
MCGC3_PLLS=1;
while(!MCGSC_PLLST); //FBE--->BLPE
MCGC2_LP=0;
while(!MCGSC_LOCK) //FBE---> BE
MCGC1_CLKS=0X00;
while((MCGSC_CLKST)^(0X03)); //PBE---> EE
FCDIV=39; //将flash时钟分频器FCDIV 0x4C 16.6
}
/******************************************************************************
函数名 : Sector_Erase()
功 能 : 对单个区进行擦除
******************************************************************************/
#pragma CODE_SEG EBoot_SEG
volatile void Sector_Erase(void)
{
byte *Addr;
Addr=(byte *)0xDA00;
if (FSTAT_FACCERR) /* Check for access error */
{
FSTAT_FACCERR = 1; /* Clear access error flag */
}
while (!FSTAT_FCBEF); /* Wait here if command buffer is full */
*Addr = 0x67; /* Write to flash */
FCMD = 0x40; /* Write sector erase command */
FSTAT_FCBEF = 1; /* Write 1 to FCBEF to launch the command */
asm
{ /* Wait 4 cycles */
nop
nop
nop
nop
nop
nop
nop
}
if (FSTAT_FACCERR) /* Check for access error访问错误标记 1错误 0 OK */
{
FSTAT_FACCERR = 1; /* Clear access error flag */
}
if (FSTAT_FPVIOL)
{ /* Check for protection violation 保护规则违反标记 1违反 0 OK */
FSTAT_FPVIOL = 1; /* Clear protection violation flag */
}
while (!FSTAT_FCCF); /* Wait for command to complete */
}
#pragma CODE_SEG ROM
/**************************************************************************************
函数名: Page_Program(void)
功 能: 编程
**************************************************************************************/
#pragma CODE_SEG WBoot_SEG
void Page_Program(void)
{
byte i;
byte *Progm_Addr,*PtrData;
Progm_Addr=(byte *)0xDA00;
PtrData = ProgmData;
if (FSTAT_FACCERR) /* Check for access error */
{
FSTAT_FACCERR = 1; /* Clear access error flag */
} //Page_Program(FlashDataPtr; RecvDataBuf, FLASH_BURST_SIZE);
for (i = 0; i < 30; i++)
{
while (!FSTAT_FCBEF); /* Wait until command buffer is empty */
*Progm_Addr++ = *PtrData++;
FCMD = byte_PROGRAM; /* Write byte program command */
FSTAT_FCBEF = 1; /* Write 1 to FCBEF to launch the command */
asm
{ /* Wait 4 cycles */
nop
nop
nop
nop
nop
nop
nop
}
if (FSTAT_FACCERR) /* Check for access error */
{
FSTAT_FACCERR = 1; /* Clear access error flag */
}
if (FSTAT_FPVIOL)
{ /* Check for protection violation */
FSTAT_FPVIOL = 1; /* Clear protection violation flag */
}
while (!FSTAT_FCCF); /* Wait for command to complete */
}
}
#pragma CODE_SEG Bootloader
/*****************************************************************/
void Delay_ms(byte i)
{
for(;i>0;i--)
{
;
}
}
/**********************************************************************************
函数名: void main(void)
功 能: 主函数
************************************************************************************/
void main(void)
{
DZ60_Init();
for(;;)
{
byte i,j;
pointERom_fun = Sector_Erase;
pointERom_fun_temp = pointERom_fun;
pointERam_fun_temp = (byte *)0x0F90;
pointERam_fun = pointERam_fun_temp;
for (i=0;i
|
|