53501《设计自己的ISP程序》P70.docx
- 文档编号:569276
- 上传时间:2023-04-29
- 格式:DOCX
- 页数:39
- 大小:24.20KB
53501《设计自己的ISP程序》P70.docx
《53501《设计自己的ISP程序》P70.docx》由会员分享,可在线阅读,更多相关《53501《设计自己的ISP程序》P70.docx(39页珍藏版)》请在冰点文库上搜索。
53501《设计自己的ISP程序》P70
5.(3501)《设计自己的ISP程序》P70
C程序源代码Download.C如下:
.
/**************************************************************************
IAP.CSST和STC单片机IAP操作函数
魏东(tonywei@)
2004.7.23
**************************************************************************/
#defineSTC/*定义为STC单片机(如果是SST单片机则去掉此行)*/
/**************************************************************************
*SFRMemoryAddresses
**************************************************************************/
sfrSFCF=0xB1;/*SuperFlashConfiguration*/
sfrSFCM=0xB2;/*SuperFlashCommand*/
sfrSFAL=0xB3;/*SuperFlashAddressLow*/
sfrSFAH=0xB4;/*SuperFlashAddressHigh*/
sfrSFDT=0xB5;/*SuperFlashData*/
sfrSFST=0xB6;/*SuperFlashStatus*/
/**************************************************************************
*MCUIAPCommands
**************************************************************************/
#defineSFCM_BE0x0D;/*block-EraseIAPcmd*/
#defineSFCM_SE0x0B;/*Sector-EraseIAPcmd*/
#defineSFCM_VB0x0C;/*Byte-VerifyIAPcmd*/
#defineSFCM_PB0x0E;/*Byte-ProgramIAPcmd*/
bitiap_error=0;
voidblock0_erase(void);
voidsector_erase(unsignedint);
voidbyte_program(unsignedint,unsignedchar);
unsignedcharbyte_verify(unsignedint);
unsignedcharready(void);
/**************************************************************************
*Block0-EraseSubroutine
**************************************************************************/
voidblock0_erase(void)
{
SFCF=SFCF|0x40;/*enableIAP*/
#ifdefSTC
SFAH=0xf0;/*STC单片机选择block0*/
#else
SFAH=0x00;/*SST单片机选择block0*/
#endif
SFDT=0x55;
SFCM=SFCM_BE;/*issueblockerasecommand*/
if(!
ready())iap_error=1;
}
/**************************************************************************
*Sector-EraseSubroutine
**************************************************************************/
voidsector_erase(unsignedshortintdestAddr)
{
SFCF=SFCF|0x40;/*enableIAP*/
SFAH=destAddr>>8;/*loadhighorderaddressbyte*/
SFAL=destAddr;/*loadloworderaddressbyte*/
SFCM=SFCM_SE;/*issuesectorerasecommand*/
if(!
ready())iap_error=1;
}
/**************************************************************************
*Byte-ProgramSubroutine
**************************************************************************/
voidbyte_program(unsignedshortintdestAddr,unsignedchardataByte)
{
SFCF=SFCF|0x40;/*enableIAP*/
SFAH=destAddr>>8;/*loadhighorderaddressbyte*/
SFAL=destAddr;/*loadloworderaddressbyte*/
SFDT=dataByte;/*loaddatatobeprogrammed*/
SFCM=SFCM_PB;/*issuebyteprogramcommand*/
if(!
ready())iap_error=1;
}
/**************************************************************************
*Byte-VerifySubroutine
**************************************************************************/
unsignedcharbyte_verify(unsignedshortintdestAddr)
{unsignedcharreadByte;
SFCF=SFCF|0x40;/*enableIAP*/
SFAH=destAddr>>8;/*loadhighorderaddressbyte*/
SFAL=destAddr;/*loadloworderaddressbyte*/
SFCM=SFCM_VB;/*issuebyteverifycommand*/
readByte=SFDT;
SFCF=SFCF&0xBF;/*turnoffIAP*/
SFDT=0;
returnreadByte;
}
/**************************************************************************
*ReadySubroutine
*Purpose:
TocheckiftheIAPoperationiscompleted.
*Whenitisdone,turnoffIAPconfiguration.
**************************************************************************/
unsignedcharready()
{unsignedlongTimeOut;
for(TimeOut=0;TimeOut<100000;TimeOut++)
{if((SFST&4)==0)/*CheckifIAPisdone*/
{/*IAPisdone*/
SFCF=SFCF&0xBF;/*turnoffIAP*/
SFDT=0;/*anyvalueotherthan0x55*/
return1;/*IAPoperationiscompleted*/
}
}
SFCF=SFCF&0xBF;/*turnoffIAP*/
SFDT=0;/*anyvalueotherthan0x55*/
return0;/*IAPoperationisNOTcompletedbeforetimeout*/
}
附件二:
ISP.C
/**************************************************************************
SST或STC单片机ISP程序
魏东(tonywei@)2004.7.25
SST89C54或STC89C516RD,频率:
7.372848MHz
**************************************************************************/
#include"reg51.h"
/*对IAP.C调用的定义*/
externbitiap_error;
externvoidblock0_erase(void);
externvoidsector_erase(unsignedint);
externvoidbyte_program(unsignedint,unsignedchar);
externunsignedcharbyte_verify(unsignedint);
externunsignedcharready(void);
//#defineSTC/*定义为STC单片机*/
sfrWDTC=0xC0;
sfrWDTD=0x86;
sfrSFCF=0xB1;
#defineCON_OSC7372848/*振荡频率*/
#defineCON_BPS256-(CON_OSC/12/32/6400)/*6400BPS时间常数*/
#defineCON_MSCCON_OSC/360000/*延时*/
/*变量定义*/
unsignedcharcom_buf[58];
unsignedintnAddress=0;/*编程器编程地址*/
/*函数定义*/
unsignedcharcom_getch(void);/*串口接收1字符*/
voidcom_putch(char);/*串口发送1字符*/
voidcom_putinfo(void);/*串口发送复位信息*/
voiddelay_ms(unsignedchar);/*延时(单位:
0.1毫秒)*/
voiddelay_s(unsignedchar);/*延时(单位:
0.01秒)*/
void(*pc_0)(void);/*程序地址0000*/
voidgoto_pc0(void);/*跳转到程序地址0000运行*/
/*************************************************************************/
/*串口接收1字符*/
unsignedcharcom_getch(void)
{unsignedcharc;
RI=0;
while(RI==0);
c=SBUF;
returnc;
}
/*串口发送1字符*/
voidcom_putch(charc)
{
TI=0;
SBUF=c;
while(TI==0);
}
/*串口发送复位信息*/
voidcom_putinfo(void)
{
#ifdefSTC
unsignedcharcode*reset_info="STC89C516101";
#else
unsignedcharcode*reset_info="SST89C54101";
#endif
unsignedcharcr,ci;
cr=0;
for(ci=0;ci<24;ci++)
{com_putch(reset_info[ci]);
cr=cr+reset_info[ci];
}
cr=0-cr;
com_putch(cr);/*发送效验和*/
}
/*************************************************************************/
/*延时(单位:
0.1毫秒)*/
voiddelay_ms(unsignedcharci)
{unsignedcharcj;
while(ci)
{for(cj=0;cj /*编译为汇编如下: delay_ub: INCR6;1 CJNER6,delay_ub;2 */ ci--; } } /*跳转到程序地址0000运行*/ voidgoto_pc0(void) {unsignedcharci; EA=0;/*禁止中断*/ ci=SFCF; #ifdefSTC ci=(ci&0xfc)|2; SFCF=ci;//SFCF[1]从0到1产生软复位,程序从0开始执行,并且SC0按照其设置(从block0运行) while (1); #else ci=(ci&0xfc)|0x80; SFCF=ci; pc_0=0; pc_0(); #endif } /*************************************************************************/ voidmain(void) { unsignedcharcr,ci,cj; unsignedintui; PCON=0; SCON=0x50;/*置串口工作方式1(T1用作串口波特率发生)*/ TMOD=0x21;/*置定时器1工作方式2,定时器0工作方式1*/ TH1=CON_BPS;/*波特率时间常数*/ TL1=CON_BPS; TR1=1;/*启动定时器1*/ EA=0;/*禁止中断*/ TI=1;/*setTItosendfirstcharofUART*/ WDTD=0; WDTC=0;/*关看门狗*/ SFCF|=0x80; for(ci=0;ci<5;ci++)delay_ms(100);/*等待50mS稳定时间*/ com_putinfo();/*发送复位信息*/ ui=0; RI=0; while (1) {delay_ms (1); if(RI) {ci=SBUF; RI=0; ui=0; if((ci==0x21)||(ci==0x07))break;/*接收到命令就进入通讯*/ } ui++; if(ui>=10000)goto_pc0();/*等待1秒,跳转到用户程序运行*/ } while (1) {iap_error=0; if(ci==0x21) {for(ci=0;ci<3;ci++)com_buf[ci]=com_getch(); if((com_buf[0]==0x5a)||(com_buf[1]==0)||(com_buf[2]==0xa6)) com_putinfo();/*发送复位信息*/ elsecom_putch(5);/*返回错误标志*/ } elseif(ci==0x07)/*数据包: 07H,0EH,包长度,'W',00H,地址高字节,地址低字节,程序数据,效验和*/ {for(ci=0;ci<2;ci++)com_buf[ci]=com_getch(); if((com_buf[0]==0x0e)&&com_buf[1]) {cj=com_buf[1]; cr=cj; for(ci=0;ci<=cj;ci++) {com_buf[ci]=com_getch(); cr+=com_buf[ci]; } if(cr)com_putch(5);/*返回错误标志*/ elseif((com_buf[0]=='W')&&(com_buf[1]==00)&&(cj>4)) {nAddress=com_buf[2]*256+com_buf[3]; cj-=4; for(ci=0;ci { #ifdefSTC byte_program(nAddress,com_buf[4+ci]);/*写*/ #else if(nAddress<0x8000)byte_program(nAddress,com_buf[4+ci]);/*SST限制写地址*/ #endif nAddress++; } if(iap_error)com_putch(5);/*返回错误标志*/ elsecom_putch(6);/*返回正确标志*/ } elseif((com_buf[0]=='A')||(com_buf[0]=='C')) {block0_erase();/*擦除器件*/ if(iap_error)com_putch(5);/*返回错误标志*/ elsecom_putch(6);/*返回正确标志*/ } elseif(com_buf[0]=='U') {com_putch(6);/*返回正确标志*/ goto_pc0();/*跳转到用户程序运行*/ } elsecom_putch(5);/*返回错误标志*/ } elsecom_putch(5);/*返回错误标志*/ } elsecom_putch(5);/*返回错误标志*/ ci=com_getch(); } } 附件三: DOWNLOAD.C /******************************************************************** ISP下载程序 魏东(tonywei@)2004.7.25 ProgramfilesmustbeofINTELstandardHEXformat. ThiscodewascompiledusingBorlandC++version5.0forDOS. Theclock()functionisusedtodeterminecommunicationtimeouts. [thetickresolutionisassumedtobe1/18thofasecond.Itmaybe differentonothercompilersorinmemorymodelsotherthanLARGE] ********************************************************************/ #include #include #include #include #include #include /*******************************************************************/ #defineDEFAULTTIMEOUT5/*aboutaquarterofasecond*/ #defineERASETIMEOUT80/*about4seconds*/ #defineVER"1.01" #defineDATE"25July,2004" /*functionprototypes*/ intreset(int*major,int*minor); intdownload(intrev,char*program); intrun(); voidshowTitle(void); voidshowInstructions(void); intdecodeCommandLine(intargc,char*argv[], int*comport,double*crystal, char*filename, int*dontEraseData, int*autoRun); intvalidateParameters(intcomport,double*cryst
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计自己的ISP程序 53501 设计 自己 ISP 程序 P70