(转)STC 51单片机烧录协议分析

前段时间买了一个51单片机开发板。买完后发现,这开发板和芯片的厂家都是十分山寨。

芯片产家叫STC,江湖人称“死太惨”,它的中文名字叫“宏晶科技”,官网是:www.stcmcu.com,相信在打开这个网站之后,你就同意我的看法了。如果还不够的话,可以下载它的芯片手册:STC90C516RD+ PDF,或者 烧录软件,体验体验。

开发板的产家叫做普中科技,一个连官方论坛都打不开的神秘企业,谢天谢地,它还是有官网的:www.prechin.com

虽然山寨味浓厚,但是接地气。唯一令人生厌的是其不公开ISP协议,而且芯片还加密。

51单片机



51单片机是Intel在1981年推出的一种8位单片机(MCU),它不仅包含了一个8位CPU,还内置ROM和RAM,还有P0.0~P3.7共32根IO脚。型号叫8051。后来Intel不再生产单片机了,但其他产商则相继推出各种与8051完全兼容的单片机,而且还不断增强功能。

8位CPU已经完全没有技术门槛了,所以现在国内很多产家也都在生产。其零售价格大概4.4块钱。要知道,一块ARM32的单片机价格,也是10块钱以内的。

有了单片机,总要接上各种外设,于是就有了开发板。开发板上有PCB、LED、键盘、步进电机等元件,所以价格就比单片机贵多了。

以下是 8051 CPU 外部接口电路图:

烧录



我买到的型号是 STC90C516RD+,跑程序的流程大概是这样的:

  1. 用C语言或者汇编写源代码。
  2. 用 Keil 编译成hex或者bin文件。
  3. 用USB线连接电脑和开发板,然后用STC或普中科技的烧录软件把文件写入单片机,就可以运行了。

开发板上集成了 CH340T 芯片,将USB转换成串口,连接到单片机,所以电脑和单片机的通信协议是串口。(当然,准确来说,USB和串口都是串行通信)

CH340T 电路图:

hex文件其实是一个文本文件,它有固定的格式,是Intel定的。烧录软件其实会把它转换成bin文件再写入,这一过程是透明的。bin文件就是单片机可执行的二进制代码了。

Keil是个IDE,而且是收费的,只支持Windows。Linux下可以使用sdcc编译。当然,8051的指令相对较少,完全可以自己写一个汇编器。

但是,这里最关键的是,文件是怎么被写入单片机的?对于此,STC是不公开的。于是……

下面直接上研究结果。

ISP协议



STC单片机内部ROM有一段固化的程序,称为ISP程序,是用来支持烧录的。早期8051并无集成此功能,要用专门烧录器实现。

单片机断电状态下通电,称为“冷启动”,此时,CPU会先执行该ISP程序。

这估计是借鉴了PC中BIOS的原理。

ISP程序会去检查串口RXD是否高电平,有合法的下载命令流,如果有,就进入ISP模式;如果没有,就直接跳转到地址0000H执行用户程序。

因此,我们电脑(被称为“上位机”)上的烧录软件,就是要让单片机进入ISP模式,然后将数据发送给它。

重头戏来了

首先,在单片机断电情况下,但串口仍与PC连接时,烧录软件即要打开串口,以 1200/2400/4800 其中之一(建议1200)波特率,不断往串口发 0x7F。

重要参数:波特率1200,停止位1,无校验、数据位为8位。

重要提示:如果波特率高于4800,无法进入ISP模式。

此时,打开开发板电源,单片机冷启动。检测到串口有0x7F,进入ISP模式。并发送类似如下的回复:

68 00 3B 00 16 BA 16 B6 16 B6 16 BA 16 BA 16 BA 16 B6 16 B6 43 43 FD F1 30 82 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 39 16

68 00 是回应标识符。

3B 包的长度。

00 表示这是数据包。

16 BA 16 B6 16 B6 16 BA 16 BA 16 BA 16 B6 16 B6 是8次测量脉宽的数据,可以借此计算出单片机的晶振频率、最大支持波特率。

43 43 表示固件版本是 4.3C。

FD 是单片机选项,每一位都表示一个选项信息:

x x x x x x x x

8 7 6 5 4 3 2 1

1=时钟倍速,1=12T,0=6T

3=需要短接P1.0/P1.1 才能下载 1=关闭,0=开启

4=下次下载擦DATAFLASH,0=开,1=关

5=时钟增益,1=高,0=低

6=ALE脚,0=P4.5,1=ALE

7=允许访问内部AUX RAM,1=允许,0=不允许

8=停止看门狗,1=复位关,0=停电关

倒数第二个字节 39 是校验和。

最后一个字节 16 是包尾固定值。

其他字节对烧录而言暂不需要。

包的格式

我们发的第一个数据0x7F和单片机第一次回应(如上),都不是真正的包,在接下来的通信中,则使用固定的包格式。其格式如下:

包头 + 标识符 + 包长 + 命令 + 数据 + 校验和 + 包尾

包头:2字节,固定为 46 B9。

标识符:2字节,上位机发往单片机的为 6A 00,单片机发往上位机的为 68 00。

包长:1字节,除包头外的长度。

命令:1字节,代表包的类型。

数据:不固定长度。可以无。其长度可由包长计算得出。

校验和:1字节,除包头、校验和本身、包尾外的数据的校验和。

包尾:1字节,固定为 16。

校验和的计算方法

校验和计算方法为 标识符、包长、命令、数据 4个部分的数据,各字节相加,取低8位。

命令类型

00: 数据
80: 确认
82: 关闭
84: 擦除ROM
8D: 设置选项
8E: 确认波特率
8F: 校验波特率
10: 未知
50: 未知

数据包格式

上位机发往单片机的数据即二进制代码文件,它被封装在上述的包:数据一节中,但它本身也是有格式的:

占位符 + 地址 + 长度 + 代码数据

占位符:2字节,固定为 00 00。

地址:2字节,表示代码的地址。

长度:2字节,表示代码的长度。

代码数据:其长度由上面字段指出。

烧录过程总结



上面已经将STC的通信协议格式分析完毕了。需要具体分析的只剩下命令的含义、各个数据的含义了。这些都是后话了。至少关于烧录,上面的信息已经够多了。

  • 首先,单片机断电。烧录程序启动,以1200波特率不断往其串口发送0x7F。然后通电。
  • 收到单片机信息的回复,此回复主要包括脉宽、型号、选项等信息。
  • 由收到的脉宽值,计算出重装值,并发送给单片机。等待约200ms。同时由脉宽值计算出单片机最大支持的波特率,然后切换到某波特率(不得超出最大波特率),等待回应。
  • 如果收到正确的回复,则表示波特率可行,则切换到1200波特率,并发送一个波特率确认的包文。发送完,等待约200ms,然后切换回原来的波特率,等待回应。
  • 如果收到单片机的波特率确认包文,表示到目前为止,一切正常。否则,就算失败。
  • 连续发送约5次重新握手的包文并等待回应。如果收到回应,表示一切正常,可以开始发送代码数据了。否则就是失败。
  • 将代码数据分割成一定大小的包发送并等待正确回应。
  • 设置单片机选项。
  • 发送50包文,等待正确回应。然后发送关闭包文。
  • 关闭串口,结束通信。

STC还支持热启动烧录,就是不用先断电再通电,而是在通电状态下可以直接烧录。看来,ISP程序一直在监听串口。普中科技的“自动下载软件”就是用这种方法烧录的。其技术细节,以后再更新。

注意


在通信过程中,单片机内部的ISP每次都会启动一个定时器,目测大概是2s,一旦通信过程中超时,单片机就会马上终止通信并跳转到0000H处执行用户程序。

时间: 2024-10-18 05:38:33

(转)STC 51单片机烧录协议分析的相关文章

nRF2401无线数据用STC 51单片机实现驱动的程序

nRF2401无线数据用STC 51单片机实现驱动的程序 . 大家知道nRF2401是一款无线数据传输芯片,也非常常用,淘宝上几块一片,大批的卖家,那么 51单片机 驱动nRF2401无线数据程序怎么写呢?下面请参考,希望对大家有帮助.单片机使用的是STC89C52RC,8个LED接在P0口,低电平有效,测试直观.转载:nRF2401无线数据传输试验测试程序 nRF2401无线数据传输试验测试程序,两块同样nRF2401学习板子上演示数据同步,这是从网上转载的.单片机使用的是STC89C52RC

51单片机SPI协议与应用实例

-------------------------------------------- SPI总线 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 参考链接: http://blog.csdn.net/fly__chen/article/detail

STM32GPIO口8种模式细致分析(类比51单片机)

关于STM32GPIO口的8种工作模式,我们先引出一些问题? STM32GPIO口如果既要输入又要输出怎么办? 1.浮空输入模式 上图红色的表示便是浮空输入的过程,外部输入时0读出的就是0,外部输入时1读出的就是1,外部没有输入IO处于阻塞读不出电平状态. 用处:感觉在信号处理方面用的比较好,比如在读取一段一段的波形,可以清晰的知道什么时候是0信号,什么时候是1信号,什么时候是没有信号的. 类比:51单片机找不到类似的输入模式   2.上拉输入 上拉输入和浮空输入的区别是,上拉电阻的开关关闭了,

单片机(simple chip microcomputer)概论、51单片机、MCS-51单片机、STM32、ARM

catalogue 1. 单片机概论 2. 51单片机 3. MCS-51单片机 4. QX-MINI51开发板(STC89C52芯片) 5. STM32单片机 6. stm32f103zet6开发板实验 1. 单片机概论 0x1: 仿真器 单片机应用系统的软硬件调试需要专门的开发工具,称为"单片机开发系统"或"仿真机".常用的开发方式是把开发系统(例如PC)中的CPU和RAM暂时出借给用户系统,利用开发系统对用户系统的软硬件进行调试(又称仿真),然后将调试好的程序

[原创]基于51单片机的红外遥控课程设计

[注]: 一眨眼,大学接近尾声,具有找工作需要,所以把大学做的电子设计“劣作”放上来.希望考研失意,还能赶上“好工作”的春招班车.如果大伙有什么工作推荐也可以联系我哦,因为一年考研少接触了这方面,所以难免有些生疏.但请相信我!给我机会我会很认真学的! 邮箱:[email protected] 转载请注明出处呀! 基于51单片机的红外遥控课程设计 目录 第一章 设计简介... 3 第二章 系统方案... 3 一.设计方案对比... 3 二.方案设计... 4 第三章 硬件设计... 5 一.红外遥

[51单片机] EEPROM 24c02 [I2C代码封装-保存实现流水灯]

这里把EEPROM 24c02封装起来,今后可以直接调用,其连线方式为:SDA-P2.1;SCL-P2.0;WP-VCC >_<:i2c.c 1 /*----------------------------------------------- 2 名称:IIC协议 3 内容:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的修改....(本例是1us机器 4 周期,即晶振频率要小于12MHZ) 5 ---------------------------------------

利用51单片机制作的电子时钟

最近研究起来了单片机,用的是国产STC98C52芯片. STC89C52是STC公司生产的一种低功耗.高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器.STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能.在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活.超有效的解决方案. 买了很长时间了可是一直在那里放着,今天重新拿出来写了一段电子时钟的C++程序,利用充电宝供

51单片机在win10下的开发

/** * SD Yang * 2015-07-30 * http://weibo.com/atCodeMonkey * */ 首先无论你是不是正版系统win7以上的都可以升级到最新的win10系统,实在不行可以用msdn上的镜像安装,然后通过dos命令激活. win10素来以其兼容性著称,也扬言兼容apk等.暂且不管这些,今天来说一下对于刚开始起步学51单片机的同学在win10下的一些问题. 这是我们推荐的开发环境是 keil + stc烧录工具 + 实验板. keil可以正常安装,但是要注意

51单片机的一些知识点

1.单片机芯片型号:STC 89C51RC 40C—PDIP 0707 STC——STC公司,其他前缀还有AT.Winbond等 8——基于8051内核芯片 9——表示内部含有Flash E2PROM存储器 C——表示该器件为CMOS产品 5——固定不变 1——代表芯片内部存储空间,1为4KB,2为8KB,3为12KB RC——STC单片机内部RAM(随机读写存储器)为512B,还有RD+表示内部RAM为1280B 40——表示外部晶振最高可接入40MHz,对于AT单片机数值一般在24MHz C