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