如何编写STC单片机的ISP协议

发布者:RoboPilot最新更新时间:2011-10-19 关键字:STC单片机  ISP协议 手机看文章 扫描二维码
随时随地手机看文章

     STC单片机包含两个Flash块,在一块Flash中运行的程序可对另一块Flash进行擦除和重新编程.一般都将ISP程序存放在容量较小的一块Flash中(Block1),而将用户代码存放在容量较大的一块Flash中(Block0).Block1中的ISP程序对Block0中的用户代码进行擦除和重新编程. 在做STC单片机解密或是使用的朋友都知道,在STC单片机的程序存储区后,还有一段大约3K的代码,这段代码就是STC单片机的ISP程序,在STC单片机的数据手册里有关于对于ISP的生机资料,既然这段代码是可以升级的,那么我们就可以肯定这个区域是可以改写的,呵呵,这些涉及到了对STC单片机软解密的技术,我不多提了,大家可以动用自己的智慧。

     下面为大家提供一些自己设计STC ISP协议的资料。许多应用系统中都需要进行程序代码升级,如果程序代码在外部Flash存储器中,实现程序代码升级可以对外部Flash直接操作.但对于在单片机内部的一些系统程序代码,就要求此单片机支持IAP(In-Application-Programming)功能.本文即介绍此情况下的ISP(In-System-Programming)程序设计方法,以及在SST和STC单片机上的具体实现.
      1  ISP实现基本结构
        ISP的实现方式有很多种,但大致都遵循图1所示流程.
          

      图1
        其中,判断用户ISP选择,一般有以下几种方式.
      (1)  连接计算机系统,由系统的命令选择
        进入用户ISP选择判断时,先由单片机发送特定特征数据,然后等待命令数据,如果在一定的时间内,接收到计算机系统发出的选择命令则进入用户代码升级,否则直接跳转到用户代码执行.
      (2)  由用户板上的跳线选择
        一般利用单片机空余的端口,设计一个代码升级选择跳线.进入用户ISP选择判断时,单片机可以直接根据此端口的状态判断进入用户代码升级还是直接跳转到用户代码执行.
      (3)  由用户板操作功能选择
        在用户板的功能菜单或功能组合中,允许用户选择代码升级功能,同时,在外部存储器中存放相应的标志.当选择代码升级功能时,在外部存储器中写入特定数据,然后程序复位.进入用户ISP选择判断时,判断外部存储器中的数据,如果符合条件则进入用户代码升级,否则直接跳转到用户代码执行.
      2  IAP程序设计
        目前,许多单片机都支持IAP功能,一般这些单片机内部都包含两个Flash块,在一块Flash中运行的程序可对另一块Flash进行擦除和重新编程.一般都将ISP程序存放在容量较小的一块Flash中(Block1),而将用户代码存放在容量较大的一块Flash中(Block0).Block1中的ISP程序对Block0中的用户代码进行擦除和重新编程. 
        下面以两种51系列兼容的Flash单片机为例,介绍IAP的程序设计.一种是SST89C54,另一种是STC89C516RD.
      (1)  SST89C54相关特性
        SST89C54内部有20KB(16KB+4KB)程序存储器,统一编址.Block0为0000H~3FFFH;Block1为F000H~FFFFH.Block1可以选择映射到0000H地址开始的1KB/2KB/4KB程序区.
      (2)  STC89C516RD相关特性
        SST89C516RD内部有72KB(64KB+8KB)程序存储器.Block0为0000H~FFFFH,Block1可以选择映射到0000H地址开始的8KB程序区(上电复位缺省为地址映射).
        SST与STC单片机的IAP操作几乎完全相同,本刊网站(www.dpj.com.cn)中给出了IAP函数的C程序源代码IAP.C.要特别注意的是,Block0_erase函数中对于block0的选择,两种单片机是不同的(正好相反).
      3  ISP程序到用户代码的切换
        在设计中一般都将ISP程序设计为上电复位后运行的程序,如果不需要用户代码升级或升级完成后,就要将程序切换到用户代码执行.ISP程序到用户代码的切换,不同的单片机各不相同.
      (1)  SST89C54程序区Block1到Block0的切换实现
        SST89C54单片机在烧录时,将ISP程序写到Block1,并且烧录映射选择位RB0/RB1(RE-MAP[1:0]).这样程序上电复位时,自动将Block1映射到0000H地址开始的4KB程序区,进入ISP程序执行.由于Block1同时还分配在地址F000H~FFFFH,因此,编译生成ISP程序代码时,设定所有的地址范围都在F000H~FFFFH.需要切换到用户代码(Block0)运行时,修改SFCF[7]控制位VIS,将Block1的0000H地址映射取消,然后程序跳转到地址0000H执行,则开始运行Block0中的用户代码程序.
        本刊网站中给出了ISP的C程序源代码ISP.C.需要注意的是,此程序在Keil-C中要建立工程文件,包含
      IAP.C函数以及STARTUP.A51,并且在IAP.C和ISP.C中都要去掉STC的定义.为了将地址范围设定到F000H~FFFFH,要将STARTUP.A51中程序入口地址由0改为0F000H,如下:
      CSEG AT 0F000H
      ?C_STARTUP: LJMP STARTUP1
         还要修改编译选项设置Target选项卡中Off-chip Code memory:Start
      =0xF000;Size=0x1000;还要设置C51选项卡中Interrupt Vectors at address:0xF000.
      (2)  STC89C516RD程序区Block1到Block0的切换实现
        STC89C516RD单片机在烧录时,将ISP程序写到Block1.(注意:并不烧录SC0/SC1位).单片机上电复位时,缺省的Block1映射到0000H地址开始的8KB程序区,进入ISP程序执行.需要切换到用户代码(Block0)运行时,ISP修改SFCF[1]控制位SWR,产生一个软复位(Software
      Reset).由于SC0和SC1都未烧录,程序软复位后,Block1将不再映射到0000H地址映,则开始运行Block0中的用户代码程序.
        本刊网站中给出了ISP的C程序源代码ISP.C.要注意的是:此程序在Keil-C中要建立工程文件,包含IAP.C函数,并且在IAP.C和ISP.C中都要保留STC的定义.
      4  与计算机的通信协议
        升级用户代码时,需要与计算机进行通信,一般采用RS232串行通信,数据协议采用简单协议.此协议参考了ADuC812单片机的ISP数据协议.(ADuC812单片机硬件内置ISP程序).
      (1)  复位命令(计算机→单片机)
        计算机发送4字节复位命令:21H,5AH,00H,A6H,单片机返回复位信息.
      (2)  复位信息(单片机→计算机)
        复位信息为25字节,前3字节为单片机公司特征字符(如:“ADI”“SST”“STC”),最后1字节为校验和.
      (3)  数据包格式(计算机→单片机)
        计算机发送数据包格式:07H、0EH、长度、数据、校验和(长度与数据的校验和).
      (4)  擦除命令
        计算机发送数据包,其中数据只有1字节,内容为:字符“A”或“C”.单片机擦除用户程序区后返回1字节06H表示成功;05H表示失败.
      (5)  编程命令
        计算机发送数据包,其中数据内容:“W”,00H,地址高字节,地址低字节,程序数据.单片机返回1字节06H表示成功;05H表示失败.
      (6)  运行用户程序
        计算机发送数据包,其中数据只有1字节,内容为:字符“U”.单片机返回1字节06H表示成功,然后跳转到用户程序运行.
        本刊网站提供了计算机下载软件的C程序源代码Download.C.
      结语
        根据以上ISP程序设计思路和实例,大家可以修改ISP初始代码,或者丰富它的ISP功能(读功能、口令控制等),尝试设计自己的ISP程序,定能为自己的系统增色不少.

关键字:STC单片机  ISP协议 引用地址:如何编写STC单片机的ISP协议

上一篇:基于ATmega16单片机的干式变压器智能温度控制器设计
下一篇:基于SPE61A单片机的非接触式高压试电笔的设计

推荐阅读最新更新时间:2024-03-16 12:44

基于STC单片机的铁路信号半自动闭塞光缆传输器设计
半自动闭塞铁路线在我国大量存在,而用于两个车站之间接一发列车的闭塞信息有正负脉冲2种信息来完成,传输闭塞信息的传输介质为架空明线或光缆。由于明线或者电缆故障而导致铁路运输中断的现象时有发生,并且一旦明线或者电缆故障后恢复起来较为复杂,通常情况下,恢复的时间在6~10 h左右,这也大大降低了区间半自动闭塞的单线铁路的运输能力。并且随着技术进步及新科技的广泛应用,光缆的应用越来越普遍,大多数铁路车站之间的传输通道已经实现了光纤传输。 信号半自动闭塞光缆传输器用于64D单线半自动闭塞的区间信号传输,其作用是代替原有的电缆或者明线传输,将原有的模拟信号转变为数字信号进行传输,可以实现传输通道的冗余备份,对传输通道进行实时监测,如果
[单片机]
基于<font color='red'>STC单片机</font>的铁路信号半自动闭塞光缆传输器设计
基于STC单片机的LED智能照明系统
   1 引言   LED被称为第四代照明光源或绿色光源,LED的发光器件是冷光源,具有节能、环保、寿命长、体积小等特点。白炽灯,卤钨灯的光效为12~24lm/W,荧光灯50~70lm/W,钠灯90~140lm/W,而且大部分的耗电变成了热耗。LED可达到50~200lm/W,而且单光的单色性好,光谱窄,无需过滤,可直接发出有色可见光。在相同照明效果的情况下,耗电量约为白炽灯的十分之一,荧光灯的二分之一。同样效果的一支日光灯40多瓦,而采用LED每支的功率只有8瓦。LED的平均寿命达10万小时,安全可靠性强,不含汞,钠元素等可能危害健康的物质,有利于环保,被称为“绿色照明光源”。   2 智能照明控制方案设计
[单片机]
基于<font color='red'>STC单片机</font>的LED智能照明系统
有关STC单片机发热、复位的问题
最近有个项目,需要一个继电器,接收到低电平就动作,用的STC15W104、使用的市面上的开关电源5V/3A. 本来看似简单到底的一个东西,却花费了将近3天的时间搞定。 1.现象一 产品是1U机箱 内部一个ARM主板,需要定时硬重启一次。暂且叫STC控制板,控制板在不带载的情况下,触发正常,与程序很符合,但是带载后,第一次触发正常,第二次单片机就开始发烫,能到80多度,然后直接冒烟,这个现象100%会出现,控制板的继电器没有使用隔离。 解决办法: 在5V电源处并了一个1000UF的大电容。曾尝试并5.1V稳压管,发现不顶用。 2.现象二 板子会误动作,尤其是周围有人,或者是工作一段时间,或者是开关963电
[单片机]
STC单片机流水灯新花样程序
ORG 000H;设置起始地址 START: MOV A,#0FFH;向A寄存器中载入十六进制数0FFH D2: SUBB A,#1;A寄存器中数据减一 call DE ;调入延时程序(修改延时时间可以实现水滴效果) MOV R1,A;将寄存器A中数据传送给R1 MOV P1,R1;输出(外接8个LED,共阳极接法,低电平有效) DJNZ R1,D2;检测R2是否为零,否则跳到D2处继续执行 JMP
[单片机]
STC单片机硬件PWM的使用分析
STC单片机(具有PCA功能的),怎么实现可变频率的PWM输出?很多朋友还在使用定时器做可变频PWM, 这里我就介绍怎么使用硬件PWM,在定时器0的分频基数下设计PWM。 首先看CMOD这个寄存器,这里我们主要关注 CPS0,CPS1,CPS2,这三个位控制选择PCA的计数脉冲源。 对应PWM功能,则是选择频率。 首先可以选择 6个固定分频,可以看图片看出,分别是1,2,4,6,8,12的系统分频。我们需要做可变频率的PWM,所以我们需要选择模式2,选择定时器0的溢出作为系统分频基数。 然后,我么看怎么具体的去计算,去实现分频。 这里就需要上面这个图片的计算规则。 这里我举一个例子来说明,比如我们单片机的晶振使用的是12MH
[单片机]
<font color='red'>STC单片机</font>硬件PWM的使用分析
STC单片机控制DS1302 (1TMCU C程序)
#include REG51.H #include INTRINS.H typedef unsigned char BYTE; sbit SCLK = P1^0; //DS1302时钟口P1.0 sbit IO = P1^1; //DS1302数据口P1.1 sbit RST = P1^2; //DS1302片选口P1.2 //秒 分 时 日 月 星期 年 BYTE code init = {0x00, 0x00, 0x20, 0x01, 0x01, 0x05, 0x10}; BYTE data now ; void DS1302_In
[单片机]
STC单片机PWM程序设计与应用
/*============================================================== at12c2052所带的PWM功能演示,内部公用了一个定时器,当启动PWM时PCA 定时器只工作在8位模式,匹配比较器也是按8位的。本程序演示了PWM启动 的设置和调节。 改用在tasking c51下面编译,并尝试了tasking 方便的在线汇编方式 ===============================================================*/ #include STC12C2052AD.h /*#include INTRINS.h */ #define uint
[单片机]
STC单片机+DM134实现LED多段控制
单片机源程序如下: //============================================================================ //================翼芯科技 LED流星灯8段16段==软件生成生成数据================= //============================================================================ // 此源码版权属 翼芯科技 全权享有,如欲引用,敬请署名并告知 // 严禁随意用于商业目的,违者必究,后果自负 //程序说明:本程序用于实现LED流星灯8段16
[单片机]
<font color='red'>STC单片机</font>+DM134实现LED多段控制
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved