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

📄 uartlisr.s

📁 一款交换机BSP开发代码
💻 S
字号:
		
	
	SECTION	.bss

        
MBAR      		EQU     $30000000  	; Base address of all internal regs
SRAM_ADDR			EQU		$40000000	; isram base address
SRAM_LEN			EQU		$2000		; 8K

		XREF	_uart_buf
		XREF	_VER_FLAG
	
		
	SECTION	.rtext
	
; void UART2_Int(INT vector_num)
; {	
	ALIGN	4
	XDEF	_UART2_Int
_UART2_Int:
; 
; CHAR            receive;
; 
;     /* Process every character in the receive FIFO */
;     while (READ2_USR() & USR_RXRDY)

	MOVE.L	D0,-(A7)
   
       move.l _VER_FLAG,D0
       cmp.l #0,d0
       BNE _UART2_5307_1
     	MOVE.B	(MBAR+$184),D0
     	JMP _UART_CON1
_UART2_5307_1:
	MOVE.B	(MBAR+$204),D0
_UART_CON1:
	BTST	#0,D0
	JEQ		_UART2_int_end

;	lea	-24(a7),a7
;	movem.l	d5/d6/d7/a3/a4/a5,(a7)

	MOVE.L	D1,-(A7)
	MOVE.L	D2,-(A7)
	MOVE.L	A0,-(A7)
	MOVE.L	A1,-(A7)

	MOVE.L	#_uart_buf,A1

_UART2_int_loop:
;     {
; 
;         /* Put char into buffer */
;         receive = READ_URB();

       move.l d0,-(A7)
       move.l _VER_FLAG,D0
        cmp.l #0,d0
       BNE _UART2_5307_2
	MOVE.B	(MBAR+$18C),D2
	JMP _UART_CON2
_UART2_5307_2:
	MOVE.B	(MBAR+$20C),D2
_UART_CON2:
; 
;         /* Check for a damaged or incorrectly received character */
;         if ((READ_USR() & (USR_FRAME_ERR | USR_PARITY_ERR )) == 0)

       move.l (A7)+,d0
       
	EXTB.L	D0
	MOVEQ	#$60,D1
	AND.L	D0,D1
	JNE		_UART2_int_Error

;         {
; 	        if (uart_buf.status != UART_BUFFER_FULL)
	MOVE.L	16(A1),D0
	ADDQ.L	#1,D0
	JEQ		_UART2_int_Error
;             {
;                 /* Put the character into the buffer */
;                 *(uart_buf.write++) = receive;
	MOVE.L	12(A1),A0
	MOVE.B	D2,(A0)+
	MOVE.L	A0,12(A1)
; 
;                 /* If write pointer is at end, wrap it around */
;                 if (uart_buf.write > uart_buf.tail)
	CMP.L	4(A1),A0
	JLS		_UART2_int_No_Change
;                     uart_buf.write = uart_buf.head;
	MOVE.L	(A1),12(A1)
_UART2_int_No_Change:
; 
;                 /* Set status field based on latest character */
;                 if (uart_buf.write == uart_buf.read)
	MOVE.L	12(A1),A0
	CMP.L	8(A1),A0
	JNE		_UART2_int_Recv
;                     uart_buf.status = UART_BUFFER_FULL;
	MOVEQ	#-1,D0
	MOVE.L	D0,16(A1)
_UART2_int_Error:
       move.l _VER_FLAG,D0
       cmp.l #0,d0
       BNE _UART2_5307_3
	MOVE.B	(MBAR+$184),D0
	JMP _UART_CON3
_UART2_5307_3:
	MOVE.B	(MBAR+$204),D0
_UART_CON3:

	BTST	#0,D0
	JNE		_UART2_int_loop
	
	MOVE.L	(A7)+,A1
	MOVE.L	(A7)+,A0
	MOVE.L	(A7)+,D2
	MOVE.L	(A7)+,D1
	
	JRA		_UART2_int_end
_UART2_int_Recv:
;                 else
;                     uart_buf.status = UART_BUFFER_DATA;
	MOVE.L	#-2,D0
	MOVE.L	D0,16(A1)
	JRA		_UART2_int_Error
_UART2_int_end:
;	movem.l	(a7),d5/d6/d7/a3/a4/a5
;	lea	24(a7),a7
	MOVE.L	(A7)+,D0
	RTE
;             }
;         }
;     }
; }
;	rts




;函数test_ram(void * addr,long len)用来检测RAM地址空间数据的正确性。
;addr - RAM base_addr  ,  len - RAM range .
;Note : 改以line为单位检测,防止由于数据线上的数据维持影响检测的正确性。
;		同时可以检测RAM的burst性能。

	ALIGN	4
	XDEF	_test_ram
_test_ram:

		LEA	-48(A7),A7
		MOVEM.L	D0-D5/A0-A5,(A7)
		MOVE.L	52(A7),A0			; A0 = ADDR
		MOVE.L	56(A7),D5			; D5 = len

TEST_RAM_LOOP:

; Save A0
		MOVE.L	A0,A1

; Burst read a line 
		MOVEM.L	(A0),A2-A5

; Test RAM read/write
		MOVE.L	#$55555555,D0
		MOVE.L	#$AAAAAAAA,D1
		MOVE.L	#$33333333,D2
		MOVE.L	#$CCCCCCCC,D3

; Burst write a line
		MOVEM.L	D0-D3,(A0)

; Single read lwords ,check Burst write
		MOVE.L	(A1)+,D4
		CMP.L	D4,D0
		BNE		TEST_RAM_ERR
		MOVE.L	(A1)+,D4
		CMP.L	D4,D1
		BNE		TEST_RAM_ERR
		MOVE.L	(A1)+,D4
		CMP.L	D4,D2
		BNE		TEST_RAM_ERR
		MOVE.L	(A1)+,D4
		CMP.L	D4,D3
		BNE		TEST_RAM_ERR

		MOVE.L	A0,A1

; Burst read a line
		MOVEM.L	(A0),D0-D3

; Not all bits
		NOT.L	D0
		NOT.L	D1
		NOT.L	D2
		NOT.L	D3

; Write again
		MOVEM.L	D0-D3,(A0)

; Check again
		MOVE.L	(A1)+,D4
		CMP.L	D4,D0
		BNE		TEST_RAM_ERR
		MOVE.L	(A1)+,D4
		CMP.L	D4,D1
		BNE		TEST_RAM_ERR
		MOVE.L	(A1)+,D4
		CMP.L	D4,D2
		BNE		TEST_RAM_ERR
		MOVE.L	(A1)+,D4
		CMP.L	D4,D3
		BNE		TEST_RAM_ERR

; Restore D0-D3
		MOVEM.L	A2-A5,(A0)

; Pointer to next line
		MOVE.L	A1,A0
		SUB.L	#16,D5
        BNE		TEST_RAM_LOOP

;TEST_RAM_OK:
		MOVEM.L	(A7),D0-D5/A0-A5
		LEA		48(A7),A7
        MOVE.L  #0, D0						;return 0
        RTS
TEST_RAM_ERR:
		MOVEM.L	(A7),D0-D5/A0-A5
		LEA		48(A7),A7
        MOVE.L  #-1, D0						;return -1
        RTS

⌨️ 快捷键说明

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