ordinary 发表于 2014-1-18 09:17:27

自己编的STC12C5A60S2 6.2I版本的下载工具

简单实现,不下载启动参数。
仅下载代码

ordinary 发表于 2014-1-18 09:19:11

本帖最后由 ordinary 于 2014-1-18 09:23 编辑

如有需要,源代码随后挂网

lyl520719 发表于 2014-1-18 09:39:05

感谢ordinary。

weichao4808335 发表于 2014-1-18 09:40:34

haodongxi ding

max 发表于 2014-1-18 09:43:46

感谢,用什么语言写的?LZ公布一下代码吧,正想整一个LINUX下用

STM32_Study 发表于 2014-1-18 10:06:03

围观,收藏

yummo 发表于 2014-1-18 10:42:19

有没有源码分享一下啊

ordinary 发表于 2014-1-18 16:04:00

分享源码,有点乱

ordinary 发表于 2014-1-18 16:05:00

整理的协议,取之论坛,还之论坛

ordinary 发表于 2014-1-18 16:06:51

启动参数的分析未完成,有兴趣的补完请公布

ordinary 发表于 2014-1-18 16:13:11

C51测试代码,分析协议用的工具。
虚拟串口,串口Monitor,自己写的STC12C5A60S2模拟

ordinary 发表于 2014-1-18 16:17:45

STC12C5A60S2模拟, 监听在127.0.0.1 : 6020 端口
需要启动虚拟串口用stc-isp-15xx-v6.33下载代码
分析下载协议用

ordinary 发表于 2014-1-18 16:19:26

代码、工具,结果三公开。
彻底开源,申请长裤一条。

max 发表于 2014-1-18 16:39:04

谢谢LZ,等我消化下,弄个LINUX下用的,然后开源到这里

sunliezhi 发表于 2014-1-18 17:00:06

Mark!!

lsy5110 发表于 2014-1-18 17:41:44

很强啊{:smile:}

dongwang_fl 发表于 2014-1-18 18:15:52

太强了。。

ibichao 发表于 2014-1-19 11:39:53

好贴留名

william_rain 发表于 2014-1-19 11:59:10

好东西啊!最好在支持多些期间,像stc89c52一类的

richards 发表于 2014-1-19 13:53:36

这个不错 非常不错.

1826772880 发表于 2014-1-19 15:57:14

技术贴,,{:titter:}

20061002838 发表于 2014-1-19 16:01:59

强帖留名

donglaile 发表于 2014-1-19 16:10:25

好厉害,学习一下,谢谢

marshallemon 发表于 2014-1-19 16:53:16

不下载启动参数是啥意思?

ordinary 发表于 2014-1-20 08:24:32

marshallemon 发表于 2014-1-19 16:53
不下载启动参数是啥意思?

下载代码时,不更新ic的启动参数(使用内部、外部时钟选择;上电时延选择;RST脚功能选择等)。
原装的每次下载均会更新启动参数,有时会误选。

toptrying 发表于 2014-1-20 08:45:26

学习一下,谢谢

shi_90 发表于 2014-1-20 14:18:22

不错呀!好东西呀!!!

powermeter 发表于 2014-1-20 14:28:16

lz叫wj,泄露了。{:smile:}

justdomyself 发表于 2014-1-20 14:53:41

用什么语言写的?

wkman 发表于 2014-1-20 15:49:34

{:shocked:}好强大,能支持全系列isp就更牛了{:lol:}

ordinary 发表于 2014-1-20 17:55:37

justdomyself 发表于 2014-1-20 14:53
用什么语言写的?

delphi(pascal)

ordinary 发表于 2014-1-20 18:01:14

wkman 发表于 2014-1-20 15:49
好强大,能支持全系列isp就更牛了

编写的目的不是彻底替换STC原装的下载软件,支持STC全系列ISP意义不大。
主要是想实现更新程序和自己的上位机程序集成化,显得专业点。
另就是分析清其下载协议可以实现离线下载,在系统自动更新程序。

cmheia 发表于 2014-1-20 18:01:57

终于有人放出来了,好强大

lyp103 发表于 2014-1-20 18:06:53

呵呵 楼主厉害,这个要好好收藏

devcang 发表于 2014-1-21 10:30:03

Delphi,like it

thanks!

macp 发表于 2014-1-21 14:43:24

强烈围观!

ordinary 发表于 2014-1-22 09:19:17

修正下载大代码出现错误的问题
(计算代码大小是出现问题)

ordinary 发表于 2014-1-22 09:21:40

公布修正后的源代码

mezw6936 发表于 2014-1-22 17:52:13

不错!顶!

fengxifeng 发表于 2014-1-22 19:31:34

楼主好强大!这个都可以弄出来!

dtdzlujian 发表于 2014-2-4 01:36:08

厉害 支持LZ

kkey 发表于 2014-2-8 03:38:20

支持!!新固件版本的可以吗?

hefanghua 发表于 2014-2-8 09:17:53

此贴必火,MARK。LZ造福大家了。

wooz 发表于 2014-2-8 20:19:01

楼主这个分享得好,
在自己开发项目上很有用

mfkfjtg 发表于 2014-7-8 14:43:40

楼主这个分享得好

wkman 发表于 2014-7-8 15:25:46

{:shocked:}{:victory:}{:lol:}做成全系列下载的?

ordinary 发表于 2014-8-8 09:26:22

wkman 发表于 2014-7-8 15:25
做成全系列下载的?

STC15F\W的官网已公开了下载代码。
支持全系列的意义不大,自己也不具备测试条件。

dongjiren2012 发表于 2014-8-9 09:24:43

太棒了,这是怎么弄的呢

toptrying 发表于 2014-8-9 10:09:19

楼主好人

LZ19992005 发表于 2014-8-9 20:29:42

下载学习下~~~~~

痞子_雄 发表于 2014-8-9 20:34:45

MARK!下载下来用用。

alfredc 发表于 2014-9-15 06:12:37

老大厉害。长期潜水员要加油了 ,努力升级

别有洞天下 发表于 2014-9-15 10:38:44

楼主厉害啊,分享出来学习下

TZQ95865 发表于 2014-9-18 21:53:55

用VB写的吗

ordinary 发表于 2014-9-18 23:17:38

TZQ95865 发表于 2014-9-18 21:53
用VB写的吗

delphi



TZQ95865 发表于 2014-9-19 11:34:20

delphi网上介绍说比VB好

liuruoshui 发表于 2014-9-19 11:57:39

好贴!~!~

yanmylbh 发表于 2014-9-23 11:52:39

00000000000000000000000000000000000000000000000

TZQ95865 发表于 2014-9-24 13:34:28

yanmylbh 发表于 2014-9-23 11:52
00000000000000000000000000000000000000000000000

注意规则 怕封id{:cry:}

yanmylbh 发表于 2014-9-24 13:39:53

TZQ95865 发表于 2014-9-24 13:34
注意规则 怕封id

哦哦,没注意看,现在看见了

bi大痣 发表于 2014-9-24 14:32:33

先mark一下!虽然已不用STC了!

xwkm 发表于 2014-9-29 01:42:33

记得我以前搞过个kstcisp。。。

两个嘴巴笑110 发表于 2014-10-1 21:34:53

LZ很牛B啊。下载下来看看,好东西一定要收藏啊。

千年明月 发表于 2014-10-1 22:01:42

厉害,支持楼主

waymcu 发表于 2014-10-1 22:17:04

stc 下载协议MARK

xCamel 发表于 2014-10-1 23:08:35

楼主好强大,收藏了

Vampireyifeng 发表于 2014-10-20 23:21:12

谢谢分享

bjdfdh271006 发表于 2014-10-22 05:56:08

很好很强大

Samzzt 发表于 2014-10-22 19:50:19

ordinary 发表于 2014-1-18 16:05
整理的协议,取之论坛,还之论坛

说得好,饮水思源!

hxdma 发表于 2014-10-22 20:03:51

围观高手。

hellohaitong 发表于 2014-10-25 15:04:56

楼主真是牛啊

qd118118 发表于 2014-10-25 15:41:06

搞的这么细,真是牛人啊

sdf159372008 发表于 2014-10-25 16:20:30

好像好厉害的样子。不过需要继续加油啊。最好还能设置下参数啥的……

xinfa190 发表于 2014-10-25 16:35:37

标记,手机上不方便下载

哼嘿哈嘿哈 发表于 2014-12-22 18:10:04

顶楼主 一直在找此方面资料

hzyyl2008 发表于 2014-12-25 23:04:29

一直想写个带序列号、下载次数可控的远程下载软件,借鉴一下

Krise@pasion 发表于 2014-12-25 23:22:45

围观了。

LK9286 发表于 2014-12-26 16:05:52

收藏了,谢了

Vampireyifeng 发表于 2014-12-26 16:12:11

王健?是做机器人的那个王健吗?

redchina 发表于 2014-12-27 06:04:39


收藏了,谢了

315936392 发表于 2014-12-27 14:05:48

挺牛的 好奇下载协议哪里看到的?

llh1234 发表于 2014-12-27 14:07:38



mark……

uud001 发表于 2014-12-27 14:44:38

这个要收藏一下,谢谢楼主{:lol:}

flash3g 发表于 2015-1-1 00:47:19

/*---------------------------------------------------------------------*/
/* --- 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,
};

mcu5i51 发表于 2015-1-9 13:55:16

收藏,可能会用到

7nian 发表于 2015-1-9 17:22:32

收藏,有时间慢慢消化

tanek 发表于 2015-1-9 17:26:18

楼主好牛逼

jlhgold 发表于 2015-1-17 20:46:00

ordinary 发表于 2014-8-8 09:26
STC15F\W的官网已公开了下载代码。
支持全系列的意义不大,自己也不具备测试条件。 ...

有么?没找到啊!

zzh4933 发表于 2016-5-20 10:45:49

多谢,不错。{:lol:}{:lol:}{:lol:}{:lol:}{:lol:}

changshs 发表于 2016-5-20 19:33:10

楼主强大!~{:victory:}{:victory:}{:victory:}
学习下!~
谢谢!~
页: [1]
查看完整版本: 自己编的STC12C5A60S2 6.2I版本的下载工具