51单片机-宏晶STC程序调试、烧录、硬仿真

2023-05-16

内容包括STC单片机内部硬件介绍(寄存器)与程序的调试、硬仿真,STC15F硬仿真及其错误处理,MCS-51仿真介绍,全自动下载介绍等。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易!

目录:

一、硬件描述

1、简介

2、寄存器

1)定时器Timer   2)辅助功能寄存器AUXR   3)中断寄存器

3、串口通信

4、程序下载

1)手动下载    2)全自动下载

二、程序描述

1、中断号

2、intrins.h文件

3、关于xdata、code

4、bit、sbit、bdata以及sfr特殊功能寄存器

1)bit和sbit都是C51扩展的变量类型   2)bit位标量   3)sfr特殊功能寄存器

4)sbit 可定义可位寻址对象   5)sbit可录址位   6)bdata

5、读取MCU ID程序

三、Keil编译软件的使用汇总

四、程序调试与硬仿真

1、通过串口查看内部变量

1)前言   2)通过STC-ISP查看数据   3)通过USB转TTL查看数据 

2、STC15F硬仿真相关操作

1)管脚排布

2)仿真使用方法

(1)安装Keil版本的仿真驱动   (2)在Keil中创建项目   (3)项目设置,选择STC仿真驱动

(4)创建仿真芯片   (5)开始仿真   (6)硬件仿真显示支持新增的寄存器SFR

3、STC15F硬仿真使用

1)Keil软件硬仿真   2)切换串口位置

4、对非仿真芯片的处理

5、STC15F硬仿真问题总结

1)显示Connect to target system lost

6、MCS-51仿真相关介绍

五、STC-IP自定义加密下载

1、生成并保存新的密钥

2、对代码文件加密

3、将用户密钥更新到目标芯片中

4、加密更新用户代码

5、打包成一个项目

-----------------------------------------------------------------------------------------------------------------

一、硬件描述

1、简介

STC单片机内部集成MAX810专用复位电路。4路PWM、8路高速10位A/D 转换,针对电机控制,强干扰场合。

本文涉及到的硬仿真以IAP15F2K61S2作说明,STC15硬仿真系列包含STC15F4K60S4系列、STC15F2K60S2系列、STC15F1K28AD系列、STC15F412AD系列、STC15F204AD系列、STC15F204SW系列、STC15F104S系列以及STC15F104W系,不包含STC15F204EA系列与STC15F104E系列。官方网站:http://www.stcmcudata.com/。

-----------------------------------------------------------

2、寄存器

1)定时器Timer

PCA(可编程计数器阵列Programmable Counter Array)模块可再实现4个16位定时器,提供增强的定时器功能,与标准8051计数器/定时器相比,它需要较少的CPU干预。IAP15F2K61S2单片机的定时器向下兼容STC12C5608AD。

TCON与TMOD寄存器:

定时时间计算:

也可以使用单片机小精灵,软件延时时间更准。

链接:https://pan.baidu.com/s/1KgH_IQV6YgyJTrLIgIecjQ 
提取码:1234
​​​​​​​

--------------------------------

2)辅助功能寄存器AUXR

--------------------------------

3)中断寄存器

-----------------------------------------------------------

3、串口通信

-----------------------------------------------------------

4、程序下载

1)手动下载

STC_ISP下载软件问题汇总与解决

--------------------------------

2)全自动下载

(1)概述

STC单片机的ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序。详细介绍移步“STC_ISP下载软件问题汇总与解决”。

对于STC单片机下载程序时,每次都需要冷启动,即需要给开发板断电然后重新上电,才能完成下载,这里介绍用过的两种“全自动下载”方式:

①使用STC自动下载器,此模块在我们点击STC-ISP的“下载”时,会自动完成断电、上电、下载功能。但需要购买。

②软件复位法,即IAP下载方式。注意有的芯片无此功能,需要较新出来的芯片,这里以STC15W401AS-35I-TSSOP20为例说明。

整个过程不断电,也不需要操作复位按钮,下载过程不需要触碰硬件,可大大降低开发时间。

-----------------

(2)测试代码

https://download.csdn.net/download/liht_1634/87267988

-----------------

(3)操作步骤

①添加STC公司的MCU到Keil软件

②新建工程后设置

选择STC MCU Database后,选择STC15W408AS,后创建并加载.c文件,设置生成hex文件。

③首次使用

这里第一次先手动启动下载一次,然后发现LED被点亮。保持上电状态。

④修改下载设置

⑤自动下载实验准备

main函数中的

OUT_CONTROL=0;

修改为

OUT_CONTROL=1;

⑥编译程序后

等待3S,发现LED灯变化了,说明STC-ISP软件已经自动下载了程序,而没有经过手动的重新上电。并且以上的程序,只需要手动下载一次,以后无论下载多少次都不用手动去启动开关下载

-----------------------------------------------------------------------------------------------------------------

二、程序描述

1、中断号

中断查询次序号就是中断号,例如:

void  Int0_Routine(void) interrupt 0;

void  Timer0_Routine(void) interrupt 1;

void  Int1_Routine(void) interrupt 2;

void  Timer1_Routine(void) interrupt 3;

void  UART1_Routine(void) interrupt 4;

void  ADC_Routine(void) interrupt 5;

void  LVD_Routine(void) interrupt 6;

void  PCA_Routine(void) interrupt 7;

void  UART2_Routine(void) interrupt 8;

void  SPI_Routine(void) interrupt 9;

void  Int2_Routine(void) interrupt 10;

void  Int3_Routine(void) interrupt 11;

void  Timer2_Routine(void) interrupt 12;

void  Int4_Routine(void) interrupt 16;

void  S3_Routine(void) interrupt 17;

void  S4_SPI_Routine(void) interrupt 18;

void  Timer3_Routine(void) interrupt 19;

void  Timer4_Routine(void) interrupt 20;

-----------------------------------------------------------

2、intrins.h文件

一般出现在C51单片机编程中,程序中需要使用到空指令_nop_();字符循环移位指令_crol_;整数循环_irol_ _testbit测试并清零位(相当于8051 JBC 指令)等时使用。

-----------------------------------------------------------

3、关于xdata、code

Flash相对单片机里的RAM属于外部存取器,虽其结构位置装在单片机中,其实xdata是放在相对RAM的外面,而flash正是相对RAM外面。

int a 变量定义在内部RAM中,

xdata int a 定义在外部RAM或Flash中,uchar code a 定义在Flash中。

uchar code duma[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; 

//共阴的数码管段选,P2口要取的数值

若定义 uchar aa[5],aa[5]中的内容是存放在数据存储区(RAM)中的,在程序运行工程中各个数组元素的值可以被修改,掉电后aa[5]中的数据无法保存。

若定义 uchar code bb[5]中的内容是存放在程序存储区(如Flash)中的,只有在烧写程序时,才能改变bb[5]中的各元素的值,在程序运行工程中无法修改,并且掉电后bb[5]中的数据不消失。

-----------------------------------------------------------

4、bit、sbit、bdata以及sfr特殊功能寄存器

1)bit和sbit都是C51扩展的变量类型

bit和int char之类的差不多,只不过char=8位, bit=1位而已。都是变量,编译器在编译过程中分配地址。除非你指定,否则这个地址是随机的。这个地址是整个可寻址空间,RAM+FLASH+扩展空间。bit只有0和1两种值,意义有点像Windows下VC中的BOOL。

sbit是对应可位寻址空间的一个位,可位寻址区:20H~2FH。一旦用了sbi xxx = REGE^6这样的定义,这个sbit量就确定地址了。sbit大部分是用在寄存器中的,方便对寄存器的某位进行操作的。

--------------------------------

2)bit位标量

bit位标量是C51编译器的一种扩充数据类型,利用它可定义一个位标量,但不能定义位指针,也不能定义位数组。它的值是一个二进制位,不是0就是1,类似一些高级语言中的Boolean类型中的True和False。

--------------------------------

3)sfr特殊功能寄存器

sfr也是一种扩充数据类型,点用一个内存单元,值域为0~255。利用它可以访问51单片机内部的所有特殊功能寄存器。如用sfr P1 = 0x90这一句定P1为P1端口在片内的寄存器,在后面的语句中我们用以用P1 = 255(对P1端口的所有引脚置高电平)之类的语句来操作特殊功能寄存器。

sfr P1 = 0x90; //定义P1 I/O 口,其地址90H

sfr 关键定后面是一个要定义的名字,可任意选取,但要符合标识符的命名规则,名字最好有一定的含义如P1 口可以用P1 为名,这样程序会变的好读好多.等号后面必须是常数,不允许有带运算符的表达式,而且该常数必须在特殊功能寄存器的地址范围之内(80H-FFH)。

sfr 是定义8 位的特殊功能寄存器而sfr16 则是用来定义16 位特殊功能寄存器,如8052 的T2 定时器,可以定义为:

sfr16 T2 = 0xCC; //这里定义8052 定时器2,地址为T2L=CCH,T2H=CDH

用sfr16 定义16 位特殊功能寄存器时,等号后面是它的低位地址,高位地址一定要位于物理低位地址之上.注意的是不能用于定时器0和1 的定义。

sfr是KEIL中用来定义硬件寄存器地址的关键字,具有定义硬件特性。举个例子:
sfr P0 =0x80
(C语言,这样就定义了51系列MCU中0x80地址,在编程时可以用P0符号代替地址0x80,具有定义硬件特性)

--------------------------------

4)sbit 可定义可位寻址对象

如访问特殊功能寄存器中的某位.其实这样应用是经常要用的,如要访问P1 口中的第2 个引脚P1.1.我们可以照以下的方法去定义:

(1)sbit 位变量名=位地址

sbit P1_1 = 0x91;

这样是把位的绝对地址赋给位变量.同sfr 一样sbit 的位地址必须位于80H-FFH 之间.

(2)sbit 位变量名=特殊功能寄存器名^位位置

sft P1 = 0x90;

sbit P1_1 = P1 ^ 1; //先定义一个特殊功能寄存器名再指定位变量名所在的位置,当可寻址位位于特殊功能寄存器中时可采用这种方法

(3)sbit 位变量名=字节地址^位位置

sbit P1_1 = 0x90 ^ 1;

这种方法其实和2 是一样的,只是把特殊功能寄存器的位址直接用常数表示. 在C51存储器类型中提供有一个bdata 的存储器类型,这个是指可位寻址的数据存储器,位于单片机的可位寻址区中,可以将要求可位录址的数据定义为bdata,如:

unsigned char bdata ib; //在可位录址区定义ucsigned char 类型的变量ib

int bdata ab[2]; //在可位寻址区定义数组ab[2],这些也称为可寻址位对象

sbit ib7=ib^7 //用关键字sbit 定义位变量来独立访问可寻址位对象的其中一位

sbit ab12=ab[1]^12;

操作符"^"后面的位位置的最大值取决于指定的基址类型,char0-7,int0-15,long0-31.sfr 并标准C 语言的关键字,而是Keil 为能直接访问80C51 中的SFR 而提供了一个新的关键词,其用法是:

sfrt 变量名=地址值。

符号P1_0 来表示P1.0 引脚。在C 语言里,如果直接写P1.0,C 编译器并不能识别,而且P1.0 也不是一个合法的C语言变量名,所以得给它另起一个名字,这里起的名为P1_0,可是P1_0 是不是就是P1.0呢?你这么认为,C 编译器可不这么认为,所以必须给它们建立联系,这里使用了Keil C的关键字sbit 来定义,sbit 的用法有三种:

第一种方法:sbit 位变量名=地址值

第二种方法:sbit 位变量名=SFR 名称^变量位地址值

第三种方法:sbit 位变量名=SFR 地址值^变量位地址值

如定义PSW 中的OV 可以用以下三种方法:

sbit OV=0xd2   1说明:0xd2 是OV 的位地址值

sbit OV=PSW^2  2说明:其中PSW 必须先用sfr 定义好

sbit OV=0xD0^2 3说明:0xD0 就是PSW 的地址值

因此这里用sfr P1_0=P1^0;就是定义用符号P1_0 来表示P1.0 引脚,如果你愿意也可以起P10 一类的名字,只要下面程序中也随之更改就行了。

--------------------------------

4)sfr16 16位特殊功能寄存器

sfr16占用两个内存单元,值域为0~65535。sfr16和sfr一样用于操作特殊功能寄存器,所不同的是它用于操作占两个字节的寄存器,如定时器T0和T1。

--------------------------------

5)sbit可录址位

sbit同位是C51中的一种扩充数据类型,利用它可以访问芯片内部的RAM中的可寻址位或特殊功能寄存器中的可寻址位。如先前我们定义了

sfr P1 = 0x90; //因P1端口的寄存器是可位寻址的,所以我们可以定义

sbit P1_1 = P1^1; //P1_1为P1中的P1.1引脚

//同样我们可以用P1.1的地址去写,如sbit P1_1 = 0x91;

这样我们在以后的程序语句中就可以用P1_1来对P1.1引脚进行读写操作了。通常这些可以直接使用系统提供的预处理文件,里面已定义好各特殊功能寄存器的简单名字,直接引用可以省去一点时间,我自己是一直用的。当然您也可以自己写自己的定义文件,用您认为好记的名字。

--------------------------------

6)bdata

将变量定义在可位寻址片内数据存储区,允许位与字节混合访问。

-----------------------------------------------------------

5、读取MCU ID程序

STC MCU都具有唯一的MCU ID号,一般保存在RAM的0xF1-F7区域,对于15系列,同时会保存在ROM的最后7个字节中。因此,可以通过字符指针,获取MCU ID值,用于程序的加密。

// 读取 STCMCU 的唯一性ID的例程
#define ID_ADDR_RAM 0xF1 //ID号的存放在RAM区的地址为0F1H
#define ID_ADDR_ROM 0x0FF9 //4K程序空间的MCU(如STC15F204EA, STC15F104EA)

unsigned char UID[8];
#define RAMID 0
#define ROMID 1
char *GetMCUID(unsigned char nType);

char *GetMCUID(unsigned char nType)  //获取 MCU ID
{
    unsigned char idata *iptr;
    unsigned char code *cptr;
    unsigned char i;
    unsigned char bb[8];
   
    if (nType == RAMID) 
    {
        iptr = ID_ADDR_RAM; //从RAM区读取ID号
        for (i=0; i小于7; i++) 
        {//读7个字节
            UID[i] =*iptr++;      
            sprintf(bb, "%02x",(int)UID[i]); //Keil C51中,若想得到正确的2字符十六进制数输出,必须使用(int)形式做转换
            SendStr(bb);
        }
    }
    else 
    {
        cptr = ID_ADDR_ROM; //从程序区读取ID号
        for (i=0; i小于7; i++)
        {//读7个字节
            UID[i] =*cptr++; 
            sprintf(bb, "%02X",(int)UID[i]);
            SendStr(bb);
        }
    }
    UID[7]=0;
    return UID;
}

-----------------------------------------------------------------------------------------------------------------

三、Keil编译软件的使用汇总

-----------------------------------------------------------------------------------------------------------------

四、程序调试与硬仿真

1、通过串口查看内部变量

1)前言

STC低档单片机没有硬仿真功能,可以通过串口发送至上位机电脑。在无仿真的环境下,查看程序的执行情况,比如程序执行到哪、变量的值等。串口问题参见通信-RS232、RS485、RS422。

--------------------------------

2)通过STC-ISP查看数据

(1)操作环境

12MHz晶振,USB转RS232串口线连接一个STC下载线,再连接ISP下载器,如下图所示。​​​​​​​

(2)电脑接收数据错误

ISP下载程序没有异常,所示说整个连接与电路应该没有问题。但是在单片机发送数据到串口调试类软件时数据不对,仔细查看程序未发现有异常。

可以查看Voltage[ ]数组的数据

最后锁定晶振12MHz-->11.0592MHz即可。

波特率计算如下图,也可计算定时器定时初值。

程序下载完成后,自动打开串口查看数据。

--------------------------------
3)通过USB转TTL查看数据
由于上述STC-ISP已经停产,被U8W替代,但它不能传送数据。这里可使用“六合一多功能USB转UART串口模块(CP2102 USB、TTL、485互转232)”,某宝搜索购买,驱动程序移步https://download.csdn.net/download/liht_1634/85117979下载或搜索我的百度网盘“CP210x_VCP_Windows”。这里是将USB转RS232,RS232(TTL电平)连接单片机。
STC12C5608AD(28Pin)单片机通过上述波特率计算,11.0592MHz、TL1=TH1=0xFD,得波特率9600。
但在STC-ISP下载软件中波特率需设置4800才能正常接收数据,如下图。

测试例程移步“https://download.csdn.net/download/liht_1634/85077630”。

-----------------------------------------------------------

2、STC15F硬仿真相关操作

1)管脚排布

其管脚排布按AT89C51,如下图。

--------------------------------

2)仿真使用方法

详见“STC仿真器使用指南(教程)”,如下所述。

(1)安装Keil版本的仿真驱动

如上图,首先选择“Keil仿真设置”页面,点击“添加MCU型号到Keil中”,在出现的如下的目录选择窗口中,定位到Keil的安装目录(一般可能为“C:\Keil\”),“确定”后出现下图中右边所示的提示信息,表示安装成功。添加头文件的同时也会安装STC的Monitor51仿真驱动STCMON51.DLL,驱动与头文件的的安装目录如上图所示。

--------------------------------
(2)在Keil中创建项目
若第一步的驱动安装成功,则在Keil中新建项目时选择芯片型号时,便会有“STC MCU Database”的选择项,如下图

然后从列表中选择响应的MCU型号,此处我们在此选择“STC15F2K60S2”的型号(实际需使用IAP15F2K61S2或IAP15L2K61S2等),点击“确定”完成选择

添加源代码文件到项目中,如下图:

保存项目,若编译无误,则可以进行下面的项目设置了。
附加说明一点:
当创建的是C语言项目,且有将启动文件“STARTUP.A51”添加到项目中时,里面有一个命名为“IDATALEN”的宏定义,它是用来定义IDATA大小的一个宏,默认值是128,即十六进制的80H,同时它也是启动文件中需要初始化为0的IDATA的大小。所以当IDATA定义为80H,那么STARTUP.A51里面的代码则会将IDATA的00-7F的RAM初始化为0;同样若将IDATA定义为0FFH,则会将IDATA的00-FF的RAM初始化为0。

虽然STC15F2K60S2系列的单片机的IDATA大小为256字节(00-7F的DATA和80H-FFH的IDATA),但由于STC15F2K60S2在RAM的最后17个字节有写入ID号以及相关的测试参数,若用户在程序中需要使用这一部分数据,则一定不要将IDATALEN定义为256。
--------------------------------
(3)项目设置,选择STC仿真驱动

如上图,首先进入到项目的设置页面,选择“Debug”设置页,第2步选择右侧的硬件仿真“Use …”,第3步,在仿真驱动下拉列表中选择“STC Monitor-51 Driver”项,然后点击“Settings”按钮,进入下面的设置画面,对串口的端口号和波特率进行设置,波特率一般选择115200或者57600。到此设置便完成了。

--------------------------------

(4)创建仿真芯片

准备一颗IAP15F2K61S2或IAP15L2K61S2芯片,并通过下载板连接到电脑的串口,然后如上图,选择正确的芯片型号,然后进入到“Keil仿真设置”页面,在单片机无外加电源的前提下,点击“将所选目标单片机设置为仿真芯片”按钮,当程序下载完成后仿真器便制作完成了,如下图。

注:在未修改程序的前提下,只需创建1次即可,断电仍然有效(重上电后不能运行,在Keil中运行)由于每次创建仿真芯片时间较长,故修改程序后,先下载/编程测试,若不正常再作仿真。

--------------------------------
(5)开始仿真
将制作完成的仿真芯片通过串口与电脑相连接。
将前面我们所创建的项目编译至没有错误后,按“Ctrl+F5”开始调试。
若硬件连接无误的话,将会进入到类似于下面的调试界面,并在命令输出窗口显示当前的仿真驱动版本号和当前仿真监控代码固件的版本号断点设置的个数目前最大允许20个(理论上可设置任意个,但是断点设置得过多会影响调试的速度)。

--------------------------------

6)硬件仿真显示支持新增的寄存器SFR

-----------------------------------------------------------

3、STC15F硬仿真使用

1)Keil软件硬仿真

Keil软件打开STC-ISP烧录的程序,上面的操作无误的情况下,就可以正式硬仿真了。先打断点,再全速仿真。

--------------------------------

2)切换串口位置

注意:仿真不占用串口,只是占用了P3.0、P3.1两个引脚而已。若需仿真时,仍然使用串口1,只需要在串口初始化代码中把串口1切换到P1.6、P1.7引脚(必须使用内部时钟)或P3.6、P3.7引脚即可。

仿真时USB转串口芯片用CH340, 连接到P3.0、P3.1引脚,然后代码设置串口1挪到P1.6、P1.7, 连接PL2303与PC通信。在STC-ISP中可以很容易区分CH340与PL2303串口号,如下图,这样就做到了CH340仿真与PL2303传数据至电脑(比如协议测试)共存。

-----------------------------------------------------------

4、对非仿真芯片的处理

比如实际项目使用STC12C5608AD(28Pin)。为方便程序移植,将IAP15F2K60S2.h头文件中不同的地方修改成STC12C5608AD.h中的定义。如下图所示,将ADC_RES-->ADC_DATA(ADC转换结果高8位)、ADC_RESL-->ADC_LOW2(ADC转换结果低2位)。

中断优先级不要改,可能会引起不能进定时器中断之现象。

图4.1.1

-----------------------------------------------------------

5、STC15F硬仿真问题总结

1)显示Connect to target system lost

图5.1.1

①用户不可访问仿真系统区的0DC00-0F3FFH区域的6K代码空间(STC8系列仿真器用户可任意访问用户的64K代码空间)。

②用户不能修改仿真监控程序所使用的XDATA区域。

③用户不能向P3.0口、P3.1口写数据。

④用户不能使用与P3.0、P3.1相关的中断和功能(包括INT4中断、定时器2时钟输出、定时器2外部计数)。

⑤若仿真源代码为汇编程序,则第一条语句必须是长跳转语句,不能使用JMP、SJMP、AJMP或其它语句(STC8系列仿真器的用户代码不受限制)。

⑥对于IAP15F2K60S2来说,一般来说都是操作了串口端即P3.0、P3.1或未创建仿真芯片。

注:不能使用USB转串口线连接RS232再由SP3232EEN等芯片转TTL电平给单片机,也不能通过基于CP2102多功能USB转UART串口模块,其经过的转换步骤应尽可能的少,否则即使能够创建仿真芯片,但连接Keil失败,如图5.1.1所示。只通过1片CH340T,将USB转TTL电平连接单片机,可参看“STC_ISP下载软件问题汇总与解决之四、STC系列ISP下载编程工具与一键下载电路3、一键下载电路”或“单片机3种烧录方式解析之三、相关总结3、STM32自动ISP、RS232通信”。

Keil硬仿真单步执行极容易出现连接目标丢失。

咨询宏晶FAE,上述1)、2)、3)、4)必须满足,另外注意干扰。

对于干扰,对方称输入市电经隔离,使用示波器(设备或仪器及使用之二、生产与测试设备及使用6)示波器和数字电桥)的接地端连接线路板地

-----------------------------------------------------------

6、MCS-51仿真相关介绍

Keil自带的一个很古老的技术Monitor-51,单片机需要预先写入监控程序,占用一个串口。可以实现运行、停止、单步、断点、查看变量等功能。停止是通过PC发数据使单片机进入串口中断程序,从而打断用户程序运行。运行是退出串口ISR,恢复用户程序运行。断点是通过修改用户程序断点位置的指令,跑飞至监控程序运行。单步运行同理。

Keil原版的Monitor-51,用户程序是在外扩RAM里运行的,非常便于修改,但掉电就丢失了。后来一家叫SST的公司,推出的51单片机具有IAP功能,就是程序可以自己改写Flash内容。SST将Monitor-51改造,用户程序也可以放在Flash中,直接一片单片机就可以仿真,不需要专用硬件,但每加一个断点,单步每走一步,都要擦写Flash,所以速度慢一些,对Flash寿命也有影响。
这一时期出现了很多简易的51仿真器,都是基于SST这一方案做的。再后来,STC横空出世,终于一统全宇宙,独霸51单片机。
但因为STC单片机内部没有仿真部件,要想仿真,还是采用了监控程序的方案,基本照搬SST的Monitor-51。

现代的单片机一般集成仿真部件,不占用单片机运行资源,例如ARM、STM8、C8051F等。
单片机内部仿真部分通过特定接口与调试主机通讯,例如JTAG、SWD、SWIM等,这种单片机使用的所谓仿真器其实是一个接口协议转换器,例如JLink、STLink等,就是USB-JTAG-SWD接口转换,实际仿真功能是在单片机内部实现。

早期51比较功能完整的仿真器是采用专用仿真芯片(南京伟福、长沙菊阳微,设备见“
设备或仪器及使用之一、电路设计的仪器及使用6、伟福仿真器(类似产品长沙菊阳微)”),仿真时用专用仿真芯片替代目标芯片,调试完成后再换回正式芯片,适合DIP封装(SMD封装通过相应的座转接)使用芯片插座的场合,现在已不多见。简单的OTP单片机也是采用这种仿真技术。

在MCS-51单片机中,高端Silicon的C8051F,其次Winbond的1T与4T以及Dallas的1T与4T,STC在国内使用较广泛。

-----------------------------------------------------------------------------------------------------------------

五、STC-IP自定义加密下载 

目前,所有的普通串口下载烧录编程都是采用明码通信的(电脑和目标芯片通信时,或脱机下载板和目标芯片通信时),问题: 如果烧录人员通过分析下载烧录编程时串口通信的数据,高手是可以在烧录时在串口上引2根线出来,通过分析串口通信的数据分析出实际的用户程序代码的。当然用STC的脱机下载板烧程序总比用电脑烧程序强。即使是STC全球首创的脱机下载工具,对于要防止天才的不法分子在脱机下载工具烧录的过程中通过分析串口通信的数据分析出实际的用户程序代码,也是没有办法达到要求的,这就需要用到最新的STC15系列单片机所提供的自定义加密下载功能。
自定义加密下载是用户先将程序代码通过自己的一套专用密钥进行加密,然后将加密后的代码再通过串口下载,此时下载传输的是加密文件,通过串口分析出来的是加密后的乱码,如不通过派人潜入你公司盗窃你电脑里面的加密密钥,就无任何价值,便可起到防止在烧录程序时被烧录人员通过监测串口分析出代码的目的。自定义加密下载功能的使用需要如下的几个步骤。

 -----------------------------------------------------------
1、生成并保存新的密钥
如下图,进入到“自定义加密下载”页面,点击“生成新密钥”按钮,即可在缓冲区显示新生成的256字节的密钥。然后点击“保存密钥”按钮,即可将生成的新密钥保存为以“.K”为扩展名的的密钥文件(注意:这个密钥文件一定要保存好,以后发布的代码文件都需要使用这个密钥加密,而且这个密钥的生成是非重复的,即任何时候都不可能生成两个完全相同的密钥,所以一旦密钥文件丢失将无法重新获得), 例如我们将密钥保存为“New.k”。

 -----------------------------------------------------------
2、对代码文件加密
加密文件前,需要先打开我们自己的密钥。若缓冲区中存放的已经是我们的密钥,则不要再打开。如下图,在“自定义加密下载”页面中点击“打开密钥”按钮,打开我们之前保存的密钥文件,例如“New.k”。


然后返回到“自定义加密下载”页面中点击“加密代码”按钮,如下图所示,首先会弹出“打开源文件(未加密)”的对话框,此时选择的是原始的未加密的代码文件


点击打开按钮后,马上有会弹出一个类似的对话框,但此时是对加密后的文件进行保存的对话框。如下图所示,点击保存按钮即可保存加密后的文件。


-----------------------------------------------------------
3、将用户密钥更新到目标芯片中
更新密钥前,需要先打开我们自己的密钥。若缓冲区中存放的已经是我们的密钥,则不要再打开。如下图,在“自定义加密下载”页面中点击“打开密钥”按钮,打开我们之前保存的密钥文件,例如“New.k”。

密钥打开后,如下图所示,勾选上“下载用户代码前先更新用户密钥”选项和“本次下载的代码为加密代码”的选项,然后打开我们之前加密过后的文件,打开后点击界面左下角的“下载/编程”按钮,按正常方式对目标芯片下载完成即可更新用户密钥。


-----------------------------------------------------------
4、加密更新用户代码
密钥更新成功后,目标芯片便具有接收加密代码并还原的功能。此时若需要再次升级/更新代码,则只需要参考第二步的方法,将目标代码进行加密,然后如下图。

首先在“自定义加密下载”页面中选择“本次下载的代码为加密代码”的选项(“下载用户代码前先更新用户密钥”选项不需要选了),然后打开我们之前加过密后的文件,打开后点击界面左下角的“下载/编程”按钮,按正常方式对目标芯片下载即可完成用用户自己专用的加密文件更新用户代码的目的(防止在烧录程序时被烧录人员通过监测串口分析出代码的目的)。

注意:此功能仅对如下系列及新出的单片机有效。
    STC8xx系列
    STC15xx系列 (不包括STC15F204EA)
    IAP15xx系列

引自:https://www.stcisp.com/stc-ice-ver2-chinese_a1_zdyjmxz.html。

-----------------------------------------------------------
5、打包成一个项目

打包后的代码升级工具提供给用户:

此时用户看不到hex文件,但可以下载程序至单片机。

-----------------------------------------------------------------------------------------------------------------

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机-宏晶STC程序调试、烧录、硬仿真 的相关文章

  • 树莓派VNC界面不显示或显示不全问题_解决方案

    刚开始上手树莓派的小伙伴们估计都遇到过这一问题 xff0c 用树莓派登录VNC时 xff0c 界面不显示或者界面显示的比例有问题 先打开VNC xff0c 输入自己的IP地址 xff0c 登录VNC 我这里在登录VNC时 xff0c VNC
  • ArcGIS Engine:对COM组件的调用返回了错误HRESULT E_FAIL

    最近做一个项目 xff0c 需要调用GP的 通视性 工具 该工具在ARCScene中界面如下 xff1a 需要两个参数 xff08 必选 xff09 xff0c 即视线和障碍物 xff0c 在 帮助 中查看要求参数都是FeatureLaye
  • idea 2019.3之后的版本的项目使用gradle构建,编译时会出现中文乱码

    目录 背景1 修改gradle编译选项2 修改idea设置3 其他方法 xff08 尝试后没有效果 xff09 3 1 修改File Encdoing3 2 修改idea的custom VM option 背景 把公司电脑的idea更新到了
  • shell编程3循环语句

    文章目录 shell编程3循环语句1 for循环1 1 基本格式1 2 类C语言格式 2 while循环2 1 基本格式2 2 死循环 3 until循环4 跳出循环4 1 continue4 2 break 5 实验5 1 编写脚本实现计
  • ArduPilot飞控之ubuntu22.04-Gazebo模拟

    ArduPilot飞控之ubuntu22 04 Gazebo模拟 1 源由2 Gazebo安装2 1 ubuntu22 04系统更新2 2 安装Gazebo Garden2 3 安装ArduPilot Gazebo插件2 3 1 基础库安装
  • ArduPilot飞控之DIY-F450计划

    ArduPilot飞控之DIY F450计划 1 历史2 源由3 计划3 1 硬件3 2 软件 4 动手4 1 接线4 1 1 ELRS nano接收机4 1 2 BN880 GPS模块4 1 3 Radio Telemetry 4 2 配
  • ArduPilot Kakute F7 AIO DIYF450 without GPS配置

    ArduPilot Kakute F7 AIO DIYF450 without GPS配置 1 源由2 配置2 1 Kakute F7 AIO相关配置2 1 1 串口规划2 1 2 电传配置2 1 3 GPS配置2 1 4 CRSF接收机配
  • ArduPilot之posHold&RTL实测

    ArduPilot之posHold amp RTL实测 1 源由2 模式配置3 测试步骤4 飞行实测5 总结6 参考资料7 附录 关于QGC 暂不支持MAVLink2 signing Protocol问题7 1 问题描述7 2 硬件配置7
  • BetaFlight统一硬件配置文件研读之resource命令

    BetaFlight统一硬件配置文件研读之resource命令 1 源由2 代码分析3 实例分析4 配置情况4 1 resource4 2 resource show 5 参考资料 统一硬件配置文件的设计是一种非常好的设计模式 xff0c
  • ArduPilot之开源代码UARTs and the Console使用

    ArduPilot之开源代码UARTs and the Console使用 1 源由2 UART定义2 1 HAL Empty2 2 HAL ChibiOS2 3 HAL ESP322 4 HAL Linux2 5 HAL SITL 3 配
  • ArduPilot之开源代码调试技巧

    ArduPilot之开源代码调试技巧 1 源由2 ArduPilot Code Debugging Part13 ArduPilot Code Debugging Part24 持续更新中 5 参考资料 1 源由 对于如何调试和验证Ardu
  • ArduPilot飞控启动&运行过程简介

    ArduPilot飞控启动 amp 运行过程简介 1 源由2 Copter飞控2 1 入口2 3 运行 main loop 3 Ardunio编程3 1 setup AP Vehicle setup3 2 loop AP Vehicle l
  • WIN7 64位系统 CDC类 虚拟串口驱动无法安装的解决办法

    最近用STM32装个USB转虚拟串口 xff0c 但是驱动怎么也安装不上 百度了一些网页 xff0c 方法很多 xff0c 但是我这里按如下步骤处理 xff1a 首先 xff0c 确保C Windows System32 drivers u
  • ubuntu桌面版打开终端Terminal的几种方法

    1 Ctrl 43 Alt 43 T 快捷键直接打开 2 在Ubuntu左上角选择File Open in Terminal 3 快捷键alt 43 F2调出Run a Command xff0c 输入gnome terminal 4 添加
  • 什么是对称加密(对称加密简介)

    什么是对称加密 1 什么是对称加密2 编码3 加密算法3 1 DES3 1 1 什么是DES3 1 2 加密和解密 4 3DES4 3 1 什么是3DES4 3 2 3DES加密解密 5 AES5 1 什么是AES5 2 AES加密解密 1
  • Linux应用程序之Helloworld入门

    对于初学者来说 xff08 本人就是 xff09 xff0c 如何开始写第一个程序至关重要 有的时候一个简单的问题会严重影响到学习的积极性和自信心 这里结合实际工作中的一些经验 xff0c 总结方法步骤 xff0c 对Linux下应用程序H
  • ctags简明使用方法

    ctags xff08 Generate tag files for source code xff09 是vim下方便代码阅读的工具 xff0c 它可以在命令行下帮助程序员很容易地浏览源代码 ctags 最先是用来生成C代码的tags文件
  • char和unsigned char强制转换成int后的差异

    最近有人提到char和unsigned char有什么区别 xff0c 当然这个问题如果刚学计算机或者编程语言的人来说 xff0c 非常简单 我也这么认为 xff0c 无非就是有符号和无符号的差别嘛 这个问题让我想到了以前学习计算机常识的时
  • 如何使用mstsc进行远程登录?

    如何使用mstsc进行远程登录 xff1f 步骤一 xff1a 点击 开始 gt 运行 xff0c 输入mstsc xff0c 如下图所示 xff1a 步骤二 xff1a 输入连接PC的IP地址 xff0c 如下图所示 xff1a 步骤三
  • VNC远程ubuntu时,右击无法打开terminal

    参考博客 xff1a https blog csdn net qq 44132116 article details 103960393 问题描述 xff1a 我通过命令行连接实验室服务器 xff0c 装了anaconda xff0c 之后

随机推荐

  • TCP实时传图像

    目的 xff1a QT 43 openCV xff0c 在Ubuntu16 04版本下 xff0c 通过TCP实现图片的传输 步骤 xff1a 客户端建一个相机线程 xff0c 一个TCP线程 xff0c 相机线程捕获画面并将Mat传到TC
  • Ubuntu mate 16.04安装ROS

    官方文档有详细的安装步骤 xff1a http wiki ros org kinetic Installation Ubuntu 配置Ubuntu属性如下 xff1a https help ubuntu com community Repo
  • 关于ROS中的namespace

    当我们给发布的消息起名字时 xff0c 注意 34 points image 34 和 34 points image 34 是不一样的 xff0c 前者表示这个话题的名字是一个绝对名称 xff0c 它不在任何的namespace中 xff
  • 算法移植arm开发板小结(一)

    将windows的c c 43 43 代码移植到友善Tinny4412的arm上运行 首先要先将windows代码在ubuntu系统下编译通过 xff0c 然后在ubuntu系统下建立Tinny4412的arm交叉编译器 xff0c 并将代
  • CVTE嵌入式软件实习面经-已offer

    面试通过 时间线 4月份投的简历 xff0c 后面因为考试错过了 xff0c 后面月尾赶上最后了最后一场笔试 xff0c 笔试完四天左右通过 xff0c 通过两天后接到面试官电话 xff0c 那时候投了挺多公司的 xff0c 以为是其他的
  • 非对称加密详解

    非对称加密 1 非对称加密1 1 什么是非对称加密1 2 非对称加密通信流程1 3 RSA1 3 1 RSA加密1 3 2 RSA解密1 3 3 总结 1 4 ECC椭圆曲线 1 非对称加密 1 1 什么是非对称加密 非对称加密也叫公钥密码
  • PHP函数usort()解释

    定义和用法 usort 函数使用用户自定义的函数对数组排序 注释 xff1a 如果两个元素比较结果相同 xff0c 则它们在排序后的数组中的顺序未经定义 到 PHP 4 0 6 之前 xff0c 用户自定义函数将保留这些元素的原有顺序 但是
  • strchr()、strrchr()、strchrnul()…

    头文件 xff1a include 函数原型 xff1a char strchr char str int c char strrchr char str int c define GNU SOURCE 头文件 xff1a include
  • freertos- 任务调度器-vTaskStartScheduler()解析(笔记)

    1 全局状态量 系统时钟节拍计数器tick static volatile TickType t xTickCount 61 TickType t 0U 全局下一任务调度需要的阻塞时间 xff0c 用于及其唤醒任务static volati
  • freertos- 重要管理数据结构-列表List及其操作API (笔记)

    1 xff0c 源码中的位置 list h xff0c list c 2 xff0c 列表和列表项结构 列表项分为2种 xff1a struct xLIST ITEM listFIRST LIST ITEM INTEGRITY CHECK
  • 技术分享 | Javaer 如何做单元测试?

    前言 xff1a 本文适用于 javaer xff0c 其他开发者或许可以借鉴 写本文的主旨有两个 xff0c 一是简单的给大家介绍下单元测试 xff0c 二是通过一个简单的示例来介绍一些单元测试的技巧 xff0c 希望以此来降低大家写单元
  • 扩展卡尔曼滤波【转】

    1 重点看 SLAM中的EKF xff0c UKF xff0c PF原理简介 半闲居士 博客园 2 机器人重点看 定位 xff08 一 xff09 xff1a 扩展卡尔曼滤波 windSeS的博客 3 重点实例 扩展卡尔曼滤波 xff08
  • AGV - Background(1)- Company

    Company 米克力美 DZ 80无轨导航AGV小车采用windows10智能交互系统 xff0c xff08 米克力美工业AGV小车机器人采用安卓交互系统 xff09 可自动编程和程序化 xff0c 实现自主学习 使用人员无需培训即可轻
  • 无线路由器CPU浅析 MT7621A、 BCM47189 到底谁强?

    转自 xff1a http bbs 360 cn thread 14459037 1 1 html 在第一讲中 xff0c 已经粗略介绍过了目前路由芯片的四大厂 xff1a Broadcom xff08 博通 xff09 Qualcomm
  • STM32F4_串口通信详解

    目录 1 串口相关介绍及使用 1 1 串口设置的一般步骤 xff1a 1 1 1 串口时钟和GPIO时钟使能 1 1 2 设置引脚复用器映射 1 1 3 GPIO端口模式设置 1 1 4 串口参数初始化 1 1 5 开启中断并且初始化NVI
  • 嵌入式Linux设备驱动开发笔记(二)

    一 内核的时间 xff08 1 xff09 Tick xff08 滴答 xff09 内核采用了一个新的时间单位来进行计时 该时间单位称为tick 滴答 xff0c 一个tick对应硬件定时器两次中断之间的时间间隔 当前内核每秒钟硬件定时器会
  • Docker实现原理/容器原理(LXC,Cgroups,Docker)

    Docker实现原理 容器原理 Docker实现原理 容器原理什么是容器 Container 容器传统架构问题容器是什么容器如何实现 CgroupsCgroups是什么Cgroups解决什么问题Cgroups如何工作Cgroups层级结构
  • ros 编译 Python 文件

    参考自 xff1a http wiki ros org rospy tutorials Tutorials Makefile 系统 xff1a Ubuntu14 04 ros indigo py并不是可编译的脚本文件 xff0c 但是为了适
  • [Emuelec]在gamelist.xml中,为中文游戏名生成拼音字母

    1 通过python脚本将汉字拼音首字母查询出来 usr bin python3 coding UTF 8 filename transPinying py 功能 xff1a 获取传入中文的每个汉字的拼音首字母 pydic 61 34 吖a
  • 51单片机-宏晶STC程序调试、烧录、硬仿真

    内容包括STC单片机内部硬件介绍 xff08 寄存器 xff09 与程序的调试 硬仿真 xff0c STC15F硬仿真及其错误处理 xff0c MCS 51仿真介绍 xff0c 全自动下载介绍等 紫色文字是超链接 xff0c 点击自动跳转至