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

📄 main.s54

📁 c5x中关于codec的实验
💻 S54
字号:
;******************************************************************************
;               		SJTU DSP Tech. Center
;        Copyright (c) 2002 SJTU DSP Tech. Center. All Rights Reserved.
;  History:
;		Date		Authors			Changes
;		2003/08/30	Fu Xuan			Created.
;******************************************************************************
	.mmregs
	
	.include 	"codec_cnst.h54"
	.include 	"dsp_cnst.h54"
	.include 	"macro.h54"
	
;**************************constants*******************************************
DATA_STORE_SIZE		.set	1024
STACK_ADDR			.set	0x0500
;******************************************************************************

;************************memory allocation*************************************
	.bss	INPUT_PINGPONG_0, DATA_STORE_SIZE
	.bss	INPUT_PINGPONG_1, DATA_STORE_SIZE
	.bss	OUTPUT_PINGPONG_0, DATA_STORE_SIZE
	.bss	OUTPUT_PINGPONG_1, DATA_STORE_SIZE
	.bss	input_pingpong_flag, 1
	.bss	output_pingpong_flag, 1
	.bss	dmac0_int_flag, 1
	.bss	dmac4_int_flag, 1
;******************************************************************************

;**************************functions*******************************************
	.def 	main
	.ref  	DSPInit
;******************************************************************************

;**************************variables*******************************************
	.def	DATA_STORE_SIZE
	.def	INPUT_PINGPONG_0
	.def	INPUT_PINGPONG_1
	.def	OUTPUT_PINGPONG_0
;******************************************************************************

	.text
;******************************************************************************
;** Function:	main
;** Description:	Main program
;******************************************************************************
main:
	stm		#STACK_ADDR, SP

	;DSP initialization (inluding settings of CPLD, DMA and McBSP )
	call	DSPInit

	;LED0 shines to show that all initializations have finished
	LED0_ON	CNTL1

	sub		A
	;initialize INPUT_PINGPONG_0
	stm		#INPUT_PINGPONG_0, AR4
	rpt		#DATA_STORE_SIZE-1
	stl		A, *AR4+
	;initialize INPUT_PINGPONG_1
	stm		#INPUT_PINGPONG_1, AR4
	rpt		#DATA_STORE_SIZE-1
	stl		A, *AR4+
	;initialize OUTPUT_PINGPONG_0
	stm		#OUTPUT_PINGPONG_0, AR4
	rpt		#DATA_STORE_SIZE-1
	stl		A, *AR4+
	;initialize OUTPUT_PINGPONG_1
	stm		#OUTPUT_PINGPONG_1, AR4
	rpt		#DATA_STORE_SIZE-1
	stl		A, *AR4+
	
	;initialize dmac0_int_flag, dmac4_int_flag
	st		#0, *(dmac0_int_flag)
	st		#0, *(dmac4_int_flag)
	
	;initialize input_pingpong_flag
	st		#0, *(input_pingpong_flag)
	st		#0, *(output_pingpong_flag)
	
	;ready for data receive
	stm		#0x1040, IMR				;set IMR to enable DMA0, DMA4 Interrupt
	stm		#0xffff, IFR				;set IFR to clear pending interrupt

	;enable interrupts
	rsbx	INTM
	
	;enable channel 0 and 4 of DMA
	CHANNEL_ENABLE	#0x0011				;set DE[0]=1, DE[4]=1 to enable channel 0, 4

	;enable McBSP1 (set RRST=XRST=1)
	McBSP1_ENABLE	AR3

working_loop:
	;clear int_flag after Interrupts occur
	ld		*(dmac0_int_flag), B
	bc		working_loop, BEQ			;if B=0, we don't need to reset dmac0_int_flag
	st		#0, *(dmac0_int_flag)		;reset dmac0_int_flag

	;After DMA0 Interrupt, do some Information Processing here
	call	TO_DO_SOMETHING	

	b		working_loop
	
dead_loop:
	nop
	nop
	nop
	b		dead_loop

;******************************************************************************
;** Function:	TO_DO_SOMETHING
;** Description:
;**		Processing the data received from AD and send the result to DA
;******************************************************************************
TO_DO_SOMETHING:
	bitf	*(input_pingpong_flag), #1
	bc		IN_PINGPONG_1, TC
	
	;if input_pingpong_flag=0, processing INPUT_PINGPONG_1
	bd		TEST_OUT_PINGPONG
	stm		#INPUT_PINGPONG_0, AR2
	
IN_PINGPONG_1:
	stm		#INPUT_PINGPONG_1, AR2

TEST_OUT_PINGPONG:
	bitf	*(output_pingpong_flag), #1
	bc		OUT_PINGPONG_1, TC
	
	;if output_ping_flag=0, save result in OUTPUT_PINGPONG_1
	bd		PROCESSING
	stm		#OUTPUT_PINGPONG_0, AR3
	
OUT_PINGPONG_1:
	stm		#OUTPUT_PINGPONG_1, AR3
	
	;put your information processing program here
	;at this time, we just send the raw data back to DA without any processing
PROCESSING:
	stm		#512-1, BRC
	rptb	END_PROCESSING-1
	mvdd	*AR2+, *AR3+
	mvdd	*AR2+, *AR3+
	
END_PROCESSING:
	ret
	
;**************************vectors*********************************************
   	.sect   "vectors"
int_reset:
	b      	main        ;Main program
    nop
    nop

   .space	84*16

int_damc0:
	bd		DMAC0_ISR	;read data from DRR11 to INPUT_PINGPONG0/1
	pshm	ST0
	pshm	ST1

	.space	20*16
	
int_dmac4:
	bd   	DMAC4_ISR	;send data from OUTPUT_PINGPONG0/1 to DXR11
	pshm	ST0
	pshm	ST1
		
    .space  12*16

;*********************** Interrupt Service Routine ****************************
	.text

;******************************************************************************
;** Function:	DMAC0_ISR
;** Description:
;**		DMAC0 ISR for McBSP1 receive
;******************************************************************************
DMAC0_ISR:
	bitf	*(input_pingpong_flag), #1
	bcd		IN_PINGPONG1_SET, TC
	stm		#DMGDA, DMSA				;选中目的地址重载寄存器DMGDA

	;if input_pingpong_flag is 0, stroe #INPUT_PINGPONG_0 in DMSDN(不带地址自动增加得子区访问寄存器)
	bd		IN_PROCESS_EXIT
	stm		#INPUT_PINGPONG_0, DMSDN	;修改目的地址寄存器DMGDA到INPUT_PINGPONG_0
	
	;if input_pingpong_flag is 1, stroe #INPUT_PINGPONG_1 in DMSDN(不带地址自动增加得子区访问寄存器)
IN_PINGPONG1_SET:
	stm		#INPUT_PINGPONG_1, DMSDN	;修改目的地址寄存器DMGDA到INPUT_PINGPONG_1

IN_PROCESS_EXIT:
	xorm	#1, *(input_pingpong_flag)	;alter input_pingpong_flag when each interrupt come
	st		#1, *(dmac0_int_flag)		;set dmac0_int_flag when each interrupt come

	popm	ST1
	popm	ST0

	rete

;******************************************************************************
;** Function:	DMAC4_ISR
;** Description:
;**		DMAC4 ISR for McBSP1 send
;******************************************************************************
DMAC4_ISR:
	pshm	AL
	pshm	AH
	pshm	AG
	
	bitf	*(output_pingpong_flag), #1
	bcd		OUT_PINGPONG1_SET, TC
	stm		#DMSRC4, DMSA				;选中DMA4源地址寄存器DMSRC4

	;if output_pingpong_flag is 0, store #OUTPUT_PINGPONG_0 in DMSDN(不带地址自动增加得子区访问寄存器)
	bd		OUT_PROCESS_EXIT
	stm		#OUTPUT_PINGPONG_0, DMSDN	;DMSDN->DMSRC4
	
	;if output_pingpong_flag is 1, store #OUTPUT_PINGPONG_1 in DMSDN(不带地址自动增加得子区访问寄存器)
OUT_PINGPONG1_SET:
	stm		#OUTPUT_PINGPONG_1, DMSDN	;DMSDN->DMSRC4

OUT_PROCESS_EXIT:
	xorm	#1, *(output_pingpong_flag)	;alter output_pingpong_flag when each interrupt come
	st		#1, *(dmac4_int_flag)		;set dmac4_int_flag when each interrupt come
	CHANNEL_ENABLE	#0x0010				;enable DMA4
	
	popm	AG
	popm	AH
	popm	AL

	popm	ST1
	popm	ST0

	rete

    .end
;end of main.s54

⌨️ 快捷键说明

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