自己编的STC12C5A60S2 6.2I版本的下载工具
简单实现,不下载启动参数。仅下载代码 本帖最后由 ordinary 于 2014-1-18 09:23 编辑
如有需要,源代码随后挂网 感谢ordinary。 haodongxi ding 感谢,用什么语言写的?LZ公布一下代码吧,正想整一个LINUX下用 围观,收藏 有没有源码分享一下啊 分享源码,有点乱 整理的协议,取之论坛,还之论坛 启动参数的分析未完成,有兴趣的补完请公布 C51测试代码,分析协议用的工具。
虚拟串口,串口Monitor,自己写的STC12C5A60S2模拟 STC12C5A60S2模拟, 监听在127.0.0.1 : 6020 端口
需要启动虚拟串口用stc-isp-15xx-v6.33下载代码
分析下载协议用 代码、工具,结果三公开。
彻底开源,申请长裤一条。 谢谢LZ,等我消化下,弄个LINUX下用的,然后开源到这里 Mark!! 很强啊{:smile:} 太强了。。 好贴留名 好东西啊!最好在支持多些期间,像stc89c52一类的 这个不错 非常不错. 技术贴,,{:titter:} 强帖留名 好厉害,学习一下,谢谢 不下载启动参数是啥意思? marshallemon 发表于 2014-1-19 16:53
不下载启动参数是啥意思?
下载代码时,不更新ic的启动参数(使用内部、外部时钟选择;上电时延选择;RST脚功能选择等)。
原装的每次下载均会更新启动参数,有时会误选。 学习一下,谢谢 不错呀!好东西呀!!! lz叫wj,泄露了。{:smile:} 用什么语言写的? {:shocked:}好强大,能支持全系列isp就更牛了{:lol:} justdomyself 发表于 2014-1-20 14:53
用什么语言写的?
delphi(pascal) wkman 发表于 2014-1-20 15:49
好强大,能支持全系列isp就更牛了
编写的目的不是彻底替换STC原装的下载软件,支持STC全系列ISP意义不大。
主要是想实现更新程序和自己的上位机程序集成化,显得专业点。
另就是分析清其下载协议可以实现离线下载,在系统自动更新程序。 终于有人放出来了,好强大 呵呵 楼主厉害,这个要好好收藏 Delphi,like it
thanks! 强烈围观! 修正下载大代码出现错误的问题
(计算代码大小是出现问题) 公布修正后的源代码 不错!顶! 楼主好强大!这个都可以弄出来! 厉害 支持LZ 支持!!新固件版本的可以吗? 此贴必火,MARK。LZ造福大家了。 楼主这个分享得好,
在自己开发项目上很有用 楼主这个分享得好 {:shocked:}{:victory:}{:lol:}做成全系列下载的? wkman 发表于 2014-7-8 15:25
做成全系列下载的?
STC15F\W的官网已公开了下载代码。
支持全系列的意义不大,自己也不具备测试条件。 太棒了,这是怎么弄的呢 楼主好人 下载学习下~~~~~ MARK!下载下来用用。 老大厉害。长期潜水员要加油了 ,努力升级 楼主厉害啊,分享出来学习下 用VB写的吗 TZQ95865 发表于 2014-9-18 21:53
用VB写的吗
delphi
delphi网上介绍说比VB好
好贴!~!~ 00000000000000000000000000000000000000000000000 yanmylbh 发表于 2014-9-23 11:52
00000000000000000000000000000000000000000000000
注意规则 怕封id{:cry:} TZQ95865 发表于 2014-9-24 13:34
注意规则 怕封id
哦哦,没注意看,现在看见了 先mark一下!虽然已不用STC了! 记得我以前搞过个kstcisp。。。 LZ很牛B啊。下载下来看看,好东西一定要收藏啊。 厉害,支持楼主 stc 下载协议MARK 楼主好强大,收藏了 谢谢分享 很好很强大 ordinary 发表于 2014-1-18 16:05
整理的协议,取之论坛,还之论坛
说得好,饮水思源! 围观高手。 楼主真是牛啊 搞的这么细,真是牛人啊 好像好厉害的样子。不过需要继续加油啊。最好还能设置下参数啥的…… 标记,手机上不方便下载 顶楼主 一直在找此方面资料 一直想写个带序列号、下载次数可控的远程下载软件,借鉴一下 围观了。 收藏了,谢了 王健?是做机器人的那个王健吗?
收藏了,谢了 挺牛的 好奇下载协议哪里看到的?
mark…… 这个要收藏一下,谢谢楼主{:lol:} /*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- 使用主芯片对从芯片(限STC15系列)进行ISP下载举例 -----------------*/
/* --- Mobile: (86)13922805190 ----------------------------------------*/
/* --- Fax: 86-755-82905966 -------------------------------------------*/
/* --- Tel: 86-755-82948412 -------------------------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序 */
/* 如果要在文章中应用此代码,请在文章中注明使用了宏晶科技的资料及程序 */
/*---------------------------------------------------------------------*/
//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//假定测试芯片的工作频率为11.0592MHz
//注意:使用本代码对STC15系列的单片机进行下载时,必须要执行了Download代码之后,
//才能给目标芯片上电,否则目标芯片将无法正确下载
#include "reg51.h"
typedef bit BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
//宏、常量定义
#define FALSE 0
#define TRUE 1
#define LOBYTE(w) ((BYTE)(WORD)(w))
#define HIBYTE(w) ((BYTE)((WORD)(w) >> 8))
#define MINBAUD 2400L
#define MAXBAUD 115200L
#define FOSC 11059200L //主控芯片工作频率
#define BR(n) (65536 - FOSC/4/(n)) //主控芯片串口波特率计算公式
#define T1MS (65536 - FOSC/1000) //主控芯片1ms定时初值
//#define FUSER 11059200L //STC15系列目标芯片工作频率
//#define FUSER 12000000L //STC15系列目标芯片工作频率
//#define FUSER 18432000L //STC15系列目标芯片工作频率
//#define FUSER 22118400L //STC15系列目标芯片工作频率
#define FUSER 24000000L //STC15系列目标芯片工作频率
#define RL(n) (65536 - FUSER/4/(n)) //STC15系列目标芯片串口波特率计算公式
//SFR定义
sfr AUXR = 0x8e;
//变量定义
BOOL f1ms; //1ms标志位
BOOL UartBusy; //串口发送忙标志位
BOOL UartReceived; //串口数据接收完成标志位
BYTE UartRecvStep; //串口数据接收控制
BYTE TimeOut; //串口通讯超时计数器
BYTE xdata TxBuffer; //串口数据发送缓冲区
BYTE xdata RxBuffer; //串口数据接收缓冲区
char code DEMO; //演示代码数据
//函数声明
void Initial(void);
void DelayXms(WORD x);
BYTE UartSend(BYTE dat);
void CommInit(void);
void CommSend(BYTE size);
BOOL Download(BYTE *pdat, long size);
//主函数入口
void main(void)
{
while (1)
{
Initial();
if (Download(DEMO, 0x0100))
{
//下载成功
P3 = 0xff;
DelayXms(500);
P3 = 0x00;
DelayXms(500);
P3 = 0xff;
DelayXms(500);
P3 = 0x00;
DelayXms(500);
P3 = 0xff;
DelayXms(500);
P3 = 0x00;
DelayXms(500);
P3 = 0xff;
}
else
{
//下载失败
P3 = 0xff;
DelayXms(500);
P3 = 0xf3;
DelayXms(500);
P3 = 0xff;
DelayXms(500);
P3 = 0xf3;
DelayXms(500);
P3 = 0xff;
DelayXms(500);
P3 = 0xf3;
DelayXms(500);
P3 = 0xff;
}
}
}
//1ms定时器中断服务程序
void tm0(void) interrupt 1 using 1
{
static BYTE Counter100;
f1ms = TRUE;
if (Counter100-- == 0)
{
Counter100 = 100;
if (TimeOut) TimeOut--;
}
}
//串口中断服务程序
void uart(void) interrupt 4 using 1
{
static WORD RecvSum;
static BYTE RecvIndex;
static BYTE RecvCount;
BYTE dat;
if (TI)
{
TI = 0;
UartBusy = FALSE;
}
if (RI)
{
RI = 0;
dat = SBUF;
switch (UartRecvStep)
{
case 1:
if (dat != 0xb9) goto L_CheckFirst;
UartRecvStep++;
break;
case 2:
if (dat != 0x68) goto L_CheckFirst;
UartRecvStep++;
break;
case 3:
if (dat != 0x00) goto L_CheckFirst;
UartRecvStep++;
break;
case 4:
RecvSum = 0x68 + dat;
RecvCount = dat - 6;
RecvIndex = 0;
UartRecvStep++;
break;
case 5:
RecvSum += dat;
RxBuffer = dat;
if (RecvIndex == RecvCount) UartRecvStep++;
break;
case 6:
if (dat != HIBYTE(RecvSum)) goto L_CheckFirst;
UartRecvStep++;
break;
case 7:
if (dat != LOBYTE(RecvSum)) goto L_CheckFirst;
UartRecvStep++;
break;
case 8:
if (dat != 0x16) goto L_CheckFirst;
UartReceived = TRUE;
UartRecvStep++;
break;
L_CheckFirst:
case 0:
default:
CommInit();
UartRecvStep = (dat == 0x46 ? 1 : 0);
break;
}
}
}
//系统初始化
void Initial(void)
{
UartBusy = FALSE;
SCON = 0xd0; //串口数据模式必须为8位数据+1位偶检验
AUXR = 0xc0;
TMOD = 0x00;
TH0 = HIBYTE(T1MS);
TL0 = LOBYTE(T1MS);
TR0 = 1;
TH1 = HIBYTE(BR(MINBAUD));
TL1 = LOBYTE(BR(MINBAUD));
TR1 = 1;
ET0 = 1;
ES = 1;
EA = 1;
}
//Xms延时程序
void DelayXms(WORD x)
{
do
{
f1ms = FALSE;
while (!f1ms);
} while (x--);
}
//串口数据发送程序
BYTE UartSend(BYTE dat)
{
while (UartBusy);
UartBusy = TRUE;
ACC = dat;
TB8 = P;
SBUF = ACC;
return dat;
}
//串口通讯初始化
void CommInit(void)
{
UartRecvStep = 0;
TimeOut = 20;
UartReceived = FALSE;
}
//发送串口通讯数据包
void CommSend(BYTE size)
{
WORD sum;
BYTE i;
UartSend(0x46);
UartSend(0xb9);
UartSend(0x6a);
UartSend(0x00);
sum = size + 6 + 0x6a;
UartSend(size + 6);
for (i=0; i<size; i++)
{
sum += UartSend(TxBuffer);
}
UartSend(HIBYTE(sum));
UartSend(LOBYTE(sum));
UartSend(0x16);
while (UartBusy);
CommInit();
}
//对STC15系列的芯片进行数据下载程序
BOOL Download(BYTE *pdat, long size)
{
BYTE arg;
BYTE fwver;
BYTE offset;
BYTE cnt;
WORD addr;
//握手
CommInit();
while (1)
{
if (UartRecvStep == 0)
{
UartSend(0x7f);
DelayXms(10);
}
if (UartReceived)
{
arg = RxBuffer;
fwver = RxBuffer;
if (RxBuffer == 0x50) break;
return FALSE;
}
}
//设置参数(设置从芯片使用最高的波特率以及擦除等待时间等参数)
TxBuffer = 0x01;
TxBuffer = arg;
TxBuffer = 0x40;
TxBuffer = HIBYTE(RL(MAXBAUD));
TxBuffer = LOBYTE(RL(MAXBAUD));
TxBuffer = 0x00;
TxBuffer = 0x00;
TxBuffer = 0xc3;
CommSend(8);
while (1)
{
if (TimeOut == 0) return FALSE;
if (UartReceived)
{
if (RxBuffer == 0x01) break;
return FALSE;
}
}
//准备
TH1 = HIBYTE(BR(MAXBAUD));
TL1 = LOBYTE(BR(MAXBAUD));
DelayXms(10);
TxBuffer = 0x05;
if (fwver < 0x72)
{
CommSend(1);
}
else
{
TxBuffer = 0x00;
TxBuffer = 0x00;
TxBuffer = 0x5a;
TxBuffer = 0xa5;
CommSend(5);
}
while (1)
{
if (TimeOut == 0) return FALSE;
if (UartReceived)
{
if (RxBuffer == 0x05) break;
return FALSE;
}
}
//擦除
DelayXms(10);
TxBuffer = 0x03;
TxBuffer = 0x00;
if (fwver < 0x72)
{
CommSend(2);
}
else
{
TxBuffer = 0x00;
TxBuffer = 0x5a;
TxBuffer = 0xa5;
CommSend(5);
}
TimeOut = 100;
while (1)
{
if (TimeOut == 0) return FALSE;
if (UartReceived)
{
if (RxBuffer == 0x03) break;
return FALSE;
}
}
//写用户代码
DelayXms(10);
addr = 0;
TxBuffer = 0x22;
if (fwver < 0x72)
{
offset = 3;
}
else
{
TxBuffer = 0x5a;
TxBuffer = 0xa5;
offset = 5;
}
while (addr < size)
{
TxBuffer = HIBYTE(addr);
TxBuffer = LOBYTE(addr);
cnt = 0;
while (addr < size)
{
TxBuffer = pdat;
addr++;
cnt++;
if (cnt >= 128) break;
}
CommSend(cnt + offset);
while (1)
{
if (TimeOut == 0) return FALSE;
if (UartReceived)
{
if ((RxBuffer == 0x02) && (RxBuffer == 'T')) break;
return FALSE;
}
}
TxBuffer = 0x02;
}
////写硬件选项
////如果不需要修改硬件选项,此步骤可直接跳过,此时所有的硬件选项
////都维持不变,MCU的频率为上一次所调节频率
////若写硬件选项,MCU的内部IRC频率将被固定写为24M,
////建议:第一次使用STC-ISP下载软件将从芯片的硬件选项设置好
//// 以后再使用主芯片对从芯片下载程序时不写硬件选项
//DelayXms(10);
//for (cnt=0; cnt<128; cnt++)
//{
// TxBuffer = 0xff;
//}
//TxBuffer = 0x04;
//TxBuffer = 0x00;
//TxBuffer = 0x00;
//if (fwver < 0x72)
//{
// TxBuffer = 0xfd;
// TxBuffer = arg;
// TxBuffer = 0x7f;
// TxBuffer = 0xf7;
// TxBuffer = 0x7b;
// TxBuffer = 0x1f;
// CommSend(67);
//}
//else
//{
// TxBuffer = 0x5a;
// TxBuffer = 0xa5;
// TxBuffer = 0xfd;
// TxBuffer = arg;
// TxBuffer = 0x7f;
// TxBuffer = 0xf7;
// TxBuffer = 0x7b;
// TxBuffer = 0x1f;
// CommSend(69);
//}
//while (1)
//{
// if (TimeOut == 0) return FALSE;
// if (UartReceived)
// {
// if ((RxBuffer == 0x04) && (RxBuffer == 'T')) break;
// return FALSE;
// }
//}
//下载完成
return TRUE;
}
char code DEMO =
{
0x02,0x00,0x5E,0x12,0x00,0x4B,0x75,0xB0,
0xEF,0x12,0x00,0x2C,0x75,0xB0,0xDF,0x12,
0x00,0x2C,0x75,0xB0,0xFE,0x12,0x00,0x2C,
0x75,0xB0,0xFD,0x12,0x00,0x2C,0x75,0xB0,
0xFB,0x12,0x00,0x2C,0x75,0xB0,0xF7,0x12,
0x00,0x2C,0x80,0xDA,0xE4,0xFF,0xFE,0xE4,
0xFD,0xFC,0x0D,0xBD,0x00,0x01,0x0C,0xBC,
0x01,0xF8,0xBD,0xF4,0xF5,0x0F,0xBF,0x00,
0x01,0x0E,0xBE,0x03,0xEA,0xBF,0xE8,0xE7,
0x02,0x00,0x4B,0x75,0x80,0xFF,0x75,0x90,
0xFF,0x75,0xA0,0xFF,0x75,0xB0,0xFF,0x75,
0xC0,0xFF,0x75,0xC8,0xFF,0x22,0x78,0x7F,
0xE4,0xF6,0xD8,0xFD,0x75,0x81,0x07,0x02,
0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
收藏,可能会用到 收藏,有时间慢慢消化 楼主好牛逼 ordinary 发表于 2014-8-8 09:26
STC15F\W的官网已公开了下载代码。
支持全系列的意义不大,自己也不具备测试条件。 ...
有么?没找到啊! 多谢,不错。{:lol:}{:lol:}{:lol:}{:lol:}{:lol:} 楼主强大!~{:victory:}{:victory:}{:victory:}
学习下!~
谢谢!~
页:
[1]