?? iapisp.asm
字號(hào):
;/*------------------------------------------------------------------*/
;/* --- STC MCU International Limited -------------------------------*/
;/* --- STC IAP 系列單片機(jī)實(shí)現(xiàn)用戶ISP 演示程序 ----------------------*/
;/* --- Mobile: (86)13922805190 -------------------------------------*/
;/* --- Fax: 86-755-82944243 ----------------------------------------*/
;/* --- Tel: 86-755-82948412 ----------------------------------------*/
;/* --- Web: www.STCMCU.com -----------------------------------------*/
;/* 如果要在程序中使用或者在文章中引用該程序,請(qǐng)?jiān)诔绦蛑谢蛭恼轮凶⒚? */
;/* 使用了宏晶科技的資料或程序 */
;/*------------------------------------------------------------------*/
;------------------------------------------------
;/*定義常數(shù)*/
UARTBAUD EQU 0FBH ;定義串口波特率 (256-18432000/32/115200)
;ENABLE_IAP EQU 80H ;系統(tǒng)工作頻率<30MHz
;ENABLE_IAP EQU 81H ;系統(tǒng)工作頻率<24MHz
;ENABLE_IAP EQU 82H ;系統(tǒng)工作頻率<20MHz
ENABLE_IAP EQU 83H ;系統(tǒng)工作頻率<12MHz
;ENABLE_IAP EQU 84H ;系統(tǒng)工作頻率<6MHz
;ENABLE_IAP EQU 85H ;系統(tǒng)工作頻率<3MHz
;ENABLE_IAP EQU 86H ;系統(tǒng)工作頻率<2MHz
;ENABLE_IAP EQU 87H ;系統(tǒng)工作頻率<1MHz
;------------------------------------------------
;/*定義特殊功能寄存器*/
AUXR DATA 08EH ;附件功能控制寄存器
BRT DATA 09CH ;波特率發(fā)生器
WDT_CONTR DATA 0C1H ;看門狗控制寄存器
IAP_DATA DATA 0C2H ;IAP數(shù)據(jù)寄存器
IAP_ADDRH DATA 0C3H ;IAP高地址寄存器
IAP_ADDRL DATA 0C4H ;IAP低地址寄存器
IAP_CMD DATA 0C5H ;IAP命令寄存器
IAP_TRIG DATA 0C6H ;IAP命令觸發(fā)寄存器
IAP_CONTR DATA 0C7H ;IAP控制寄存器
;------------------------------------------------
;/*定義ISP模塊使用的變量*/
ISPCODE EQU 0EC00H ;ISP模塊入口地址(1頁(yè)),同時(shí)也是外部接口地址
APENTRY EQU 0EE00H ;應(yīng)用程序入口地址數(shù)據(jù)(1頁(yè))
;------------------------------------------------
ORG 0000H
LJMP ISP_ENTRY ;系統(tǒng)復(fù)位入口
RESET:
MOV SCON,#50H ;設(shè)置串口模式(8為可變,無(wú)校驗(yàn)位)
MOV AUXR,#15H ;BRT工作于1T模式,啟動(dòng)BRT
MOV BRT,#UARTBAUD ;設(shè)置重載值
NEXT1:
MOV R0,#16
NEXT2:
JNB RI,$ ;等待串口數(shù)據(jù)
CLR RI
MOV A,SBUF
CJNE A,#7FH,NEXT1 ;判斷是否為7F
DJNZ R0,NEXT2
LJMP ISP_DOWNLOAD ;跳轉(zhuǎn)到下載界面
;------------------------------------------------
;ISP功能模塊
;包括上電自檢模塊和代碼更新模塊
;------------------------------------------------
ORG ISPCODE
ISP_DOWNLOAD:
CLR A
MOV PSW,A ;ISP模塊使用第0組寄存器
MOV IE,A ;關(guān)閉所有中斷
CLR RI ;清除串口接收標(biāo)志
SETB TI ;置串口發(fā)送標(biāo)志
CLR TR0
MOV SP,#5FH ;設(shè)置堆棧指針
;------------------------------------------------
MOV A,#5AH ;返回5A 55到PC,表示ISP擦除模塊已準(zhǔn)備就緒
LCALL ISP_SENDUART
MOV A,#055H
LCALL ISP_SENDUART
LCALL ISP_RECVACK ;接收應(yīng)答數(shù)據(jù)
MOV IAP_ADDRL,#0 ;首先在第2頁(yè)起始地址寫 "LJMP ISP_ENTRY"指令
MOV IAP_ADDRH,#02H
LCALL ISP_ERASEIAP
MOV A,#02H
LCALL ISP_PROGRAMIAP ;編程用戶代碼復(fù)位向量代碼
MOV A,#HIGH ISP_ENTRY
LCALL ISP_PROGRAMIAP ;編程用戶代碼復(fù)位向量代碼
MOV A,#LOW ISP_ENTRY
LCALL ISP_PROGRAMIAP ;編程用戶代碼復(fù)位向量代碼
MOV IAP_ADDRL,#0 ;用戶代碼地址從0開始
MOV IAP_ADDRH,#0
LCALL ISP_ERASEIAP
MOV A,#02H
LCALL ISP_PROGRAMIAP ;編程用戶代碼復(fù)位向量代碼
MOV A,#HIGH ISP_ENTRY
LCALL ISP_PROGRAMIAP ;編程用戶代碼復(fù)位向量代碼
MOV A,#LOW ISP_ENTRY
LCALL ISP_PROGRAMIAP ;編程用戶代碼復(fù)位向量代碼
MOV IAP_ADDRL,#0 ;新代碼緩沖區(qū)地址
MOV IAP_ADDRH,#02H
MOV R7,#117 ;擦除59K字節(jié)
ISP_ERASEAP:
LCALL ISP_ERASEIAP
INC IAP_ADDRH ;目標(biāo)地址+512
INC IAP_ADDRH
DJNZ R7,ISP_ERASEAP ;判斷是否擦除完成
MOV IAP_ADDRL,#LOW APENTRY ;用戶代碼復(fù)位入口頁(yè)
MOV IAP_ADDRH,#HIGH APENTRY
LCALL ISP_ERASEIAP
MOV A,#5AH ;返回5A A5到PC,表示ISP編程模塊已準(zhǔn)備就緒
LCALL ISP_SENDUART
MOV A,#0A5H
LCALL ISP_SENDUART
LCALL ISP_RECVACK ;接收應(yīng)答數(shù)據(jù)
LCALL ISP_RECVUART ;接收長(zhǎng)度高字節(jié)
MOV R0,A
LCALL ISP_RECVUART ;接收長(zhǎng)度低字節(jié)
MOV R1,A
CLR C ;將總長(zhǎng)度-3
MOV A,#03H
SUBB A,R1
MOV DPL,A
CLR A
SUBB A,R0
MOV DPH,A ;總長(zhǎng)度補(bǔ)碼存入DPTR
LCALL ISP_RECVUART ;映射用戶代碼復(fù)位入口代碼到映射區(qū)
LCALL ISP_PROGRAMIAP ;0000
LCALL ISP_RECVUART
LCALL ISP_PROGRAMIAP ;0001
LCALL ISP_RECVUART
LCALL ISP_PROGRAMIAP ;0002
MOV IAP_ADDRL,#03H ;用戶代碼起始地址
MOV IAP_ADDRH,#00H
ISP_PROGRAMNEXT:
LCALL ISP_RECVUART ;接收代碼數(shù)據(jù)
LCALL ISP_PROGRAMIAP ;編程到用戶代碼區(qū)
INC DPTR
MOV A,DPL
ORL A,DPH
JNZ ISP_PROGRAMNEXT ;長(zhǎng)度檢測(cè)
ISP_SOFTRESET:
MOV IAP_CONTR,#20H ;軟件復(fù)位系統(tǒng)
SJMP $
;------------------------------------------------
ISP_ENTRY:
MOV WDT_CONTR,#17H ;清看門狗
MOV IAP_CONTR,#ENABLE_IAP ;使能IAP功能
MOV IAP_ADDRL,#00H ;電壓測(cè)試模塊
MOV IAP_ADDRH,#0ECH ;測(cè)試地址EC00H
MOV IAP_DATA,#53H ;測(cè)試數(shù)據(jù)1
MOV IAP_CMD,#1 ;讀命令
MOV IAP_TRIG,#5AH ;觸發(fā)ISP命令
MOV IAP_TRIG,#0A5H
MOV A,IAP_DATA
XRL A,#53H ;測(cè)試是否可以讀出數(shù)據(jù)
JZ ISP_ENTRY ;等待電壓穩(wěn)定
INC IAP_ADDRL ;測(cè)試地址EC01H
MOV IAP_DATA,#45H ;測(cè)試數(shù)據(jù)2
MOV IAP_CMD,#1 ;讀命令
MOV IAP_TRIG,#5AH ;觸發(fā)ISP命令
MOV IAP_TRIG,#0A5H
MOV A,IAP_DATA
XRL A,#45H ;測(cè)試是否可以讀出數(shù)據(jù)
JZ ISP_ENTRY ;等待電壓穩(wěn)定
MOV SCON,#50H ;設(shè)置串口模式(8為可變,無(wú)校驗(yàn)位)
MOV AUXR,#15H ;BRT工作于1T模式,啟動(dòng)BRT
MOV BRT,#UARTBAUD ;設(shè)置重載值
MOV TMOD,#01H
SETB TR0
LCALL ISP_RECVUART ;檢測(cè)是否有串口數(shù)據(jù)
JC GOTOAP
MOV R0,#16
ISP_CHECKNEXT:
LCALL ISP_RECVUART ;接收同步數(shù)據(jù)
JC GOTOAP
CJNE A,#7FH,GOTOAP ;判斷是否為7F
DJNZ R0,ISP_CHECKNEXT
MOV A,#5AH ;返回5A 69到PC,表示ISP模塊已準(zhǔn)備就緒
LCALL ISP_SENDUART
MOV A,#69H
LCALL ISP_SENDUART
LCALL ISP_RECVACK ;接收應(yīng)答數(shù)據(jù)
LJMP ISP_DOWNLOAD ;跳轉(zhuǎn)到下載界面
GOTOAP:
CLR A ;將SFR恢復(fù)為復(fù)位值
MOV TCON,A
MOV TMOD,A
MOV TL0,A
MOV TH0,A
MOV SCON,A
MOV AUXR,A
MOV BRT,A
LJMP APENTRY ;正常運(yùn)行用戶程序
;------------------------------------------------
;/*接收來(lái)自于上位機(jī)的串口應(yīng)答數(shù)據(jù)*/
ISP_RECVACK:
LCALL ISP_RECVUART
JC GOTOAP
XRL A,#7FH
JZ ISP_RECVACK ;跳過(guò)同步數(shù)據(jù)
CJNE A,#25H,GOTOAP ;應(yīng)答數(shù)據(jù)1檢測(cè)
LCALL ISP_RECVUART
JC GOTOAP
XRL A,#69H ;應(yīng)答數(shù)據(jù)2檢測(cè)
JNZ GOTOAP
RET
;------------------------------------------------
;/*接收1字節(jié)串口數(shù)據(jù)*/
;/*出口參數(shù): ACC (接收到的數(shù)據(jù))*/
;/*出口參數(shù): C (1:超時(shí))*/
ISP_RECVUART:
CLR A
MOV TL0,A ;初始化超時(shí)定時(shí)器
MOV TH0,A
CLR TF0
MOV WDT_CONTR,#17H ;清看門狗
ISP_RECVWAIT:
JBC TF0,ISP_RECVTIMEOUT ;超時(shí)檢測(cè)
JNB RI,ISP_RECVWAIT ;等待接收完成
MOV A,SBUF ;讀取串口數(shù)據(jù)
CLR RI ;清除標(biāo)志
CLR C ;正確接收串口數(shù)據(jù)
RET
ISP_RECVTIMEOUT:
SETB C ;超時(shí)退出
RET
;------------------------------------------------
;/*發(fā)送1字節(jié)串口數(shù)據(jù)*/
;/*入口參數(shù): ACC (待發(fā)送的數(shù)據(jù))*/
ISP_SENDUART:
MOV WDT_CONTR,#17H ;清看門狗
JNB TI,ISP_SENDUART ;等待前一個(gè)數(shù)據(jù)發(fā)送完成
CLR TI ;清除標(biāo)志
MOV SBUF,A ;發(fā)送當(dāng)前數(shù)據(jù)
RET
;------------------------------------------------
;/*擦除IAP扇區(qū)*/
ISP_ERASEIAP:
MOV WDT_CONTR,#17H ;清看門狗
MOV IAP_CONTR,#ENABLE_IAP ;使能IAP功能
MOV IAP_CMD,#3 ;擦除命令
MOV IAP_TRIG,#5AH ;觸發(fā)ISP命令
MOV IAP_TRIG,#0A5H
RET
;------------------------------------------------
;/*編程IAP字節(jié)*/
;/*入口參數(shù): ACC (待編程的數(shù)據(jù))*/
ISP_PROGRAMIAP:
MOV WDT_CONTR,#17H ;清看門狗
MOV IAP_CONTR,#ENABLE_IAP ;使能IAP功能
MOV IAP_CMD,#2 ;編程命令
MOV IAP_DATA,A ;將當(dāng)前數(shù)據(jù)送IAP數(shù)據(jù)寄存器
MOV IAP_TRIG,#5AH ;觸發(fā)ISP命令
MOV IAP_TRIG,#0A5H
MOV A,IAP_ADDRL ;IAP地址+1
ADD A,#01H
MOV IAP_ADDRL,A
MOV A,IAP_ADDRH
ADDC A,#00H
MOV IAP_ADDRH,A
RET
;------------------------------------------------
ORG APENTRY
LJMP RESET
;------------------------------------------------
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -