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程序调试、烧录、硬仿真 的相关文章

  • 程序员必须掌握的十种算法---二分查找算法

    二分查找算法核心代码简单 xff0c 但需要数组是经过排序的 span class hljs variable arr span 要查找的数组 span class hljs variable length span 数组的长度 span
  • 笔试题:在一个字符串中查找子字符串的个数

    题目 xff1a 在一个字符串中查找子字符串的个数 要求 xff1a 两个字符串之间以空格隔开 xff0c 前一个为字符串 xff0c 后一个为要查找的子字符串 结果输出字符串中包含的子字符串的个数 例如 xff1a 输入 xff1a ab
  • 笔试题:输入一串数字,以逗号隔开,将数字排序后输出

    题目 xff1a 输入一串数字 xff0c 以逗号隔开 xff0c 将数字排序后输出 具体要求 xff1a 如果有几个数字是连续的 xff0c 只输出最大的和最小的数字 例如 xff1a 输入 xff1a 1 xff0c 4 xff0c 6
  • C语言-函数指针

    1 函数指针 函数原型 xff1a span class hljs keyword int span span class hljs keyword sum span span class hljs keyword int span a s
  • C语言应用小技巧

    1 求字符串长度 span class hljs preprocessor include lt stdlib h gt span size t span class hljs built in strlen span span class
  • C和指针-编程练习

    第六章 1 查找source字符串中匹配chars字符串中任何字符的第一个字符 xff0c 函数返回一个指向source中第1个匹配所找到的位置的指针 如果source中的所有字符均不匹配 xff0c 返回NULL指针 如果任何一个参数为N
  • Bootloader和BIOS、uboot和grub和bootmgr的区别

    版权声明 xff1a 本文章参考了 Bootloader和BIOS Grub uboot概念 未经作者允许 xff0c 严禁用于商业出版 xff0c 否则追究法律责任 网络转载请注明出处 xff0c 这是对原创者的起码的尊重 xff01 x
  • 医学影像常用名词:

    医学影像处理 xff1a MPR xff1a Multiplanarreconstruction allows images to be created from the original axial plane ineither the
  • MsOS——概述

    自己接触的操作系统也有不少了 xff0c 如RT Thread Cos等 xff0c 这些实时操作系统基本的思想就是围绕任务的调度 更像是一个软件平台 xff0c 提供使用者丰富的软件资源 RT Thread是比较成功的应用于消费类产品的国
  • Pixhawk室内自动控制:参数设置

    Pixhawk室内自动控制 xff1a 参数设置 本文针对使用光流传感器和超声波传感器 xff08 或激光雷达 xff09 的Pixhawk用户 ArduCopter目前 xff08 3 52 xff09 已经能够使用光流传感器提供的位置信
  • python函数--capitalize()方法

    capitalize 方法 描述 Python capitalize 将字符串的第一个字母变成大写 其他字母变小写 语法 capitalize 方法语法 xff1a str capitalize 参数 无 返回值 该方法返回一个首字母大写的
  • c# 接口

    1 接口的特点 接口的定义是指定一组函数成员而不实现成员的引用类型 xff0c 其它类型和接口可以继承接口 定义还是很好理解的 xff0c 但是没有反映特点 xff0c 接口主要有以下特点 xff1a span class token pu
  • 在linux上增加swap交换空间

    在虚拟机里面安装oracle11g grid时 发现之前分配的swap交换空间不满足oracke gi安装的最低要求 xff0c 因为我分配的物理内存是8G xff0c 那么就按照要求需要8 12G的swap交换空间 xff0c 而我分配的
  • Elasticsearch7.6.1安装报错及解决过程

    Windows环境Elasticsearch7 6 1安装报错及解决过程 Elasticsearch是一个基于Lucene的搜索服务器 第一次安装ES7 6 1 xff0c 过程中遇到了一些报错 xff0c 把解决方法列出来 xff0c 总
  • 我的 Ubuntu 装机必备软件

    文章目录 我的 Ubuntu 装机必备软件Ubuntu的安装u盘制作添加中科大镜像源NVIDIA显卡驱动的安装卸载旧显卡驱动 安装sogou输入法下载安装配置 安装gitROS kinetic installationgoogle chro
  • GCC源码分析(十三) — 机器描述文件

    版权声明 xff1a 本文为CSDN博主 ashimida 64 的原创文章 xff0c 遵循CC 4 0 BY SA版权协议 xff0c 转载请附上原文出处链接及本声明 原文链接 xff1a https blog csdn net lid
  • VNC登录报错too many security failures解决方法

    桌面进程编号为1 xff0c 可以通过使用 sudo vncserver kill 1 sudo vncserver 1 杀掉并重启解决
  • tensorflow模型保存、读取与可训练参数提取

    一 保存 读取说明 我们创建好模型之后需要保存模型 xff0c 以方便后续对模型的读取与调用 xff0c 保存模型我们可能有下面三种需求 xff1a 1 只保存模型权重参数 xff1b 2 同时保存模型图结构与权重参数 xff1b 3 在训
  • pytorch------cpu与gpu load时相互转化 torch.load(map_location=)

    将gpu改为cpu时 xff0c 遇到一个报错 xff1a RuntimeError Attempting to deserialize object on a CUDA device but torch cuda is available
  • 优化OpenCV视频的读取速度

    我们使用Opencv读取视频时 xff0c 常规的做法是使用read 函数逐帧读取 xff0c 如 code import cv2 cap 61 cv2 VideoCapture 34 test mp4 34 while True read

随机推荐

  • 图像信噪比SNR求解

    xff08 xff08 通常也采用图像信号与噪声的方差之比来近似估计图像的信噪比 xff09 xff09 利用OpenCV计算灰度图像的峰值信噪比 xff08 PSNR xff09 计算两灰度图像之间的峰值信噪比 cpp view plai
  • Jetson TX1启动自带的摄像头

    最近在使用NVIDIA的Jetson TX1开发板 xff0c 并对开发板上自带的摄像头进行了测试 xff0c 下面将测试过程中所使用的一些指令做一些记录 xff0c 在终端上输入 xff1a nvgstcapture 1 0即可打开板子上
  • 判断用new申请内存是否成功

    c 43 43 申请大的内存空间 xff08 如何判断失败 xff09 我想用new申请一个特别大的空间 xff08 多大都可以 xff09 xff0c 主要是我不能判断到底是成功还是失败 假如我这样写 int p i 61 new int
  • 图像对比度计算

    matlab中求解方式 xff1a 计算图像对比度 方法一 xff1a 中心像素灰度值与周围4近邻像素灰度值之差的平方之和 xff0c 除以以上平方项的个数 functioncg 61 duibidu4 f f为输入图像 xff0c cg为
  • 图片占内存容量计算公式

    1 图片占内存容量计算公式为 xff1a 图片所占内存大小 61 图片长度 xff08 像素 xff09 图片宽度 xff08 像素 xff09 一个像素所占内存空间 xff08 单位 xff1a 字节 xff09 一般地 xff0c 一个
  • OpenCV学习:fastAtan2函数解密

    OpenCV学习 xff1a fastAtan2函数解密 高中数学中各种正弦函数 xff0c 余弦函数总是把人搞得头大 xff0c 但是具体应用时你会发现 xff0c 其实你只需要搞清楚一个2 空间内函数分布即可 下面分析OpenCV中fa
  • ubuntu 下安装NVIDIA显卡驱动出现X service error问题解决方法

    34 You appear to be running an X server 34 的解决方法 xff1a 在安装过程中出现了这个问题 xff0c 我在刚刚看到的教程 xff08 http wenku baidu com link url
  • 移动硬盘提示磁盘结构损坏且无法读取怎么办

    移动硬盘出现 磁盘结构损坏且无法读取 xff0c 1 突然关机 xff1b 2 硬盘没有正常通过系统卸载 xff1b 3 病毒破坏 xff1b 4 有可能是usb供电不足 xff1b 5 也可能是文件丢失 xff1b 6 还可能是盘片损坏
  • windows下pycharm中安装和使用tensorflow

    配置 xff1a win7 43 cuda8 0 43 vs2015 43 cudnn6 0 43 python3 5 43 tensorflow1 4 43 pycharm 大体思路是 xff1a 先安装vs2015 再将cudnn6 0
  • 程序员常用网站

    1J2me 开发网 http www j2medev com bbs index asp 2J2me 社区 http www j2meforums com forum 3csdn http www csdn net 4Vc 知识库 http
  • MATLAB加速技巧

    1 向量化 目的 xff1a 减少for循环的使用 96 nonVecl m clear all tic A 61 0 0 000001 10 B 61 0 0 000001 10 Z 61 zeros size A y 61 0 for
  • Linux 开启VNCSERVER

    一般 xff0c 通过ssh来远程连接linux服务器 xff0c 进行命令操作 但是没有图形化界面确实有些不太方便 xff0c 因此可以通过ssh来启动vnc ssh和vncserver以及vnc软件的安装这里就不再介绍 首先 xff0c
  • 从输入URL到网页显示,期间发生了什么(详解)

    从输入URL到网页显示 xff0c 期间都发生了什么 解析URL操作系统协议栈TCP封装IP封装MAC封装 网卡交换机路由器到达服务器 Internet上的每一个网页都具有一个唯一的名称标识 xff0c 通常称之为URL xff08 Uni
  • KuberSphere安装harbor的配置文件解读

    span class token comment 这个配置文件 xff0c 其实就是上面部分是harbor配置 xff0c 下面都是自定义的配置需要的镜像配置 span span class token comment 综合下来 xff0c
  • SLAM综述阅读笔记六:基于图像语义的SLAM调研:移动机器人自主导航面向应用的解决方案 2020

    转自 论文阅读 A survey of image semantics based visual simultaneous localization and mapping 语义视觉SLAM综述 知乎 A survey of image s
  • keil5怎么打开keil4工程,以及keil5怎么打包成keil4工程

    如何用keil5打开keil4工程 在keil5的环境下 xff0c 打开keil4的工程文件 xff0c 会弹出下图所示窗口 xff1a 一般选择第二种方法 xff1a Install Legacy Support 下载keil4的支持包
  • window 下docker Desktop 安装更新wsl 2

    报错描述 我们安装Docker Desktop的时候 他会问我们是否需要使用WSL2 基于Windows的Linux子系统 如果我们不适用 就会使用Hyper v虚拟机运行 不过相比于虚拟机 子系统在性能方面更加出色 在我们选择使用WSL2
  • GNU sed 多行合并成一行

    只适用于GNU 的sed工具 xff08 linux版本 xff09 xff0c 其他版本的不兼容 mac下可以使用brew intsall gsed 安装gnu sed 比如 xff1a 每2行合并成一行 sed n 39 1h 1 H
  • centos7防火墙(firewalld、iptables)

    一 firewalld和iptables netfilter iptables是集成在linux2 4 x版本内核中的包过滤防火墙系统 该框架可以实现数据包过滤 xff0c 网络地址转换以及数据包管理功能 linux中的防火墙系统包括两个部
  • 51单片机-宏晶STC程序调试、烧录、硬仿真

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