?? 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 + -