⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uart.asm

📁 5416完整例程
💻 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 + -