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

📄 sci_final.asm

📁 dsp2107上的串口通信程序
💻 ASM
字号:
			.include  	"F2407REGS.H"           ;引用头部文件
N			.set    3				;发送接收16个数据
RXD_PTR		        .set 	60h				;临时存放接收到的数据
FRE			.set    61h
        	        .bss	STACK,6 			
			.def    _c_int0
;=================================================================================
;(1)建立中断向量表
		       .sect	".vectors"			;定义主向量段
RSVECT		        B    _c_int0				;PM 0	复位向量		1
INT1	  	        B    GISR1			        ;PM 2	中断优先级1		4
INT2	  	        B    PHANTOM			        ;PM 4	中断优先级2		5
INT3	  	        B    PHANTOM				;PM 6	中断优先级3		6
INT4	  	        B    PHANTOM				;PM 8	中断优先级4		7
INT5	  	        B    PHANTOM				;PM A	中断优先级5		8
INT6	  	        B    PHANTOM				;PM C	中断优先级6		9
RESERVED  	        B    PHANTOM				;PM E	 (保留位)		10
SW_INT8   	        B    PHANTOM				;PM 10 	用户定义软件中断   	-
;			.


SW_INT31  	        B    PHANTOM			        ;PM 3E 	用户定义软件中断	-


;中断子向量入口定义pvecs
			.sect	".pvecs"			;定义子向量段
PVECTORS	        B	PHANTOM				;保留向量地址偏移量0000h 
			B	PHANTOM				;保留向量地址偏移量0001h
			B	PHANTOM				;保留向量地址偏移量0002h
			B	PHANTOM				;保留向量地址偏移量0003h
			B	PHANTOM				;保留向量地址偏移量0004h						  					
			B	PHANTOM				;保留向量地址偏移量0005h
			B	SCI_RX_ISR			;保留向量地址偏移量0006h SCI接收中断
			B	PHANTOM				;保留向量地址偏移量0007h
			B	PHANTOM				;保留向量地址偏移量0008h
			B	PHANTOM				;保留向量地址偏移量0009h
			B	PHANTOM				;保留向量地址偏移量000Ah
			B	PHANTOM				;保留向量地址偏移量000Bh
			B	PHANTOM				;保留向量地址偏移量000Ch
			B	PHANTOM				;保留向量地址偏移量000Dh
			B	PHANTOM				;保留向量地址偏移量000Eh
			B	PHANTOM				;保留向量地址偏移量000Fh
			B	PHANTOM				;保留向量地址偏移量0010h
			B	PHANTOM				;保留向量地址偏移量0011h
			B	PHANTOM				;保留向量地址偏移量0012h
			B	PHANTOM				;保留向量地址偏移量0013h
			B	PHANTOM				;保留向量地址偏移量0014h
			B	PHANTOM				;保留向量地址偏移量0015h
			B	PHANTOM				;保留向量地址偏移量0016h
			B	PHANTOM				;保留向量地址偏移量0017h
			B	PHANTOM				;保留向量地址偏移量0018h
			B	PHANTOM				;保留向量地址偏移量0019h
			B	PHANTOM				;保留向量地址偏移量001Ah
			B	PHANTOM				;保留向量地址偏移量001Bh
			B	PHANTOM				;保留向量地址偏移量001Ch
			B	PHANTOM				;保留向量地址偏移量001Dh
			B	PHANTOM				;保留向量地址偏移量001Eh
			B	PHANTOM				;保留向量地址偏移量001Fh
			B	PHANTOM				;保留向量地址偏移量0020h
			B	PHANTOM				;保留向量地址偏移量0021h
			B	PHANTOM				;保留向量地址偏移量0022h
			B	PHANTOM				;保留向量地址偏移量0023h
			B	PHANTOM				;保留向量地址偏移量0024h
			B	PHANTOM				;保留向量地址偏移量0025h
			B	PHANTOM				;保留向量地址偏移量0026h
			;B	T1PINT_ISR			;保留向量地址偏移量0027h,T1PINT中断
			B	PHANTOM				;保留向量地址偏移量0028h
  			B	PHANTOM				;保留向量地址偏移量0041h  
			

;==============================================================================
;(2)主程序:        
        	.text
;         data table
*******************************************************


_c_int0    
			SETC 	INTM				;关总中断
   			CLRC 	SXM				;符号扩展位清零
   			CLRC 	OVM				;清楚溢出标志位
			CLRC 	CNF				;B0区被配置为数据空间
			SPM 	0				;乘积输出不移位
				
			LDP 	#0E0H
			SPLK	#06FDH,SCSR1 		        ;CLKIN=10M,1倍频,CLKOUT=10 M 
			SPLK	#0E8h,WDCR			;关看门狗
			
			LDP	#00H
			SPLK	#01H,IMR			;使能INT1,INT2
			SPLK	#0FFFFh,IFR			;清中断标志
						
			CALL	SCI_INIT			;串口初始化
			CALL	DA_INIT				;DA初始化
						
			LAR	AR1,#SCIRXBUF		        ;接收缓冲寄存器地址
			LAR	AR2,#RXD_PTR		        ;接收的数据指针
			
			LDP	#00H
			SPLK	#02H,	60H			;设置默认输出锯齿波
			SPLK	#0AAH,	61H			;设置默认频率50Hz
			SPLK	#0AFH,	62H			;设置默认幅值0AFH
			SPLK	#00H,	67H			;计数清零
			SPLK	#00H,	68H			;计数清零
			SPLK	#00H,	69H			;计数清零
			
			LAR	AR5,#STACK


			CLRC	INTM				;开总中断
;=========================================================================
OUTPUT:
			LDP	#0H			        ;选择波形
			LACL	60H
			SUB	#01H
			BCND	A1, EQ				;方波,跳至方波输出程序
			SUB	#01H
			BCND	A2, EQ				;锯齿波,跳至锯齿波输出程序
			SUB	#01H
			BCND	A3,EQ				;三角波,跳至三角波输出程序
			B	OUTPUT_END		        ;波形不正确,跳出中断
			
A1:	
			LDP	#0H
			LACL	#07FH				;判断是否到128个点
			SUB	67H				;
			BCND	HIGH,  C			;不到的话输出高电平
			SPLK	#0H,  64H			;到的话输出0
			OUT 	64H,  0300H
			B	S1

HIGH:		        LACL	62H
			SACL	64H
			OUT	64H,  0300H
S1:			LACL	#0FFH				;判断是否到256个点
			SUB	67H
			BCND	S2,	NEQ			;到256个点就清67H并返回
			SPLK	#0H,	67H
			B	OUTPUT_END	
S2:			LDP	#0H			        ;不到256个点就加1返回
			LACL	67H
			ADD	#01H
			SACL	67H
			B 	OUTPUT_END

A2:	

			LDP	#0H
			LT	68H				;把记数的值放入TREG	
			MPY	62H				;和设定的幅值相乘
			SPM 	#0H

			PAC					;PREG右移8位给ACC
			RPT 	#7 
			SFR
			SACL	64H				
			OUT	64H,0300H			;把64H中的值放入0300H
			LACL	#0FFH				;累加器放入FFH
			SUB	68H				;计算是否数了256个点
			BCND	T1, NEQ
			SPLK	#0H,  68H			;并把68中的数清0
			B	OUTPUT_END

T1:		        LDP	#0H				;记数器的值加1并返回
			LACL	68H
			ADD	#01H
			SACL	68H
			B 	OUTPUT_END

A3:
			LDP	#0H
			LT	69H				;把记数的值放入TREG	
			MPY	62H				;和设定的幅值相乘
			SPM 	#0H

			PAC					;PREG右移8位给ACC
			RPT 	#7 
			SFR
			SACL	64H				
			OUT	64H,0300H			;把64H中的值放入0300H
			LACL	#07FH				;累加器放入7FH
			SUB	69H				;计算是否数了128个点
			BCND	Q1, C
			LACL    #0FFH
                        SUB     69H
                        BCND    Q2,NEQ
                        SPLK    #0H,69H
                        B       OUTPUT_END

Q1:		        LDP	#0H		                ;产生三角波上升沿			
			LACL	69H
			ADD	#01H
			SACL	69H
			B 	OUTPUT_END
Q2:                     LDP	#0H                             ;产生三角波下降沿
                        LACL	69H
                        SUB	#01H
                        SACL	69H
                        B 	OUTPUT_END
		
OUTPUT_END:							;中断返回
								;恢复现场  
;						
			
			
			LDP     #00H
			MAR	*,AR6
			LAR	AR6,61H
WAIT:		        NOP
		
			
			B	OUTPUT
		
;=============================================================================		                                         
;(3)串行通信初始化程序:
SCI_INIT:
			LDP 	#MCRA>>7
			LACL	MCRA				;被寻址的存储空间的值加载到累加器ACC的低16位,ACC高16位填零
			OR	#03H				;将MCRA.0和MCRA.1置1,其余位不变
			SACL	MCRA				;配置串行口引脚为特殊功能:TXD、RXD
			
			LDP 	#DP_PF1				;DP_PF1	.set 224;页(7000h/80h)(0XE0)	
			SPLK 	#0007H,SCICCR   	        ;空闲模式,8位数据,;1位停止位, 无奇校验
			SPLK 	#0003H,SCICTL1 		        ;SLEEP=0
   			SPLK 	#0002H,SCICTL2 		        ;接收、发送中断使能
   			SPLK 	#000H,SCIHBAUD
   			SPLK 	#081H,SCILBAUD 		        ;波特率为9600 ;10M
   			SPLK	#000H,SCIPRI                    ;设置为高优先级
   			SPLK 	#0027H,SCICTL1 		        ;串口初始化完成

			LAR	AR1,#SCIRXBUF		        ;接收缓冲寄存器地址
			LAR	AR2,#RXD_PTR		        ;接收的数据指针
            
                        LDP	#00H
                        SPLK	#0001h,IMR			;允许INT1中断
			SPLK	#0FFFFh,IFR			;清所有中断标志
			
			CLRC	INTM				;开总中断
			RET
			        
;================================================================================
;(4)D/A初始化程序
DA_INIT:		    
			LDP 	#MCRC>>7 			;IOPE7为output low 
			LACL 	MCRC
			AND 	#0FF7FH				;设置为一般I/0口
			SACL 	MCRC
			LACL 	PEDATDIR				
			OR 	#8000H				;定义为输出
			AND 	#0FF7FH				;输出值为0
			SACL 	PEDATDIR			;设置输出值				
			RET

;================================================================================
;(6)SCI接收中断程序       
GISR1:		
			MAR	*,AR5
			SST	#1,*+
			SST	#0,*+
			SACH	*+
			SACL	*   			        ;保护现场     		
			
			LDP	#0E0H
			LACC	PIVR,1				;读取外设中断向量寄存器(PIVR),并左移一位
			ADD	#PVECTORS			;加上外设中断人口地址
			BACC					;跳到相应的中断服务子程序
;==================================================
SCI_RX_ISR:	
			
			LAR	AR1,#SCIRXBUF			;接收缓冲寄存器地址
	    	        LDP	#DP_PF1
			MAR	*,AR1	
			BIT	SCICTL1,BIT2	
			BCND	RXD_DATA,NTC			;SLEEP=0,接收数据

			LACC	*				;读入地址
			SUB     #3CH
			BCND	SCI_RX_END,NEQ			;地址错误,退出中断

			SPLK	#0033H,SCICTL1			;地址为<,则清SLEEP=0,表示准备接收数据
			B	SCI_RX_END

RXD_DATA:
								;接收N个数据
			LACC	*,AR2				;从SCIRXBUR(AR1)读入数据
			SACL	*+,AR0				;保存数据,将当前辅助寄存器设置成AR0
			LAR	AR0,#RXD_PTR
			ADRK	#N
			MAR	*,AR2
			CMPR	00                       	;判断AR2是否与AR0相等,若相等,则已经接受完,TC置1,否则置0
			BCND	SCI_RX_END,NTC			;判是否接收完,若TC=0,则表示没有接受完,跳转至SCI_RX_END,继续接收
			
			LAR	AR1,#SCIRXBUF
			LAR	AR2,#RXD_PTR			;已接收完,恢复接收的数据指针 
			LDP     #SCICTL1>>7
			SPLK	#0037H,SCICTL1			;置SLEEP=1表示准备接收地址
				
			LDP	#00H
			SPLK	#00H,	67H			;计数清零
			SPLK	#00H,	68H			;计数清零
			SPLK	#00H,	69H			;计数清零



SCI_RX_END: 							;中断返回
		        MAR	*,AR5
			LACL	*-
			ADDH	*-
			LST	#0,*-
			LST	#1,*    		        ;恢复现场
			CLRC	INTM				;开总中断,因为一进中断就自动关闭总中断
			RET 					
;==================================================
;(9)假中断程序
PHANTOM 	
			KICK_DOG				;复位看门狗
			RET
			
			END			

;=================================================================



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -