?? uart.asm
字號:
*********************************************************************************
* UART.ASM v1.00 *
* 版權(c) 2003- 北京合眾達電子技術有限責任公司 *
* 設計者: 段立鋒 *
*********************************************************************************
.file "uart.asm"
.c_mode
.mmregs
.copy "vc54x.inc" ; VC5402 Memory-Mapped Register Declaration
.copy "dec5416.inc" ; SEED DEC5416 Memory-Mapped Register Declaratio
.def _uart_read_reg
.def _uart_write_reg
.def _uart_int1
.ref _uarta_recbuff
.ref _uartb_recbuff
.ref _sys_statbuff
.text
*********************************************************************************
*UART操作函數 *
*********************************************************************************
*********************************************************************************
* *
* 函數定義:uint _uart_read_reg(uint channel, uint reg) *
* 功 能:串口初始化 *
* *
* 入口參數:A ---- channel:串口A或是串口B *
* (SP+n) ---- 寄存器reg,如果是.far_mode模式則n為2,否則n為1 *
* 出口參數:A ---- 讀回寄存器數據 *
* 資源使用:AR0,B *
* *
*********************************************************************************
_uart_read_reg: STM #_sys_statbuff,AR0
;將主頻設為80MHz
SSBX INTM
PSHM CLKMD
STM #0B,CLKMD ;switch to DIV mode
TstSatu1: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu1,BNEQ
STM #_CLK80,CLKMD ;switch to PLL X 10 mode
PllSatu1: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC PllSatu1,BEQ
RSBX INTM
;判斷是A通路還是B通路
STM #0,AH
SUB #uart_a,A
BC channel_b,ANEQ
.if __far_mode
LD 3H,A ; reg -> (addr)獲取寄存器的偏移量
.else
LD 2H,A
.endif
STL A,*AR0(UARTA3) ;寄存器的偏移量
PSHM SWWSR ;保存當前的系統等待時間
LDM SWWSR,A
OR #07000H,A ;設置系統為14個等待
STLM A,SWWSR
rega0: LD *AR0(UARTA3),A
STM #0,AH
SUB #0,A
BC rega1,ANEQ
PORTR uart_a+0,*AR0(UARTA0);讀第一個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
rega1: LD *AR0(UARTA3),A
SUB #1,A
Bc rega2,ANEQ
PORTR uart_a+1,*AR0(UARTA0);讀第二個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
rega2: LD *AR0(UARTA3),A
SUB #2,A
BC rega3,ANEQ
PORTR uart_a+2,*AR0(UARTA0);讀第三個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
rega3: LD *AR0(UARTA3),A
SUB #3,A
BC rega4,ANEQ
PORTR uart_a+3,*AR0(UARTA0);讀第四個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
rega4: LD *AR0(UARTA3),A
SUB #4,A
BC rega5,ANEQ
PORTR uart_a+4,*AR0(UARTA0);讀第五個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
rega5: LD *AR0(UARTA3),A
SUB #5,A
BC rega6,ANEQ
PORTR uart_a+5,*AR0(UARTA0);讀第六個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
rega6: LD *AR0(UARTA3),A
SUB #6,A
BC rega7,ANEQ
PORTR uart_a+6,*AR0(UARTA0);讀第七個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
rega7: LD *AR0(UARTA3),A
SUB #7,A
BC regerr,ANEQ
PORTR uart_a+7,*AR0(UARTA0);讀第八個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
channel_b: .if __far_mode
LD 3H,A ; reg -> (addr)獲取寄存器的偏移量
.else
LD 2H,A
.endif
STM #0,AH
STL A,*AR0(UARTA3) ;寄存器的偏移量
PSHM SWWSR ;保存當前的系統等待時間
LDM SWWSR,A
OR #07000H,A ;設置系統為14個等待
STLM A,SWWSR
regb0: LD *AR0(UARTA3),A
SUB #0,A
BC regb1,ANEQ
PORTR uart_b+0,*AR0(UARTA0);讀第一個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
regb1: LD *AR0(UARTA3),A
SUB #1,A
BC regb2,ANEQ
PORTR uart_b+1,*AR0(UARTA0);讀第二個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
regb2: LD *AR0(UARTA3),A
SUB #2,A
BC regb3,ANEQ
PORTR uart_b+2,*AR0(UARTA0);讀第三個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
regb3: LD *AR0(UARTA3),A
SUB #3,A
BC regb4,ANEQ
PORTR uart_b+3,*AR0(UARTA0);讀第四個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
regb4: LD *AR0(UARTA3),A
SUB #4,A
BC regb5,ANEQ
PORTR uart_b+4,*AR0(UARTA0);讀第五個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
regb5: LD *AR0(UARTA3),A
SUB #5,A
BC regb6,ANEQ
PORTR uart_b+5,*AR0(UARTA0);讀第六個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
regb6: LD *AR0(UARTA3),A
SUB #6,A
BC regb7,ANEQ
PORTR uart_b+6,*AR0(UARTA0);讀第七個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
regb7: LD *AR0(UARTA3),A
SUB #7,A
BC regerr,ANEQ
PORTR uart_b+7,*AR0(UARTA0);讀第八個寄存器
LD *AR0(UARTA0),A ;讀回值寫入寄存器A,做為返回值
B regrexit
regerr: LD #0FFFFH,A ;送錯誤標志
regrexit: POPM SWWSR
;將主頻設為當前時鐘
SSBX INTM
STM #0B,CLKMD ;switch to DIV mode
TstSatu2: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC TstSatu2,BNEQ
POPM CLKMD
PllSatu2: LDM CLKMD,B
AND #01B,B ;poll STATUS bit
BC PllSatu2,BEQ
RSBX INTM
.if __far_mode
FRET
.else
RET
.endif
*********************************************************************************
* *
* 函數定義:uint _uart_write_reg(uint channel, uint reg,uint regdata) *
* 功 能:串口初始化 *
* *
* 入口參數:A ---- channel:串口A或是串口B *
* (SP+n) ---- 寄存器reg,如果是.far_mode模式則n為2,否則n為1 *
* ---- 要寫入的數據regdata *
* 出口參數:A ---- 讀回寄存器數據 *
* 資源使用:AR0
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -