⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart_t2.c

📁 SST89C54/SST89C58单片机的IAP在线编程功能,如何使用FLASH寄存器对内部FLASH的操作
💻 C
📖 第 1 页 / 共 2 页
字号:
uPSD3200系列芯片提供两个标准的8032 UART 串行口。串口1连接到P3.0(RX)和P3.1(TX)。串口2连接到P1.2(RX)和P1.3(TX)。这两个串口为全双工接口,即接收和发送可以同时进行。串行口的接收和发送是通过SBUF寄存器(对串口2是SBUF2寄存器)的访问进行的。串行I/O口有4种工作方式, 可以通过SCON寄存器(对串口2是SCON2寄存器)中的SM0和SM1位编程来选择。如表1所示。 
 

表1 串行I/O口4种工作方式
串行口的波特率在方式0和方式2中是固定的,只有在方式1和方式3中波特率由定时器的溢出率决定。在uPSD3200系列中,定时器1和定时器2都可以用作串口1和串口2的波特率发生器,仅仅需要在T2CON和PCON寄存器中设置TCLK、TCLK1、 RCLK和RCLK2位就可以了,波特率由定时器1、2的初值TH1、RCAP2H和RCAP2L决定。
  例如将串口1和串口2 定义为19200波特率,使用定时器2作为波特率发生器的串口设置源程序如下 : 
  T2CON = 0x34;   // 使用定时器2作为波特率发生器 
                  // 使串口1使用定时器2作为波特率发生器 
  PCON |= 0x0C;   // 使串口2使用定时器2作为波特率发生器 
  RCAP2L = 0xc6 ; //设置定时器2初值 
  RCAP2H = 0xff ; 
  SCON = 0x50;    // 初始化串口1 
  SCON2 = 0x50;   // 初始化串口2 
  EA = 1;         // 开中断 








SST89C58单片机的在线编程说明
      
						SST89CXX单片机简介
SST89C系列单片机为Flash Flex 51系列单片机,包括SST89C54/58。SST89C5X系列单片机有如下技术特点:
     ◎ SST89C54/58 片内程序空间包括:高可靠Super Flash EEPROM 
  16KB(Block0)+4KB(Block1)/32KB+4KB。
     ◎ 系统在线编程(In-Application Programming-IAP)模式或离线式用万用编程器编程.
?	Flash擦写次数达1万次以上,程序保存时间可达到100年;
?	由于Flash具有掉电保持的特性而系统内可编程(IAP)功能提供了象RAM一样的带电状态可随时改写的特性,可用做数据存储器和在线软件升级功能;
 ◎ 有看门狗(WDT);
?	宽电源范围:2.7V--5V电源
?	具有三种节电模式,使功耗降至最低。
?	与8052系列单片机兼容,片内有RAM 256字节;3个16位定时计数器;4个8位I/O端口;
?	器件有多种加密方式, 是绝不会被解密的单片机;有DIP-40,PLCC-44,TQFP-44三种封装形式等;
 SST89C系列单片机,给单片机应用带来全新概念。
6.	开发实验。不需编程器就可做单片机实验,这对初次学习单片机的人们, 尤其对学校单片机教学带来极大的方便。是一种最低成本的单片机开发手段。
7.	产品的软件升级。不需外加监控芯片,只是通过串行口便可将PC机内的产品升级软件下载到产品中去,而实现产品软件升级换代。在自己的实验室便可通过MODEM对远方的产品进行软件升级。这将是以后电子产品的必然趋势。
8.	在线对产品参数的修改。可实现在线对现场历史数据的存储、曲线参数校正等功能。适用一些需经常改变数据的应用产品(如利息计、计费器、密码锁、及需要升级的产品,如微型打印机等)及需远距离改变设备参数的产品( 遥控报警器、遥控家用电器等遥控设备)
9.	SST89C5X大容量存储器,更适合一些特殊应用场合,使单片机的产品,只用一片(单片)芯片。
如SST89C5X系列单片机用在线编程方式,则程序空间 (Block1:F000H-F3FFH)高4KB存储器,存放通讯联机操作程序等数据(指本公司研制的IAP_SST系统在线编程提供的监控软件存放的地址范围)。用户也可根据自己的实际情况编写自己的在线编程监控软件,本公司附送监控软件的源代码及其操作说明,以便用户能够真正实现自己产品的软件在线升级,以适应未来的需要。




SST89C5X单片机在线下载管理程序操作:
一.准备工作:
6.	首先确认自己产品线路板上,单片机的串行口有无与PC机相连的RS232的接口电路。如已有,可直接将PC机的RS232接口相连;如没有,需要做一块RS232的接口板与PC机相连。然后在P1.0端加一个对地的跳线,这个主要是用来区分是执行在线下载程序(P1.0=0)还是执行用户程序(P1.0=1)的开关,这个开关用户也可根据我们提供源程序(iap_sst.asm)改为其它端口或软件开关。
7.	将我们提供的在线编程的监控程序的目标代码(iap_sst.hex),通过万用编程器烧录到SST89C58单片机内,再对RB0或RB1位编程,这样这个SST89C58的芯片就具备了在线编程的功能。以后就不需要再用编程器来对它编程了。
8.	将P1.0接地,接好PC机的RS232口,对产品线路板通电。在PC机上执行我们提供的在线下载的管理程序(SST_IAP.EXE),根据操作菜单的提示进行操作即可实现在线编程功能,下面详细介绍:
	二.操作步骤:
0-	执行SST_IAP.EXE,出现以下界面:
 2.选择1-内部存储器模式,出现界面如下:
 


3.  选择1-选择芯片型号(58-SST89C58),串行口(1-COM1),波特率(0-自动检测波特率),出现界面如下:
 

4.  待出现测试串行口通过(显示…PASS…)之后,再选择2-下载的用户程序的目标代码(16进制或二进制文件),例如:TWOBALL.BIN,出现界面如下:
 
5.   待出现PRIMARY  BLOCK VERIFIED OK!字样,说明烧录正确。如没有出现OK!,则说明烧录的内容没有完全通过,再重复第4步下载过程,一般都通过。
6.	下载正确后,将P1.0的跳线拔下(开关指向用户程序),对用户板复位,即可执行用户程序。如果需要再修改用户程序,修改编译完后,插上P1.0的跳线,复位用户板,重复第4步下载过程,将更新的软件烧录到芯片中。如此重复此步骤,即可完成用户程序的调试。
7.	当调试完毕,选择两次0-退出下载管理程序。
8.	下载菜单说明:
0-	退出下载或切换内外存储器模式
1-	选择芯片型号,通讯口以及波特率
2-	下载用户程序到SST89C5X芯片中
3-	读用户板中的SST89C5X芯片的内容并存储到文件中
4-	SST89C5X芯片内容的空白检查
5-	擦除SST89C5X芯片的内容
6-	对SST89C5X芯片加密

SST器件型号(Block0)的扇区数十进制与对应十六进制对照表
器件型号SST89F54/58/59
扇区数十进制	对应十六进制单元
1	80H
2	100H
3	180H
4	200H
8	400H
10	500H
20	A00H
30	F00H
32	1000H
64	2000H
128	4000H(16K)
256	8000H(32K)
512	FFFFH(64K)
	



本公司提供SST89C58在线编程的工具如下:
1.89c58.pdf:          SST89C58的DATASHEET
2.  SST89C5X_IAP.DOC:	本文件在线编程的操作说明
    		3.Iap_sst.hex:        SST89C58的片内在线编程的目标代码(16进制)
    		4.iap_sst.asm:        SST89C58的片内在线编程的源代码及说明
    		5.SST_IAP.exe:      PC机在线编程SST89C5X的执行程序





附录:SST89C58的片内在线编程的源代码:

;*********************************************************************************************************************
;		iap在线编程监控程序示例
;主要介绍SST89C54/SST89C58单片机的IAP在线编程功能,如何使用FLASH寄存器对内部FLASH的操作
;	技术支持:	深圳雅创 田伯运
;	TEL:		0755-3762602,3762751
;	E-MAIL:	tian.boyun@actrontech.com
;*********************************************************************************************************************
;				在线编程操作说明
;用户可用支持SST89C58的编程器(例如:ALL07),将本文件编译后生成的目标文件Iap_sst.hex写入SST89C58,然后再选择"O"项编程CONFIG.BYTE的RB0位,
;这样这片SST89C58就具有了在线编程功能,;在用户板上只要将RXD,TXD,P1.0三线引出来,RXD,TXD接一个RS232电平转换电路与PC机的串行口接起来,
;P1.0口用来选择是在线编程用还是执行用户程序,;P1.0=0处于在线编程状态,P1.0=1处于执行用户程序状态.
;    在线编程时,首先将RS232接口电路与PC机接好,将P1.0接地,用户板通电,在PC机上执行F51pblb3.exe程序,操作步骤为:
;    1.选择"1"内部存储器,回车
;    2.选择"1"选择芯片型号(58)与通信端口(1或2),通信速率(1-38.4K或0-自动检测)(注:单片机晶振为11.592MHZ,也可用其它晶振,波特率要选好)
;    3.选择"2"输入用户的烧写文件名称,即可对SST89C58芯片进行在线编程.
;*********************************************************************************************************************
STATUS          EQU  20H         ; STATUS = copy of SFCF
BUSY            BIT  STATUS.2    ; busy flag of CPU on concurrent operation
FLAGS           EQU  21H        ; FLAGS = bootcode operational & error flags  
RX              BIT  FLAGS.0    ; flag of received data from PC
TX              BIT  FLAGS.1    ; flag of sent data to PC
ERR             BIT  FLAGS.2    ; flag of operation error
ERR1            BIT  FLAGS.3    ; flag indicating no boot because syst. locked
ERR2            BIT  FLAGS.4    ; flag indicating copy error moving boot code
ERR3            BIT  FLAGS.5    ; flag indicating incorrect command ID
;****************************************************************
;*								*
;*			OTHER SFR ADDRESSES			*
;*								*
;****************************************************************
SFCF           EQU     0B1H    ; SuperFlash Configuration
SFCM           EQU     0B2H    ; SuperFlash Command
SFAL           EQU     0B3H    ; SuperFlash Address Low
SFAH           EQU     0B4H    ; SuperFlash Address High
SFDT           EQU     0B5H    ; SuperFlash Data
SFST		  EQU      0B6H	      ;SUPERFLASH STATUS

T2CON   DATA    0C8H
RCAP2L  DATA    0CAH
RCAP2H  DATA    0CBH
TL2   	  DATA    0CCH
TH2   	  DATA    0CDH

WDTC		EQU	0C0H	; Watchdog Timer Control
WDTD		EQU	86H	; Watchdog Timer Data/Reload
;****************************************************************
;*								*
;*		  REGISTER BANK ASSIGNMENTS			*
;*								*
;****************************************************************

CMD		EQU	02H	; PC command
PCDATA  	EQU	03H	; PC data 
ADRHI   	EQU	04H	; start address - high byte
ADRLO 		EQU	05H	; start address - low byte
COUNT   	EQU	06H	; byte count or size
;---------------------------------------------

baud_h		equ	0ffh			;11.0592 MHz, 波特率发生器使用定时器2,定时常数的高位字节
baud_384	equ	0f7h			;11.0592 MHz, 38400 baud的定时常数2的低位字节
baud_192	equ	0eeh			;11.0592 MHz, 19200 baud的定时常数2的低位字节
baud_96	equ	0dch			;11.0592 MHz, 9600 baud的定时常数2的低位字节
baud_48	equ	0b8h			;11.0592 MHz, 4800 baud的定时常数2的低位字节
baud_24	equ	070h			;11.0592 MHz, 2400 baud的定时常数2的低位字节
						;定时常数2的计算公式:rcaphl=65536-31250*osc/band

;************************************************************************
;		IAP 在线编程主程序
;由于事先已对RB1,RB0编程,上电复位时,通过映射功能,程序首先从0F000H开始执行
;************************************************************************
  	org    0f000h
  ajmp   cld_start			;IAP主程序开始

   org    0f003h
  	reti

   org    0f00bh
  	reti
 
   org    0f013h
  	reti

   org    0f01bh
   	reti

   org    0f023h
  	ljmp   rs232			;串行中断子程序
	
    org    0f02bh
  	reti
;*****************************************************************************
;		开始执行程序,判断是否执行在线编程程序或用户程序
;*****************************************************************************
  	org    0f030h
cld_start:
  mov    SFCF,#0c1h		;VIS=1:F000-FFFFH区可见, 
				;IAPEN=1,MAP_EN=01:映射有效F000H--F3FFH映射到000H--03FFH
   setb p1.0
   		nop
     	jb IAP_SW,USER_start	;IAP_SW=0,进入在线编程程序
;用户也可根据其它条件作为执行在线编程或用户程序的开关,
;例如:其它没用到的IO口,或软件开关
   		AJMP ISP_START
  USER_START:
	LJMP  USER_START1

		ORG 0FFFAH
USER_START1: 
 	mov    SFCF,#80h	;#80h		;IAP_SW=1,使映射无效,转进入用户程序(0000H--7FFFH)
  	LJMP 0000H				;执行"mov SFCF,#80h"后,此时PC指针并未改变,
;所以这个语句一定要跳出映射区域.
;*****************************************************************************
;		在线编程程序(IAP)
;*****************************************************************************
isp_start:
  mov    psw,#00h				;寄存器初始化
  mov    a,#00h
  mov    sp,#60h
  mov    ie,#00h
  mov    ip,#00h
  clr    RX
  clr    TX
 
  anl    scon,#0ch				; 
  orl    scon,#50h				; 串行口模式: mode 1 (8-bit UART),8-bits, 1 stop bit, NO parity check 
                                   	;  允许接收
  mov    T2CON,#34h				; 波特率发生器使用定时器2,
  mov  RCAP2H, #baud_h			; 11.0592 MHz, 定时常数的高位字节
  mov  RCAP2L, #baud_192			; 11.0592 MHz, 9600 baud定时常数2的低位字节
  mov    pcon,#00h				; 波特率不加倍
  setb   es					; 打开串行口中断
  setb   ea
  clr    ti
  clr    ri
  ljmp   loop	
;************************************************************************
;*									*
;*		      	 WAITING FOR PC COMMANDS			*
;* PC COMMAND:
;*		04H--加密			(06)
;*		05H--为读状态命令 			
;*		06H--闪速编程			(05)
;*		0BH--扇区擦除			(01)
;*		0CH--字节校验			(03)
;*		0DH---块擦除			(04)
;*		0EH--字节编程			(02)
;************************************************************************
loop:   
  jnb    RX,$  			; 等待PC发来的命令
  clr    RX
  mov    a,b
  mov    CMD,a
cmd_S:
  cjne   a,#05h,cmd1			;
  mov    a,SFCF			;05为读状态命令
  anl    a,#03h
  mov    r0,a				;取MAP_EN1.0
  mov    a,SFST			;读状态,读取映射位MAPEN[1.0],忙闲位(BUSY,FLASH_BUSY),保密位(SECD2.1.0) 
  orl    a,r0
  jnb    TX,$				;
  clr    TX
  mov    sbuf,a			;发送SST89C58的当前状态
cmd0_0:
  mov    a,SFST			;读状态
  anl    a,#80h
  cjne   a,#80h,loop
  setb   ERR1				
  ajmp   cmd0_0
cmd1:
  mov    FLAGS,#0c0h			;标志初始化
  cjne   a,#0bh,cmd2			;01-扇区(128字节)擦除命令,PC=0BH 
  mov    r0,#01h
  ajmp   cmd_proc
cmd2:   
  cjne   a,#0eh,cmd3			;02-字节编程命令,PC=0EH 
  mov    r0,#02h
  ajmp   cmd_proc
cmd3:   
  cjne   a,#0ch,cmd4			;03-字节校验命令,PC=0CH 
  mov    r0,#03h
  ajmp   cmd_proc			;
cmd4:
  cjne   a,#0dh,cmd5	
  mov    r0,#04h			;04-块擦除,PC=0DH
  ajmp   cmd_proc
cmd5:
  cjne   a,#06h,cmd6	
  mov    r0,#05h			;05-闪速编程,PC=06H
  ajmp   cmd_proc
cmd6:
  cjne   a,#04h,cmd_err
  mov    r0,#06h			;加密
  ajmp   cmd_proc
cmd_err:
  setb   ERR3				;接收为无效命令代码,置错误标志--ERR3 
  ajmp   loop			
  nop
  nop
  ajmp   loop				; 软件陷阱
  nop
  nop
  nop
  ajmp   loop				; 软件陷阱

;************************************************************************
;*			命令执行过程						*
;************************************************************************

cmd_proc:
  clr    c
  mov    a,r0				; 
  subb   a,#07h			;校验输入命令,不在1-6之间,为无效命令
  jnc    cmd_end
  cjne   r0,#06h,cmd_1	
  sjmp   cmd_6			;06-转加密编程
cmd_1:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -