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