没有合适的资源?快使用搜索试试~ 我知道了~
单片机ISP烧写程序——C代码
4星 · 超过85%的资源 需积分: 10 37 下载量 29 浏览量
2011-06-07
22:18:38
上传
评论 3
收藏 73KB PDF 举报
温馨提示
试读
18页
用C代码写的单片机ISP烧写程序,包括对FLASH擦除、读、写的操作,很使用
资源推荐
资源详情
资源评论
1
设计自己的ISP程序
C程序源代码
/********************************************************************
IAP.C SST和STC单片机IAP操作函数
魏东(tonywei@tom.com)
2004.7.23
********************************************************************/
#define STC /*定义为STC单片机(如果是SST单片机则去掉此行)*/
/********************************************************************
* SFR Memory Addresses
********************************************************************/
sfr SFCF = 0xB1; /*SuperFlash Configuration*/
sfr SFCM = 0xB2; /*SuperFlash Command*/
sfr SFAL = 0xB3; /*SuperFlash Address Low*/
sfr SFAH = 0xB4; /*SuperFlash Address High*/
sfr SFDT = 0xB5; /*SuperFlash Data*/
sfr SFST = 0xB6; /*SuperFlash Status*/
/********************************************************************
* MCU IAP Commands
********************************************************************/
#define SFCM_BE 0x0D; /*block-Erase IAP cmd*/
#define SFCM_SE 0x0B; /*Sector-Erase IAP cmd*/
#define SFCM_VB 0x0C; /*Byte-Verify IAP cmd*/
#define SFCM_PB 0x0E; /*Byte-Program IAP cmd*/
bit iap_error=0;
void block0_erase(void);
void sector_erase(unsigned int);
void byte_program(unsigned int, unsigned char);
unsigned char byte_verify(unsigned int);
unsigned char ready(void);
/********************************************************************
* Block0-Erase Subroutine
********************************************************************/
void block0_erase(void)
{
SFCF = SFCF | 0x40; /*enable IAP */
#ifdef STC
SFAH = 0xf0; /*STC单片机选择block0*/
#else
SFAH = 0x00; /*SST单片机选择block0*/
#endif
SFDT = 0x55;
SFCM = SFCM_BE; /*issue block erase command */
if(!ready()) iap_error=1;
}
/********************************************************************
* Sector-Erase Subroutine
********************************************************************/
void sector_erase(unsigned short int destAddr)
{
SFCF = SFCF | 0x40; /*enable IAP */
SFAH = destAddr>>8; /*load high order address byte*/
SFAL = destAddr; /*load low order address byte */
SFCM = SFCM_SE; /*issue sector erase command */
if(!ready()) iap_error=1;
2
}
/********************************************************************
* Byte-Program Subroutine
********************************************************************/
void byte_program(unsigned short int destAddr, unsigned char dataByte)
{
SFCF = SFCF | 0x40; /*enable IAP */
SFAH = destAddr>>8; /*load high order address byte*/
SFAL = destAddr; /*load low order address byte */
SFDT = dataByte; /*load data to be programmed */
SFCM = SFCM_PB; /*issue byte program command */
if(!ready()) iap_error=1;
}
/********************************************************************
* Byte-Verify Subroutine
********************************************************************/
unsigned char byte_verify(unsigned short int destAddr)
{ unsigned char readByte;
SFCF = SFCF | 0x40; /*enable IAP */
SFAH = destAddr>>8; /*load high order address byte*/
SFAL = destAddr; /*load low order address byte */
SFCM = SFCM_VB; /*issue byte verify command */
readByte = SFDT;
SFCF = SFCF & 0xBF; /*turn off IAP*/
SFDT = 0;
return readByte;
}
/********************************************************************
* Ready Subroutine
* Purpose: To check if the IAP operation is completed.
* When it is done, turn off IAP configuration.
********************************************************************/
unsigned char ready()
{ unsigned long TimeOut;
for(TimeOut=0;TimeOut<100000;TimeOut++)
{ if ((SFST&4) == 0) /* Check if IAP is done */
{ /* IAP is done */
SFCF = SFCF & 0xBF; /* turn off IAP*/
SFDT = 0; /* any value other than 0x55 */
return 1; /* IAP operation is completed*/
}
}
SFCF = SFCF & 0xBF; /*turn off IAP*/
SFDT = 0; /*any value other than 0x55*/
return 0; /*IAP operation is NOT completed before time out*/
}
3
附件二:ISP.C
/********************************************************************
SST或STC单片机ISP程序
魏东(tonywei@tom.com) 2004.7.25
SST89C54或STC89C516RD,频率:7.372848MHz
********************************************************************/
#include "reg51.h"
/* 对IAP.C调用的定义 */
extern bit iap_error;
extern void block0_erase(void);
extern void sector_erase(unsigned int);
extern void byte_program(unsigned int, unsigned char);
extern unsigned char byte_verify(unsigned int);
extern unsigned char ready(void);
//#define STC /*定义为STC单片机*/
sfr WDTC = 0xC0;
sfr WDTD = 0x86;
sfr SFCF = 0xB1;
#define CON_OSC 7372848 /* 振荡频率*/
#define CON_BPS 256 - ( CON_OSC / 12 / 32 / 6400 ) /* 6400BPS时间常数*/
#define CON_MSC CON_OSC/360000 /* 延时*/
/* 变量定义*/
unsigned char com_buf[58];
unsigned int nAddress = 0; /* 编程器编程地址*/
/* 函数定义*/
unsigned char com_getch(void); /* 串口接收字符*/
void com_putch(char); /* 串口发送字符*/
void com_putinfo(void); /* 串口发送复位信息*/
void delay_ms(unsigned char); /* 延时(单位:0.1毫秒) */
void delay_s(unsigned char); /* 延时(单位:0.01秒) */
void (* pc_0)(void); /* 程序地址*/
void goto_pc0(void); /* 跳转到程序地址运行*/
/*******************************************************************/
/* 串口接收字符*/
unsigned char com_getch(void)
{ unsigned char c;
RI=0;
while(RI==0);
c=SBUF;
return c;
}
/* 串口发送字符*/
void com_putch(char c)
{
TI=0;
SBUF=c;
while(TI==0);
}
/* 串口发送复位信息*/
void com_putinfo(void)
4
{
#ifdef STC
unsigned char code *reset_info = "STC 89C516 101 ";
#else
unsigned char code *reset_info = "SST 89C54 101 ";
#endif
unsigned char cr,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毫秒) */
void delay_ms(unsigned char ci)
{ unsigned char cj;
while(ci)
{ for(cj=0;cj<CON_MSC;cj++) ; /* 延时(12/CON_OSC)*3 */
/* 编译为汇编如下:
delay_ub: INC R6 ;1
CJNE R6,delay_ub ;2
*/
ci --;
}
}
/* 跳转到程序地址运行*/
void goto_pc0(void)
{ unsigned char ci;
EA=0; /* 禁止中断*/
ci = SFCF;
#ifdef STC
ci = (ci&0xfc)|2;
SFCF = ci; // SFCF[1]从到产生软复位,程序从开始执行,并且SC0按照其设置(从block0
运行)
while(1);
#else
ci = (ci&0xfc)|0x80;
SFCF = ci;
pc_0 = 0;
pc_0();
#endif
}
/*******************************************************************/
void main (void)
{
unsigned char cr,ci,cj;
unsigned int ui;
PCON=0;
SCON=0x50; /* 置串口工作方式(T1用作串口波特率发生) */
TMOD=0x21; /* 置定时器工作方式,定时器工作方式*/
剩余17页未读,继续阅读
资源评论
- WYS252513252013-03-17比较好的资料 有上位机的就好了
- si_gequan2012-10-19是pdf格式的 不是很方便 呵呵不过还是谢谢了
- rainspeeds2013-09-23没看懂,想找的是上位机那样的,这些代码不知道怎么实现
k8370912
- 粉丝: 1
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功