最新日志

发表于:2007-12-2 20:07:37
标签:PIC  编程器  

1

自制PIC单片机编程器[转载]

自制PIC单片机编程器

欢迎来到这里,我觉得这款编程器的声望完全归功于jens madsem.当你完全沉浸在这东西的时候,你可能发现这个编程器可能是最有用的东西。总之,这里有电路图和一些技巧,是我自己做一个编程器时摘录的。

点击看大图

当你完成这款编程器制作以后,当然要找一些芯片来试一试啦,而下面的芯片的编程对这款编程器来说都支持的。PIC12C5XX,12C67X,24CXX,16C55X,16C62X,16C71,16C71X,16C8X,16F8X.

站长为了方便看,自己由画了一张图,如下:

点击看大图

印刷电路板图在这里,请参考:(电路板中红线为跳线)

点击看大图

对应的变成软件在这里可以下载:下载DOS版本的点击这里zip,下载WINDOWS版本的点击这里zip

注意:这款编程器跟电脑连接是采用25针串口的,假如你没有,可以采用9针的串口,但是接线当然需要一些改动,具体如下:
25针串口对9针串口
2------3
7------5
5------8
20-----4
4------7
现在你就可以马上做一个编程器啦

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(1) | 阅读(1017)
发表于:2007-12-1 10:18:53
标签:DS1302汇编程序  

1

ds1302汇编程序

以下是我的DS1302汇编程序

;*********************************************************************/
T_RST Bit P3.3 ;实时时钟复位线引脚
T_CLK Bit P3.4 ;实时时钟时钟线引脚
T_IO Bit P3.5 ;实时时钟数据线引脚
SECOND EQU 30H
MINUTE EQU 31H
HOUR EQU 32H
DAY EQU 33H
MONTH EQU 34H
WEEK EQU 35H
YEARL EQU 36H

;*********************************************************************/
        ORG 0000H
        LJMP START
        ORG 0060H
START:  ;CLR     T_RST
        ;CLR     T_CLK
        MOV SP,#60H                 ;修改堆栈
        MOV SECOND,#00H             ;初始时间设为12:00:00
        MOV MINUTE,#00H
        MOV HOUR,#12H
        MOV DAY,#01H                ;初始日期设为08年1月1日第一周
        MOV MONTH,#01H
        MOV WEEK,#01H
        MOV YEARL,#08H
        LCALL SETDS1302
        LCALL GET1302
        LCALL DISPLAY
MAIN: MOV R3,#25
        MOV TMOD,#01H
        MOV TH0,#70H  ;置定时器初值(定时40ms)
        MOV TL0,#00H
        SETB TR0   ;启动定时器0
LP1:    JBC TF0,LP2   ;查询计数溢出
        SJMP LP1   ;未到40 ms继续计数
LP2:    MOV TH0,#0B8H  ;重新置定时器初值
        MOV TL0,#00H
        LCALL DISPLAY                 ;显示
        DJNZ R3,LP1                 ;未到1 S继续循环
        LCALL GET1302                 ;每过1s从DS1302读取一次时间
        mov     r3,#25
        SJMP lp1

;---------------------------------------------------------------------------------------------------
;字符显示码表
DIG_CODE:
        DB 0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H

;---------------------------------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------------
;数码显示子程序
DISPLAY:
        MOV     DPTR,#DIG_CODE
;*******************************************
;显示秒
        MOV     A,SECOND
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11011111b
        LCALL   DIS_DELAY
        MOV     A,SECOND
        SWAP    A
        ANL     A,#07H
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11101111b
        LCALL   DIS_DELAY
;*******************************************
;显示分
        MOV     A,MINUTE
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11110111b
        LCALL   DIS_DELAY
        MOV     A,MINUTE
        SWAP    A
        ANL     A,#07H
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11111011b
        LCALL   DIS_DELAY
;*******************************************
;显示小时
        MOV     A,HOUR
        ANL     A,#0FH
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11111101b
        LCALL   DIS_DELAY
        MOV     A,HOUR
        SWAP    A
        ANL     A,#03H
        MOVC    A,@A+DPTR
        MOV     P2,A
        MOV     P1,#11111110b
        LCALL   DIS_DELAY

        RET
;---------------------------------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------------
;显示延时5ms子程序
DIS_DELAY:
        PUSH PSW
        MOV R7,#10
D1:     MOV R6,#248
D2:     DJNZ R6,$
        DJNZ R7,D1
        POP PSW
        RET
;---------------------------------------------------------------------------------------------------

;---------------------------------------------------------------------------------------------------
;设置DS1302初始时间,并启动计时
SETDS1302:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,#8EH          ;写控制命令字
        LCALL   INPUTBYTE      
        MOV     B,#00H          ;写保护关闭
        LCALL   INPUTBYTE
        SETB    T_CLK
        nop
        CLR     T_RST

        MOV     R0,#SECOND      ;内存中的时间首地址
        MOV     R1,#80H         ;DS1302中的时间首地址
        MOV     R7,#7           ;字节数

SETLOOP:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,R1            ;写命令字
        LCALL   INPUTBYTE
        MOV     A,@R0           ;设置时间
        MOV     B,A
        LCALL   INPUTBYTE      
        INC     R0
        INC     R1
        INC     R1
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        DJNZ    R7,SETLOOP

        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,#8EH
        LCALL   INPUTBYTE
        MOV     B,#80H          ;开写保护
        LCALL   INPUTBYTE
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        RET

;---------------------------------------------------------------------------------------------------
;从DS1302读取时间
GET1302:
        MOV     R0,#SECOND    
        MOV     R1,#81H        ;DS1302中读时间的首地址
        MOV     R7,#7
GETLOOP:
        CLR     T_RST
        nop
        CLR     T_CLK
        nop
        SETB    T_RST
        nop
        MOV     B,R1
        LCALL   INPUTBYTE       ;写命令字
        LCALL   OUTPUTBYTE      ;读时间
        MOV     @R0,A           ;将从DS1302中读取的时间从内存中保存
        INC     R0              ;修改地址指针
        INC     R1
        INC     R1
        SETB    T_CLK
        nop
        CLR     T_RST
        nop
        DJNZ    R7,GETLOOP
        RET

;---------------------------------------------------------------------------------------------------
;向DS1302写一个字节
INPUTBYTE:
        MOV     R4,#8
INPUTLOOP:
       
        MOV     A,B
        RRC     A
        MOV     B,A
        MOV     T_IO,C
        SETB    T_CLK
        NOP
        ;NOP
        ;NOP
        CLR     T_CLK
        DJNZ    R4,INPUTLOOP
        RET
;---------------------------------------------------------------------------------------------------
;从DS1302读一个字节
OUTPUTBYTE:
        clr     a
        clr     c
        MOV     R4,#8
OUTPUTLOOP:
       
        NOP
        ;NOP
        MOV     C,T_IO
        RRC     A
        SETB    T_CLK
        NOP
        ;NOP
        ;NOP
        CLR     T_CLK
        DJNZ    R4,OUTPUTLOOP
        RET
        end

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(5) | 阅读(1061)
发表于:2007-11-24 11:12:02
标签:单片机  DS1302  

2

DS1302应用心得

最近做了一块51单片机实验板,在写DS1302程序时,用了几天的时间终于搞定,现将心得总结如下:

一、读取时间时必须在写入命令字后的第一个下降沿开始读,否则出错;

二、DS1302的RST、CLK、IO引脚(至少IO)必须上拉4.7K的电阻,否则会出现读错误,我正是由于此原因,而花费了好几天时间,这个问题几乎在任何DS1302资料中没有提到的。(当然也有可能是我阅读资料时不仔细)

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(2) | 阅读(1345)
发表于:2007-11-22 23:16:49
标签:学习板  单片机  

8

51单片机学习实验板

最近做了一块51单片机学习实验板

大家看看

点击看大图

 

点击看大图

点击看大图

详情请到以下地址:

http://auction1.taobao.com/auction/0/item_detail-0db1-51d26e3e7e26d3ba952d710e27aba9d7.jhtml

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(39) | 阅读(3389)
发表于:2007-10-18 21:42:44
标签:ds1302  单片机  

0

时钟芯片DS1302 的程序

这是从网上无意中找到的,尽管现在还看不太明白C语言,但先放在这,等以后学完了C语言再来看

 

/*********************************************************************

公司名称:
模块名称:DS1302.c
功 能:实时时钟模块 时钟芯片型号:DS1302
说 明:
程序设计:zhaojunjie
设计时间:2002.03.02
版 本 号: 20020302
*********************************************************************/
#include

sbit T_CLK = P2^7; /*实时时钟时钟线引脚 */
sbit T_IO = P1^4; /*实时时钟数据线引脚 */
sbit T_RST = P1^5; /*实时时钟复位线引脚 */

sbit ACC0 = ACC^0;
sbit ACC7 = ACC^7;


void RTInputByte(uchar); /* 输入 1Byte */
uchar RTOutputByte(void); /* 输出?1Byte */
void W1302(uchar, uchar);
uchar R1302(uchar);
void Set1302(uchar *); /* 设置时间 */
void Bcd2asc(uchar,uchar *);
void Get1302(uchar curtime[]); /* 读取1302当前时间 */

/********************************************************************

函 数 名:RTInputByte()
功 能:实时时钟写入一字节
说 明:往DS1302写入1Byte数据 (内部函数)
入口参数:d 写入的数据
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void RTInputByte(uchar d)
{
uchar i;
ACC = d;
for(i=8; i>0; i--)
{
T_IO = ACC0; /*相当于汇编中的 RRC */
T_CLK = 1;
T_CLK = 0;
ACC = ACC >> 1;
}
}
/********************************************************************

函 数 名:RTOutputByte()
功 能:实时时钟读取一字节
说 明:从DS1302读取1Byte数据 (内部函数)
入口参数:无
返 回 值:ACC
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
uchar RTOutputByte(void)
{
uchar i;
for(i=8; i>0; i--)
{
ACC = ACC >>1; /*相当于汇编中的 RRC */
ACC7 = T_IO;
T_CLK = 1;
T_CLK = 0;
}
return(ACC);
}
/********************************************************************

函 数 名:W1302()
功 能:往DS1302写入数据
说 明:先写地址,后写命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址, ucData: 要写的数据
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void W1302(uchar ucAddr, uchar ucDa)
{
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
RTInputByte(ucDa); /* 写1Byte数据*/
T_CLK = 1;
T_RST = 0;
}
/********************************************************************

函 数 名:R1302()
功 能:读取DS1302某地址的数据
说 明:先写地址,后读命令/数据 (内部函数)
调 用:RTInputByte() , RTOutputByte()
入口参数:ucAddr: DS1302地址
返 回 值:ucData :读取的数据
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
uchar R1302(uchar ucAddr)
{
uchar ucData;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(ucAddr); /* 地址,命令 */
ucData = RTOutputByte(); /* 读1Byte数据 */
T_CLK = 1;
T_RST = 0;
return(ucData);
}
/********************************************************************

函 数 名:BurstW1302T()
功 能:往DS1302写入时钟数据(多字节方式)
说 明:先写地址,后写命令/数据
调 用:RTInputByte()
入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void BurstW1302T(uchar *pWClock)
{
uchar i;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
{
RTInputByte(*pWClock); /* 写1Byte数据*/
pWClock++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************

函 数 名:BurstR1302T()
功 能:读取DS1302时钟数据
说 明:先写地址/命令,后读数据(时钟多字节方式)
调 用:RTInputByte() , RTOutputByte()
入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void BurstR1302T(uchar *pRClock)
{
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
for (i=8; i>0; i--)
{
*pRClock = RTOutputByte(); /* 读1Byte数据 */
pRClock++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************

函 数 名:BurstW1302R()
功 能:往DS1302寄存器数写入数据(多字节方式)
说 明:先写地址,后写数据(寄存器多字节方式)
调 用:RTInputByte()
入口参数:pWReg: 寄存器数据地址
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void BurstW1302R(uchar *pWReg)
{
uchar i;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作*/
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xfe); /* 0xbe:时钟多字节写命令 */
for (i=31; i>0; i--) /* 31Byte 寄存器数据 */
{
RTInputByte(*pWReg); /* 写1Byte数据*/
pWReg++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************

函 数 名:BurstR1302R()
功 能:读取DS1302寄存器数据
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:RTInputByte() , RTOutputByte()
入口参数:pRReg: 寄存器数据地址
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void BurstR1302R(uchar *pRReg)
{
uchar i;
T_RST = 0;
T_CLK = 0;
T_RST = 1;
RTInputByte(0xff); /* 0xff:时钟多字节读命令 */
for (i=31; i>0; i--) /*31Byte 寄存器数据 */
{
*pRReg = RTOutputByte(); /* 读1Byte数据 */
pRReg++;
}
T_CLK = 1;
T_RST = 0;
}
/********************************************************************

函 数 名:Set1302()
功 能:设置初始时间
说 明:先写地址,后读命令/数据(寄存器多字节方式)
调 用:W1302()
入口参数:pClock: 设置时钟数据地址 格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void Set1302(uchar *pClock)
{
uchar i;
uchar ucAddr = 0x80;
W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
for(i =7; i>0; i--)
{
W1302(ucAddr,*pClock); /* 秒 分 时 日 月 星期 年 */
pClock++;
ucAddr +=2;
}
W1302(0x8e,0x80); /* 控制命令,WP=1,写保护?*/
}
/********************************************************************

函 数 名:Get1302()
功 能:读取DS1302当前时间
说 明:
调 用:R1302()
入口参数:ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
返 回 值:无
设 计:zhaojunjie 日 期:2002-03-19
修 改: 日 期:
***********************************************************************/
void Get1302(uchar ucCurtime[])
{
uchar i;
uchar ucAddr = 0x81;
for (i=0; i<7; i++)
{
ucCurtime[i] = R1302(ucAddr);/*格式为: 秒 分 时 日 月 星期 年 */
ucAddr += 2;
}
}
/*//////////////////////////////////////////////////////////////////////*/

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(623)
发表于:2007-10-13 10:16:21
标签:单片机  加密  

0

单片机系统的动态加密技术

摘要:单片机系统产品的加密和解密技术永远是一个矛盾的统一体。然而,为了更好的保护好自己的单片机技术成果和知识产权,加大解密成本,研究新型加密技术仍是保护成果的主要手段之一。文中在讨论了传统的单处系统加密和解密技术的基础上,提出了一种实用而有效的动态加密技术的实现方案。

    关键词:单片机系统 动态加密技术 FPGA

1 概述

随着单片机技术的发展和广泛应用,许多使用单片机的高新技术产品诸如智能化仪器、仪表、小型工业控制系统等都面临着一个令人头痛的问题,那就是新产品刚一推出就被仿制和剽窃。这种现象会使产品开发商蒙受很大损失,同时也极大地挫伤了开发商的积极性。创新开发是一个公司竞争力的关键,如何保护好自己的劳动成果,除用法律手段外,在产品面市前作好加密是一个必不可少的环节。

单片机系统一般都采用MCU+EPROM模式。通常EPROM都是透明的,而采用的MCU一般有Intel公司的MCS51、52系列,Zilog公司的Z80、Z84系列、Motorola公司的MC68HC系列以及Microchip公司的PIC16C系列等。虽然有许多的MCU都带有加密位,但现在已大多能破解。因此,单靠MCU本身加密位来进行加密已极不可靠的。

2 常用加密技术分析

常用的单片机加密技术无非是硬件加密和软件加密两种。软件加密不能防止别人复制,只能增加别人解剖分析的难度,但对高手而言,这不足为虑。所以,这里讨论的加密主要是硬件加密。总结起来,主要是以下三大类。

2.1 总线乱置法

总线乱置法通常是将MCU和EPROM之间的数据线和地址线的顺序乱置。总线乱置法通常包括下面几种:

(1)将数据或地址总线的某些线位交换或求反;

(2)将数据或地址总线中的某些线进行异或。例如,D5=D5,D6=D5+6等;

(3)把(1)(2)结合起来以构成较复杂的电路;

(4)采用EPROM时,把地址总线(或数据总线)与系统程序的存储器地址(或数据)的对应关系按密钥交换。例如,用一片2764芯片存储密钥,把地址的高8位重新按密钥编码,也就是说,把原程序的页号顺序打乱;点击看大图

(5)采用GAL器件,利用GAL的加密片来对硬件电路进行加密。

2.2 RAM替代法

用电池对RAM进行掉电数据保护。即先将一系列数据写入RAM并接上电池,然后将其余的芯片插上。这样,当单片微机系统运行后,CPU首先从RAM读出数据,这些数据可以是CPU执行程序的条件判别依据,也可以是CPU将要执行的程序。如果数据正确,整个系统正常运行。反之,系统不能运行。

2.3 利用MCU本身的加密位进行加密

现在很多的MCU都带有加密位,其中最成功的加密方法是总线烧毁法,此法在AT89C51中运行用得最成功。即把单片机数据总线的特定I/O永久性地破坏,解密者即使擦除了加密位,也无法读出片内程序的正确代码。此外还有破坏EA引脚的方法。

一般来说,上述的加密方法各有优点,但都存在致命的缺点:第一种方法有两个主要缺点:一是密钥放在哪里才能不被破译;二是用仿真器很容易就能把源程序截取出来。第二种方法同样可以用仿真器把数据区调出来,另外还可以把RAM接上电池,取下来放在仿真器上读出来。第三种方法用来加密小程序是成功的,但由于总线已被破坏,因而不能再使用总线来扩展接口芯片和存储器。同时,片内存储器也不再具有重复编程特性。

3 常用解密方法分析

加密和解密长期以来就是一对矛盾。要做好加密,必须先了解现在的解密水平及手段。目前的解密手段大致可分为下面四种。

3.1 恢复加密位法

该方法能破解常规用E2COMS工艺的存储加密位芯片。它包括两个系列:

第一是MCU系列,例如MCS51系列(包括89C、97C、W78E/77E系列等)、Z84E系列、PIC16C/12C系列、MC68HC系列等。

第二是PLD,如CPLD的GAL,PALCE的16V8、20V8、22V10,Altera的EPM7032、EMP7064、EMP7128,Lattice的LSP1016、LSP1024和Atmel的ATV750/2500等。

3.2 逻辑分析法

该方法主要采用示波器、逻辑分析仪和MDU解密仪等分析工具分配一些逻辑较简单的可编程器件的逻辑功能。

3.3 仿真器软件跟踪分析法

此方法适用于破解一些未带加密功能的单片机系统(如8031,Z80等系统),而对于有加密功能的单片机系统,则可先破解其单片机的源程序,然后进行仿真分析。

3.4 芯片揭盖分析法

现在市场上十万门以下的芯片多功能通过揭盖来进行逆向分析,但此破解法费用甚高。此法适用于破解专门的ASIC芯片。

综上所述,一般芯片及常规加密手段很难实现有效加密。严格来说,要做到绝对的加密是不可能的。选好适当的芯片,采用合适的加密技术,使仿制者面对需付高昂的解密费而却步,那就意味着加密工作的成功。

4 动态加密技术原理

动态加密技术的主要思路是:在程序看到的是虚地址,而虚地址对应的存储器的实地址由CPU程序运行时通过FPGA赋予。其原理如图1所示。

举例说明,若调用子程序CALL Function时,对应于同一个子程序调用,第一次调用的是真正的Function,绝对地址可能在1000H。而在第二次调用Function时,实地址可能是2000H,功能可能根本与Function不相同,这样,只要在调用前把实地址通过软件置进去就可以了。因此可以通过连续表面调用同一个子程序Function,而实际则是分别调用几个不同的子程序来实现加密。至于虚地址映射到何处的实地址,可由编程者自己安排,故只需在调用前输出实地址的对应关系即可。这种软件与硬件相结合、虚地址与实地址相结合的加密方法使破解者即使获得源程序也极难分析出对应关系。

但这种动态加密技术也有漏动,如很难对付仿真器单步跟踪分析,因此,须做进一步个性。改进的方法之一是在FPGA内设计一个计数器,并由CPU定时清零,否则一旦超过时限,FPGA将停止一切操作而使CPU无法运行,就更不用说仿真了。改进方法之二是在FPGA内做一密,并由CPU运行足够长的时间后去访问FPGA,以读取密码并比较,若出错则由CPU破坏主内存RAM的内容,从而导致所有结果出错。用这种方法足可以对付逻辑分析仪的跟踪分析。

对于数据加密,可采用与密钥逻辑异或的方法。对于这种方法密钥以及动态加密技术的逻辑函数都必须放在一个较难破译的芯片上。鉴于对芯片解密技术的了解,笔者推荐使用Actel公司生产的42MX系列的FPGA来进行一次性编程,该芯片不可读出码点文件,市场上无法破解。同时,其资源也极为丰富,设计工具完整,且用VHDL语言极易实现各种功能。

5 结束语

随着单片机系统越来越广泛的,其安全保密问题也越来越受到重视。密码学为其提供了正确的理论基础。同时,性能优良的硬件是实现其安全保密的物质基础。二者缺一不可。加密解密长期以来就是一对矛盾,解密技术随着科学技术的发展不断创新。因此,只有对解密技术有了深刻的了解,才能做好加密工作,从在则确保产品的安全。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(454)
发表于:2007-10-13 10:13:30
标签:ISP  IAP  

0

细说ISP和IAP的区别

ISP:in system programming, 

IAP: in applicatin programming 但两者的操作方式,结果和应用场合有区别

    ISP: 用写入器将code烧入,不过,芯片可以在目标板上,不用取出来,在设计目标板的时候就将接口设计在上面,所以叫"在系统编程",即不用脱离系统; 
    IAP: 在应用编程,有芯片本身(或通过外围的芯片)可以通过一系列操作将code写入,比如一款支持Iap的单片机,内分3个程序区,1作引导程序区,2作运行程序区,3作下载区,芯片通过串口接收到下载命令,进入引导区运行引导程序,在引导程序下将new code内容下载到下载区,下载完毕并校验通过后再将下载区内容复制到2区,运行复位程序,则Iap完成; 
    应用场合: 1,ISP 程序升级需要到现场解决,不过好一点的是不必拆机器了; 2,IAP 如果有网管系统的话,用网管下载一切搞定,人不用跑来跑去, 这可能是他们的优点或应用吧。 典型IAP:IC卡电话机内含V.xx MODEM芯片,MCU自带引导区,可远程下载更新程序。
   在线编程目前有两种实现方法:在系统编程(ISP)和在应用编程(IAP)。ISP一般是通过单片机专用的串行编程接口对单片机内部的Flash存储器进行编程,而IAP技术是从结构上将Flash存储器映射为两个存储体,当运行一个存储体上的用户程序时,可对另一个存储体重新编程,之后将控制从一个存储体转向另一个。ISP的实现一般需要很少的外部电路辅助实现,而IAP的实现更加灵活,通常可利用单片机的串行口接到计算机的RS232口,通过专门设计的固件程序来编程内部存储器。
 
ISP,In System Programing 
   主要是指代芯片的烧写方式,以往写片子需要把片子拿下来,离开电路,用 编程器烧,换句话说,芯片不能不脱离应用系统进行写入。 
    ISP 主要针对这个问题,使用JTAG或者串行口(MCU 内部有Boot Loader,通过指定的方式激活之,它可以和PC或其它上位机通过串口联系,不用使单片机离开应用系统而更新内部的程序/设置)进行程序的烧写操作。
    因此,具有ISP 功能的MCU 可以不使用编程器进行编程。当然,实现ISP 可能需要一些硬件电路支持,具体的在数据手册中有说明。
    IAP,In Application Programing 
    单片机内部具有一些可擦写的非易失存储器,如Flash。在单片机独立运行时,不具备IAP 功能的单片机并不能对Flash的数据进行修改,比如,对自身的某一个模块的代码,数据进行修改。具备了IAP 功能的MCU ,能够通过使用各自公司开发的技术,对于自身进行修改。 
    简言之:ISP=>修改MCU 内部数据需要有外部介入;
     IAP=>修改MCU 内部数据可以不用外部介入。
     二者可以说是数据更新的一种实现机制。
    一般具备ISP 功能后,就不要编程器了,而是使用下载线进行编程工作。但是不是说他们就一定不支持编程器了,具体型号具体分析。是否需要仿真器进行仿真和是否具备ISPIAP没有必然的联系。只不过具备了IAP功能,可以在MCU内写入监控程序,模拟一个仿真器,当然,这个监控程序是要消耗资源的,和使用硬件的仿真器还有一定的差异。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(1) | 阅读(614)
发表于:2007-10-13 10:03:44
标签:单片机  初学  

0

单片机初学者关心的16个问题

1.C语言和汇编语言在开发单片机时各有哪些优缺点?
 

:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。

 

C语言是一种结构化的高级语言。其优点是可读性好,移植容易,是普遍使用的一种计算机语言。缺点是占用资源较多,执行效率没有汇编高。

 

对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什幺动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在单片机开发中,我们还是建议采用汇编语言比较好。
 
2.C或汇编语言可以用于单片机,C++能吗

:在单片机开发中,主要是汇编和C,没有用C++的。
 
3.搞单片机开发,一定要会C吗?
 

:汇编语言是一种用文字助记符来表示机器指令的符号语言,是最接近机器码的一种语言。其主要优点是占用资源少、程序执行效率高。但是不同的CPU,其汇编语言可能有所差异,所以不易移植。

 

对于目前普遍使用的RISC架构的8bit MCU来说,其内部ROM、RAM、STACK等资源都有限,如果使用C语言编写,一条C语言指令编译后,会变成很多条机器码,很容易出现ROM空间不够、堆栈溢出等问题。而且一些单片机厂家也不一定能提供C编译器。而汇编语言,一条指令就对应一个机器码,每一步执行什么动作都很清楚,并且程序大小和堆栈调用情况都容易控制,调试起来也比较方便。所以在资源较少单片机开发中,我们还是建议采用汇编语言比较好。

 

C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。C语言有功能丰富的库函数、运算速度快、编译效率高、有良好的可移植性,而且可以直接实现对系统硬件的控制。C语言是一种结构化程序设计语言,它支持当前程序设计中广泛采用的由顶向下结构化程序设计技术。此外,C语言程序具有完善的模块程序结构,从而为软件开发中采用模块化程序设计方法提供了有力的保障。因此,使用C语言进行程序设计已成为软件开发的一个主流。用C语言来编写目标系统软件,会大大缩短开发周期,且明显地增加软件的可读性,便于改进和扩充,从而研制出规模更大、性能更完备的系统。

 

综上所述,用C语言进行单片机程序设计是单片机开发与应用的必然趋势。所以作为一个技术全面并涉足较大规模的软件系统开发的单片机开发人员最好能够掌握基本的C语言编程。

4.当开发一个较复杂而又开发时间短的项目时,用C还是用汇编开发好

:对于复杂而开发时间紧的项目时,可以采用C语言,但前提是要求对该MCU系统的C语言和C编译器非常熟悉,特别要注意该C编译系统所能支持的数据类型和算法。虽然C语言是最普遍的一种高级语言,但不同的MCU厂家其C语言编译系统是有所差别的,特别是在一些特殊功能模块的操作上。如果对这些特性不了解,那调试起来就有的烦了,到头来可能还不如用汇编来的快。

5.初学者到底是应该先学C还是汇编?

:对于单片机的初学者来说,应该从汇编学起。因为汇编语言是最接近机器码的一种语言,可以加深初学者对单片机各个功能模块的了解,从而打好扎实的基础。

6.我是一名大3的学生,但是总是感觉很迷茫,觉好象什么都不会。

:大学过程是一个理论过程,实践的机会比较少,往往会造成理论与实践相脱节,这是国内大学教育系统的通病,不过对于学生来说切不可好高骛远。一般从大三会开始接触到一些专业课程,电子相关专业会开设相关的单片机应用课程并且会有简单的实验项目,那么要充分把握实验课的机会,多多地实际上机操作练习。平时可以多看看相关的电子技术杂志网站,看看别人的开发经验,硬件设计方案以及他人的软件设计经验。有可能的话,还可以参加一些电子设计大赛,借此机会2--3个人合作做一个完整系统,会更有帮助。到了大四毕业设计阶段,也可以选择相关的课题作些实际案例增长经验。做什么事情都有个经验的积累过程,循序渐进。

7.作为学生,如何学好单片机?

学习好单片机,最主要的是实践,在实践中增长经验。在校学生的话,实践机会的确会比较少,但是有机会的话,可以毕业实习选择相关的课题,这样就可以接触到实际的项目。而且如果单片机微机原理是一门主课的话,相信学校会安排比较多的实践上机机会。有能力的话,可以找一些相关兼职工作做做,会更有帮助。而且单片机开发应用需要软硬件结合,所以不能只满足于编程技巧如何完美,平时也要注意硬件知识的积累,多上上电子论坛网站,买一些相关杂志。可能的话,可以到电子市场去买一些小零件,自己搭一个小系统让它工作起来。

8.女性是否适合单片机软件编程这个行业?

:要根据自己的兴趣,配合自己对软件编程的耐性,男女皆适合这个行业。

9.学习ARM及嵌入式系统是否比学习其它一般单片机更有使用前景?

:一般在8位单片机与ARM方面的嵌入式系统是有层次上的差别,ARM适用于系统复杂度较大的高级产品,如PDA、手机等应用。而8位单片机因架构简单,硬件资源相对较少,适用于一般的工业控制、消费性家电等等。对于一个单片机方面的软件编程初学者,应以HOLTEK系列或8051等8位单片机来做入门练习。而初学者应当具备软件编程相关知识,单片机一般软件编程是以汇编语言为主,各家有各家的语法,但大都以RISC的MCU架构为主,其中 RISC (Reduced Instruction Set Computer) 代表MCU的所有指令。都是利用一些简单的指令组成的,简单的指令代表 MCU 的线路可以尽量做到最佳化,而提高执行速率。另外初学者要具备单片机I/O接口的应用知识,这在于周边应用电路及各种元器件的使用,须配合自己所学的电子学及电路学等。

10.在ARM编程中又应当如何?
 

:就以嵌入式系统观念为例,一般嵌入式处理器可以分为三类:嵌入式微处理器、嵌入式微控制器、嵌入式DSP(Digital Signal Processor)。

 

嵌入式微处理器就是和通用计算机的微处理器对应的CPU。在应用中,一般是将微处理器装配在专门设计的电路板上,在母板上只保留和嵌入式相关的功能即可,这样可以满足嵌入式系统体积小和功耗低的要求。目前的嵌入式处理器主要包括:PowerPC、Motorola 68000、ARM系列等等。

 

嵌入式微控制器又称为单片机,它将CPU、存储器(少量的RAM、ROM或两者都有)和其它接口I/O封装在同一片集成电路里。常见的有HOLTEK MCU系列、Microchip MCU系列及8051等。

 

嵌入式DSP专门用来处理对离散时间信号进行极快的处理计算,提高编译效率和执行速度。在数字滤波、FFT(Fast Fourier Transform)、频谱分析、图像处理的分析等领域,DSP正在大量进入嵌入式市场。
 
11。单片机将被ARM等系列结构的嵌入式系统所取代?


 

因为8位单片机与嵌入式系统的ARM在功能结构和单价的差异,故应用层次上就有很大的不同。 ARM适用于系统复杂度较大的高级产品,如PDA、手机等应用。 8位单片机因架构简单,硬件资源相对较少,适用于一般的工业控制,消费性家电……等等。评估单片机近期是否会给ARM取代,要观察两个因素:

 

? 芯片成本

  因ARM的工作频率较高,电路较庞大,所需的芯片制造工艺要求在025U以上,成本较高。8位单片机工作频率相对较低,电路较小,所需的芯片制造工艺在05U 即可,成本较低。

 

? 功能定位

  ARM的功能较单片机强,但两者定位不同。就如现阶段不会有人用ARM去作一个简单的工业定时开关。当然,如果两者单价相同也无不可,但现实是有很大的单价差距。

 

  至于将来,因芯片制造成本会不断下降,上述的成本差异影响愈来愈少!但我估计在往后5年单片机仍有价格优势,仍能存活!ARM是否会精简架构,降低成本,抢夺低阶市场?我想可能性不大,ARM应该会向上发展。同样,单片机也只能向上发展,如16位,高功能……等。 原因就是因为芯片制造工艺进步太快。压迫芯片设计往高集成发展。

12.ARM单片机和哪种内核的单片机比较接近
 

:严格的说,ARM不是单片机,是一个嵌入式的实时操作系统。ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的都是一套独一无二的ARM相关技术及服务。所以市场上像Intel、IBM、LG半导体、NEC、SONY、菲利浦和国半这样的大公司都有ARM系列,现在不存在什幺ARM单片机和哪种内核的单片机比较接近的问题。而且由于厂家购买内核后会根据自己芯片应用方向的不同,自行添加不同的外挂功能模块,所以,同样内核的芯片其提供的功能是不同的。

 
13.如何从51系统过渡到ARM系统?
 

51系统转为ARM系统是比较困难的。ARM提供一系列内核、体系扩展、微处理器和系统芯片方案,并且现在已经发展了好几种内核了,现在主要有以下几种:

 

l         ARM7:小型、快速、低能耗、集成式RISC内核

 

l         ARM7TDMI(Thumb):它将ARM7指令集同Thumb扩展结合在一起,减少了内存容量和系统成本;而且还利用嵌入式ICE调试技术,简化了系统设计;并且有DSP增强扩展改进了性能。

 

l         ARM9TDMI:采用5阶段管道化ARM9内核,同时配备Thumb扩展、调试和Harvard总线。

 

如果只是想学习上手的话,建议先做个最小系统板,根据硬件写一个能够启动的小代码包括初始化端口,屏蔽中断,把程序拷贝到SRAM中;完成代码的重映射;配置中断句柄,连接到C语言入口。其实还是多实践,多点经验,多上上电子网站,吸取他人的开发经验,会对自己的成长有所帮助的。
 
14.如何理解MTP,ISP,IAP概念
 

MTP = Multi-Time Programming (via parallel programmer)

ISP = In-System Programming (via serial interface)

IAP = In-Application Programming ?

MTP即指单片机的程序可重复烧写,其程序记忆体(Program ROM)可分以下几种:

 

l         Window with EPROM:提供使用者更改程式的空间,具视窗式陶瓷包装,利用紫外线灯清除资料,可重复烧写,但包装成本非常高,仅适合小量生产或实验使用。

 

l         EEPROM:属于可重复写入/清除之元件,此类记忆体使得程式之内容可加以清除或修改,而无需使用开窗之包装,可节省包装之成本,亦方便重复使用,但生产制程较复杂。

 

l         Flash EPROM:当须要清除/写入较大量的非挥发性程式记忆体时,Flash EPROM比传统式EEPROM可提供较好的解决之道,因为Flash EPROM较EEPROM于清除/写入周期次数及速度上表现更好。利用Flash ROM来当作程式记忆体,由于封装上不需要EPROM特殊的视窗式陶瓷包装,使用上价格与OTP(One Time Programming)相差不大,相当合理,又具有多次重复烧写的功能。

 

ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码,而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程。ISP的实现相对要简单一些,一般需要很少的外部电路辅助实现,通用做法是内部的记忆体可以由上位机的软体通过串口来进行改写。对于单片机来讲可以通过SPI或其他的串列介面接收上位机传来的资料并写入记忆体中。所以即使我们将晶片焊接在电路板上,只要留出和上位机介面的这个串口,就可以实现晶片内部记忆体的改写,而无须再取下晶片。

 

ISP的优点 ISP技术的优势是不需要编程器就可以进行单片机的实验和开发,单片机晶片可以直接焊接到电路板上,调试结束即成成品,免去了调试时由于频繁地插入取出晶片对晶片和电路板带来的不便。

 

IAP(In-Application Programming)指MCU可以在系统中获取新代码并对自己重新编程,即可用程式来改变程式。IAP的实现相对要复杂一些,在实现IAP功能时,单片机内部一定要有两块存储区,一般一块被称为BOOT区,另外一块被称为存储区。单片机上电运行在BOOT区,如果有外部改写程式的条件满足,则对存储区的程式进行改写操作。如果外部改写程式的条件不满足,程式指标跳到存储区,开始执行放在存储区的程式,这样便实现了IAP功能。IAP技术是从结构上将Flash记忆体映射为两个存储体,当运行一个存储体上的用户程式时,可对另一个存储体重新编程,之后将程式从一个存储体转向另一个。

 

IAP的优点 IAP技术是从结构上将Flash记忆体映射为两个存储体,当运行一个存储体上的用户程式时,可对另一个存储体重新编程,之后将程式从一个存储体转向另一个。而IAP的实现更加灵活,通常可利用单片机的串列口接到电脑的RS232口,通过专门设计的固件程式来编程内部记忆体,可以通过现有的INTERNET或其他通讯方式很方便地实现远端升级和维护。
 
15.单片机民用级(商业级)、工业级和军用级三种,他们的区别?

 

:一般单片机根据工作温度可分为民用级(商业级)、工业级和军用级三种:民用级的温度范围是0℃~70℃,工业级是-40℃~85℃,其HOLTEK的MCU就属于此项等级,军用级是-55℃~125℃。如果是一般普通商业级单片机,在超规格范围使用IC时,就有可能部份IC无法工作,或工作运作不正常等发生。

 

至于抗干扰性能,是属于整个产品的EMS(电磁杂讯耐受性)检测,它是EMC(电磁相容)中的一项检测, 另一项是EMI(电磁辐射干扰)。各国都有其EMC认证标准,例如目前在欧洲EMC指令下常用的测试规范下,针对其中法规EN61000-4-2是做静电试验(ESD),本项试验目的为测试试件承受直接来自操作者及相对物件所产生之静电放电效应的程度,其法规范如下:

 

l         Air Discharge

l         Leve1 2KV

l         Leve2 4KV

l         Leve3 8KV

l         Leve4 15KV

 

以上是举个例子,就如抗静电能力,不只跟IC性能有关,也跟应用电路及PCB Layout有直接关联。
 
16.RISC架构的主要特点是?优越性?哈佛结构有什么特点?
 

:在MCU开发方面,以架构而言,可分为两大主流;RISC(Reduced Instruction Set Computer)与CISC(Complex Instruction Set Computer), RISC代表MCU的所有指令都是利用一些简单的指令组成的,简单的指令代表 MCU 的线路可以尽量做到最佳化,而提高执行速率,相对的使得一个指令所需的时间减到最短。HOLTEK的一系列MCU便是采用 RISC 结构来设计。

 

再说RISC因为指令集的精简,所以许多工作都必须组合简单的指令,而针对较复杂组合的工作便需要由『编译程式』(compiler) 来执行,而 CISC MCU因为硬体所提供的指令集较多,所以许多工作都能够以一个或是数个指令来代替,compiler 的工作因而减少许多。以一个数值运算程式来说,使用 CISC 指令集的MCU运算对于一个积分运算式可能只需要十个机器指令,而 RISC MCU在执行相同的程式时,却因为CPU 本身不提供浮点数乘法的指令,所以可能需要执行上百个机器指令 (但每一个指令可能只需要 CISC 指令十分之一的时间),而由程式语言转换成机器指令的动作是由程式语言的 Compiler 来执行,所以在 RISC MCU的Compiler 便会较复杂 。因为同样一个高阶语言 A="B"*C 的运算,在 RISC MCU转换为机器指令可能有许多种组合,而每一种组合的『时间/空间』组合都不尽相同。所以 RISC 与 CISC 的取舍之间,似乎也是MCU硬体架构与软体(Compiler) 的平衡之争,应该没有绝对优势的一方,只能说因应不同的需求而有不同的产品,例如工作单纯的印表机核心 MCU,便适合使用效能稳定,但单位指令效率较佳的 RISC MCU。

 

对单片机处理方式而言,目前单片机的系统结构有两种类型:一种是将程式和资料记忆体分开使用,即哈佛(Harvard)结构,当前的单片机大都是这种结构。另一种是采用和PC机的冯。诺依曼(Von Neumann)类似的原理,对程式和资料记忆体不作逻辑上的区分,即普林斯顿(Princeton)结构。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴