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

📄 iap_sst.asm.bak

📁 iap_sst89c58.zip:--------SST89C58/54单片机的iap在线编程/在线下载监控程序源程序(KC51)
💻 BAK
📖 第 1 页 / 共 2 页
字号:
;*********************************************************************************************************************
;		iap在线编程监控程序示例V1.1
;主要介绍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,IAP_SW三线引出来,RXD,TXD接一个RS232电平转换电路与PC机的串行口接起来,
;IAP_SW口用来选择是在线编程用还是执行用户程序,;IAP_SW=0处于在线编程状态,IAP_SW=1处于执行用户程序状态.
;    在线编程时,首先将RS232接口电路与PC机接好,将IAP_SW接地,用户板通电,在PC机上执行F51pblb3.exe程序,操作步骤为:
;    1.选择"1"内部存储器,回车
;    2.选择"1"选择芯片型号(58)与通信端口(1或2),通信速率(1-38.4K或0-自动检测)(注:单片机晶振为11.592MHZ,也可用其它晶振,波特率要选好)
;    3.选择"2"输入用户的烧写文件名称,即可对SST89C58芯片进行在线编程.
;*********************************************************************************************************************

IAP_SW		BIT	P3.4 	;P1.1		;P1.0	;执行在线编程或用户程序的开关,(0--执行在线编程;1--执行用户程序).

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 0FFFAH
USER_START1: 
 mov    SFCF,#80h	;#80h		;IAP_SW=1,使映射无效,转进入用户程序(0000H--7FFFH)
  LJMP 0000H				;执行"mov SFCF,#80h"后,此时PC指针并未改变,所以这个语句一定要跳出映射区域.

  	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    0f02bh
cld_start:
  	mov    SFCF,#0c1h		;VIS=1:F000-FFFFH区可见, 
					;IAPEN=1,MAP_EN=01:映射有效F000H--F3FFH映射到000H--03FFH
  	setb IAP_SW
   	nop
   	jb IAP_SW,USER_start	;IAP_SW=0,进入在线编程程序
					;用户也可根据其它条件作为执行在线编程或用户程序的开关,例如:其它没用到的IO口,或软件开关
   	AJMP ISP_START
  USER_START:
	LJMP  USER_START1


;*****************************************************************************
;		在线编程程序(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_96	;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:
  jnb    RX,$  			; 
  clr    RX
  mov    a,b				;  1) 接收高字节地址
  mov    ADRHI,a
  mov    dph,a
  jnb    RX,$		
  clr    RX
  mov    a,b
  mov    ADRLO,a			;  2) 接收低字节地址
  mov    dpl,a
  jnb    RX,$	
  clr    RX
  mov    a,b				;  3) 接收字节的个数
  mov    COUNT,a

  mov    a,r0				;开始判断接收命令的类型 
  cjne   a,#01h,cmd_2	
  acall  sector_e			;01-扇区擦除
  sjmp   cmd_end
cmd_2:	
  cjne   a,#02h,cmd_3	
  acall  program_b			;02-字节编程
  sjmp   cmd_end
cmd_3:				
  cjne   a,#03h,cmd_4
  acall  verify_b			;03-字节校验
  sjmp   cmd_end
cmd_4:				
  cjne   a,#04h,cmd_5	
  acall  BLOCK_E			;04-块擦除
  sjmp   cmd_end
cmd_5:				
  acall  BURST_P			;05-闪速编程
  sjmp   cmd_end
cmd_6:				
  jnb    RX,$  
  clr    RX
  mov    a,b
  mov    PCDATA,a			;接收加密的数据
  acall  LOCK_P			;06-加密编程				
cmd_end:			
  ajmp   loop				;转回主程序
;************************************************************************ 
;
; Name:	SECTOR ERASE ROUTINE
;
;	ENTRY:   (1) Starting Address (on a Sector Boundary)
;			R4 = Address Byte High

⌨️ 快捷键说明

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