📄 iap_sst.asm.bak
字号:
;*********************************************************************************************************************
; 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 + -