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

📄 interrupts.asm

📁 dsp转换USB通讯程序样例
💻 ASM
字号:

#include "defBF531.h"
#include "BF531_USB_Head.h"


.extern AudioFrameCnt;
.extern UsbAudioBuffer;

.extern Ch1Vol,Ch2Vol,Ch3Vol,Ch4Vol;

.extern	UsbABuf_RPtr,UsbABuf_RPtrPre,UsbABuf_RPtrPst;
.extern	UsbABuf_WPtr,UsbABuf_WPtrPre,UsbABuf_WPtrPst;
.extern	UsbABuf_RWPtrSamePage;
.extern	UsbABuf_WBeyondR_Distance;

.extern Led0Tgl,Led0Off,Led0On;
.extern Led1Tgl,Led1Off,Led1On;
.extern Led2Tgl,Led2Off,Led2On;
.extern Led3Tgl,Led3Off,Led3On;

.extern Rx0BufStartAddr,Tx0BufStartAddr;
.extern	Rx0_BufA, Rx0_BufB;
.extern	Tx0_BufA, Tx0_BufB;

.extern	OutPutGainTableForAllCh;

.extern UsDelay;

.section SECTION_Code1;
.global _SPORT0_RX_ISR;
_SPORT0_RX_ISR:

//-------------------------------------------------------------------------------
//push registers into stack----start
    [ --SP ] = RETI;
    [ --SP ] = RETN;
    [ --SP ] = RETE;
    [ --SP ] = RETX;
    [ --SP ] = RETS;
    [ --SP ] = ASTAT;
    [ --SP ] = USP;
    [ --SP ] = FP;  
    [ --SP ]=r0;[ --SP ]=r1;[ --SP ]=r2;[ --SP ]=r3;
    [ --SP ]=r4;[ --SP ]=r5;[ --SP ]=r6;[ --SP ]=r7;
    
    [ --SP ]=p0;[ --SP ]=p1;[ --SP ]=p2;
    [ --SP ]=p3;[ --SP ]=p4;[ --SP ]=p5;
    
    [ --SP ]=i0;[ --SP ]=i1;[ --SP ]=i2;[ --SP ]=i3;
    [ --SP ]=m0;[ --SP ]=m1;[ --SP ]=m2;[ --SP ]=m3;
    [ --SP ]=l0;[ --SP ]=l1;[ --SP ]=l2;[ --SP ]=l3;
    [ --SP ]=b0;[ --SP ]=b1;[ --SP ]=b2;[ --SP ]=b3;
    
	[ --SP ]=a0.w;[ --SP ]=a1.w;//??
    
    [ --SP ]=lc0;[ --SP ]=lt0;[ --SP ]=lb0;
    [ --SP ]=lc1;[ --SP ]=lt1;[ --SP ]=lb1;
    
//push registers into stack----end
//-------------------------------------------------------------------------------

	//call Led3On;
	p0.l=BlinkCnt;
	p0.h=BlinkCnt;
	r0=[p0];
	r0+=1;
		
	r1=750;
	cc=r0<r1;
	if cc jump NoBlink;
	
	p1.l=lo(FIO_FLAG_T);
	p1.h=hi(FIO_FLAG_T);
	r7.l=0xe000;
	//w[ p1 ]=r7.l;
	
	r0=0;
	
NoBlink:
	[p0]=r0;
//-------------------------------------------------------------------------------
//clear interrupt flag, and blink LED0 to indicate each 750 frames----start
	// Confirm interrupt
	// Clear DMA_DONE bit in DMA1 status register
	P0.L = LO(DMA1_IRQ_STATUS);
	P0.H = HI(DMA1_IRQ_STATUS);
	R1.L = W[ P0 ];
	BITSET(R1,0);
	W[ P0 ] = R1.L; 
	//ssync;

		
	P0.L = AudioFrameCnt;
	P0.H = AudioFrameCnt;
	R1 = [ P0 ];
	R1 += 1;
	[ P0 ] = R1;
	R0 = 750;
	CC = R1==R0;
	IF !CC JUMP SportIntrLEDNotToggle;	
SportIntrLEDToggle:	
	//call Led0Tgl;
	P0.L = AudioFrameCnt;
	P0.H = AudioFrameCnt;
	R1 = 0;
	[ P0 ] = R1;
SportIntrLEDNotToggle:

//clear interrupt flag, and blink LED0 to indicate each 750 frames----end
//-------------------------------------------------------------------------------

//-------------------------------------------------------------------------------
//check weather SPORT DMA buffer A to use or B to use ----start

	p0.l=Rx0_BufA;
	p0.h=Rx0_BufA;		//p0 points to Rx0 buffer A
	
	p1.l=Tx0_BufA;
	p1.h=Tx0_BufA;		//p1 points to Tx0 buffer A
	
	P2.L = AudioFrameCnt;
	P2.H = AudioFrameCnt;
	R1 = [ P2 ];
	cc=bittst(r1,0);
	if cc jump ToUseTxBufferA;
ToUseTxBufferB:

	p0.l=Rx0_BufB;
	p0.h=Rx0_BufB;		//p0 points to Rx0 buffer B
	
	p1.l=Tx0_BufB;
	p1.h=Tx0_BufB;		//p1 points to Tx0 buffer B
	
ToUseTxBufferA:

	p2.l=Rx0BufStartAddr;
	p2.h=Rx0BufStartAddr;
	r0=p0;
	[ p2 ]=r0;			//save Rx0 buffer start address
	
	p2.l=Tx0BufStartAddr;
	p2.h=Tx0BufStartAddr;
	r0=p1;
	[ p2 ]=r0;			//save Tx0 buffer start address
	
//check whether SPORT DMA buffer A to use or B to use ----end
//-------------------------------------------------------------------------------



//-------------------------------------------------------------------------------
// audio process start
	//here audio process is: Output Gain for each channel ONLY
	//prepare audio out DMA buffer pointer first
	p4.l=Tx0BufStartAddr;
	p4.h=Tx0BufStartAddr;
	r1=[ p4 ];
	p4=r1;

	//check if UsbABuf_WBeyondR_Distance>64
	p0.h=UsbABuf_WBeyondR_Distance;
	p0.l=UsbABuf_WBeyondR_Distance;
	r0=[ p0 ];
	r1=32;
	cc=r0<r1;
	if cc jump WPtrNotBeyondEnough_UsbAudioSampleNotEnough;
	WPtrBeyondEnough_UsbAudioSampleEnough:
	
		call Led1Tgl;
		//Get 32 samples for 4 channels from UsbAudioBuffer, according tp RPtr
		//first RPtrPre=RPtr
		p1.h=UsbABuf_RPtr;
		p1.l=UsbABuf_RPtr;
		p2.h=UsbABuf_RPtrPre;
		p2.l=UsbABuf_RPtrPre;
		r0=[ p1 ];
		[ p2 ]=r0;
		
		//prepare circular buffer of UsbAudioBuf
		l0=240*UsbAudioBufferSlotSize*2;
		r1.l=(UsbAudioBuffer);
		r1.h=(UsbAudioBuffer);
		b0=r1;
		i0=r0;					//the source
		m0=4;
		
		//source check, if source is not XXE4, then indicate error
		r1=0x000f;
		r1=r1&r0;
		r1.h=0;
		r0.h=0;
		r0.l=0x0004;
		cc=r0==r1;
		if cc jump SourceCheckOK;
		SourceCheckBad:
			call Led3On;
		SourceCheckOK:
		
		//output gain coef prepare
		p0.l=Ch1Vol;
		p0.h=Ch1Vol;
		r1.l=w[ p0 ];
		p0.l=Ch2Vol;
		p0.h=Ch2Vol;
		r1.h=w[ p0 ];
		
		p0.l=Ch3Vol;
		p0.h=Ch3Vol;
		r2.l=w[ p0 ];
		p0.l=Ch4Vol;
		p0.h=Ch4Vol;
		r2.h=w[ p0 ];
		
		
		p5 = FrameLength;
		lsetup(OutputUsbAudio_LoopStart, OutputUsbAudio_LoopEnd) lc1=p5;
		OutputUsbAudio_LoopStart:
			r0=[ i0++ m0 ];
			//output gain for ch1 and ch2
			A1=R0.H*R1.H,A0=R0.L*R1.L;
			r0.l=a0,r0.h=a1;	//Ch1 and Ch2 in r0
			[ p4++ ]=r0;
			
			r0=[ i0++ m0 ];
			//output gain for ch3 and ch4
			A1=R0.H*R2.H,A0=R0.L*R2.L;
			r0.l=a0,r0.h=a1;	//Ch3 and Ch4 in r0
		OutputUsbAudio_LoopEnd:
			[ p4++ ]=r0;

			
		//save RPtr, and RPtrPst=RPtr
		p1.h=UsbABuf_RPtr;
		p1.l=UsbABuf_RPtr;
		r0=i0;
		[ p1 ]=r0;
		p2.h=UsbABuf_RPtrPst;
		p2.l=UsbABuf_RPtrPst;
		[ p2 ]=r0;
			
		
		//UsbABuf_RWPtrSamePage update
		//if RPtrPos-RPtrPre < 0 then RWPtrSamePage*=-1
		p0.h=UsbABuf_RPtrPre;
		p0.l=UsbABuf_RPtrPre;
		p1.h=UsbABuf_RPtrPst;
		p1.l=UsbABuf_RPtrPst;
		r0=[ p0 ];
		r1=[ p1 ];
		r1=r1-r0;
		cc=r1<0;
		if !cc jump _NotToNeg_RWPtrSamePage;
			_ToNeg_RWPtrSamePage:
				p0.h=UsbABuf_RWPtrSamePage;
				p0.l=UsbABuf_RWPtrSamePage;
				r0=[ p0 ];
				r0= -r0;
				[ p0 ]=r0;
			_NotToNeg_RWPtrSamePage:
				nop;
					
		//update UsbABuf_WBeyondR_Distance
		p0.h=UsbABuf_RWPtrSamePage;
		p0.l=UsbABuf_RWPtrSamePage;
		r0=[ p0 ];
		cc=r0<0;
		if cc jump _RWPtrIsNotInSamePage;
		_RWPtrIsInSamePage:
			//the distance that WPtr beyond RPtr is:
			//d=(Wptr-RPte)>>3;
			p0.h=UsbABuf_RPtr;
			p0.l=UsbABuf_RPtr;
			p1.h=UsbABuf_WPtr;
			p1.l=UsbABuf_WPtr;
			r0=[ p0 ];
			r1=[ p1 ];
			r1=r1-r0;
			r1>>=3;
					
			p0.h=UsbABuf_WBeyondR_Distance;
			p0.l=UsbABuf_WBeyondR_Distance;
			[ p0 ]=r1;
					
			jump AudioProcessFinishes;	
					
		_RWPtrIsNotInSamePage:
			//the distance that WPtr beyond RPtr is:
			//d=(Wptr+240*UsbAudioBufferSlotSize*2-RPte)>>3;
			p0.h=UsbABuf_RPtr;
			p0.l=UsbABuf_RPtr;
			p1.h=UsbABuf_WPtr;
			p1.l=UsbABuf_WPtr;
			r0=[ p0 ];
			r1=[ p1 ];
			r1=r1-r0;
			r0=240*UsbAudioBufferSlotSize*2;
			r1=r1+r0;
			r1>>=3;
					
			p0.h=UsbABuf_WBeyondR_Distance;
			p0.l=UsbABuf_WBeyondR_Distance;
			[ p0 ]=r1;
		
			jump AudioProcessFinishes;	
		
		
	WPtrNotBeyondEnough_UsbAudioSampleNotEnough:
		//output all zeros
		//move audio samples into tx0 buf
		r0=0;
		
		p5 = FrameLength;
		lsetup(OutputAllZeros_LoopStart, OutputAllZeros_LoopEnd) lc1=p5;
		OutputAllZeros_LoopStart:
			[ p4++ ]=r0;
		OutputAllZeros_LoopEnd:
			[ p4++ ]=r0;
	
		jump AudioProcessFinishes;
		
	
AudioProcessFinishes:
		
// audio process end
//-------------------------------------------------------------------------------

	//r0=300;
	//call UsDelay;
	//call Led3Off;
	
//-------------------------------------------------------------------------------
//pop registers from stack----start
SPORT0_RX_ISR_Finish:

	
	
    lb1=[ SP++ ];lt1=[ SP++ ];lc1=[ SP++ ];	
    lb0=[ SP++ ];lt0=[ SP++ ];lc0=[ SP++ ];	
    
    a1.w=[ SP++ ];a0.w=[ SP++ ];//??
    
	b3=[ SP++ ];b2=[ SP++ ];b1=[ SP++ ];b0=[ SP++ ];
	l3=[ SP++ ];l2=[ SP++ ];l1=[ SP++ ];l0=[ SP++ ];
	m3=[ SP++ ];m2=[ SP++ ];m1=[ SP++ ];m0=[ SP++ ];
	i3=[ SP++ ];i2=[ SP++ ];i1=[ SP++ ];i0=[ SP++ ];
	
	p5=[ SP++ ];p4=[ SP++ ];p3=[ SP++ ];
	p2=[ SP++ ];p1=[ SP++ ];p0=[ SP++ ];
	
	r7=[ SP++ ];r6=[ SP++ ];r5=[ SP++ ];r4=[ SP++ ];
	r3=[ SP++ ];r2=[ SP++ ];r1=[ SP++ ];r0=[ SP++ ];

	FP = [ SP++ ];	
	USP = [ SP++ ];	
	
	ASTAT = [ SP++ ];	
	RETS = [ SP++ ];
	RETX = [ SP++ ];
	RETE = [ SP++ ];
	RETN = [ SP++ ];
	RETI = [ SP++ ];
	
//pop registers from stack----end
//-------------------------------------------------------------------------------

#ifdef SoftSimu	
	RTS;
#endif	

#ifndef SoftSimu	
	RTI;
#endif	
	
_SPORT0_RX_ISR.end:	

⌨️ 快捷键说明

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