这个版别的协议和曾经已经有了比较大的改动,包含包头等等。可是STC有一个千年不变的敞开帧:0x7F,在STC15系列的MCU,依然使用着这个ISP的敞开帧。原因我不说我们也理解。
那么进入主题:STC12系列下载的帧格局:
协议帧简介:首要构成如下
Head |
Sign |
Reserved |
Length |
Frame |
Data |
Checksum |
Trail |
各个填充区具体阐明:
称号 |
长度 |
功用 |
Head |
2-Byte |
包头 (0×46,0xB9) |
Sign |
1-Byte |
标识 (0x6A或0×68) |
Reserved |
1-Byte |
预留区 (填充0×00) |
Length |
1-Byte |
(Head + Length + Frame+Da |
Frame |
1-Byte |
用以区别不同的帧 |
Da |
0~0x8A Bytes |
数据 |
Checksum |
2 Byte |
校验和 |
Trail |
1 Byte |
包尾 (0×16) |
至于Cmd的协议应对之类的:
指令 阐明 MCU回应
7F 引导MCU进入ISP并丈量时钟 50 MCU选项信息
50 设置MCU类型等 8F 应对
8F 新波特率测验 8F 测验应对
8E 正式修正波特率 84 修正波特率应对
84 文件容量,擦除芯片 00 应对
00 下载程序 00/30 应对校验和,成功或失利
30 从头下载程序 00/30 应对校验和
69 类型等 8D 应对
8D 设置选项 50 应对选项
82 退出 重启进用户程序
至于交互进程,也算是简略的,便是看你的设备反应速度了。这便是为什么某些PL2303线下载老犯错的原因,不过我这儿至少用的挺好。
PC ->0x7f ->MCU
MCU ->信息 ->PC
PC -> 核对?MCU类型 -> MCU
MCU ->波特率改变恳求 ->PC
PC ->波特率测验 ->MCU[此刻,核算重载值切换波特率】
MCU ->成功/无回应 -> PC
PC ->波特率设置 ->MCU [切换到最低波特率上去
MCU ->成功/无回应 ->PC [切换到数据波特率上去
PC -> 擦除芯片 -> MCU
MCU ->成功/无回应 ->PC
PC -> 0x80个字节数据 ->MCU
MCU -> 校验码 ->PC
循环到文件完毕
PC ->设置?类型 ->MCU
MCU ->成功/无回应 -> PC
PC ->设置选项 ->MCU
MCU ->成功/无回应 -> PC
PC ->编程完毕 ->MCU
校验和算法是将标识到数据区的内容通通加起来,取低十六位,看程序:
01 | PUBL%&&&&&% FUNCTION CheckSum(buff ASString, start ASInteger, endchr ASInteger) ASString回来两个字 |
02 | DIM i ASInteger |
03 | DIM chkSum ASLong |
04 | DIM lo ASByte |
05 | DIM hi ASByte |
06 | DIM tempStr ASString |
07 | chksum = 0 |
08 | FOR i = start TO endchr |
09 | chksum = chksum + Asc(Mid(buff, i, 1)) |
10 | NEXT |
11 | hi = Shr(chksum AND &HFF00, 8) |
12 | lo = chksum AND &H00FF |
13 | tempStr = Chr(hi) & Chr(lo) |
14 | RETURN tempStr |
15 | END |
关于STC12C5Ax系列的信息帧,这儿有一张他人剖析的图:
至于固件版别我这儿测验的有:
1 | 6.6I : 66 49 |
2 | 6.2I : 62 49 |
关于晶振速度的核算:
如果是规范12M时钟,1200Kps波特率,则计数值为1/1200*7 = 5833uS,数值也为5833。将八次技能求均匀(假设为18 94=6292),则此刻单片机时钟频率=6292*12M/5833 = 12.994MHz。