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

📄 spk208.s

📁 The combined demo is dedicated for S1C33L05, so DMT33L05 should be used to load and run the demo. F
💻 S
📖 第 1 页 / 共 2 页
字号:
		xld.w	%r10, TMCTRL16_1
		ld.b   	[%r10],%r11    		// Timer16_1 stop
		xld.w	%r10, PRESC16_1
		ld.b   	[%r10],%r11   		// stop prescaler

		xld.w	%r10,TIMER16_1_IMASK
		bclr	[%r10],0x06			// disable comparison B intr.
		bclr	[%r10],0x07			// disable comparison A intr.

		xld.w	%r11, PWM_DUTY_9BIT // for 9bit PWM
		xld.w	%r10,COMPARE_B16_1
		ld.h   	[%r10],%r11 		// Reload value for timer fine mode

		xld.w	 %r11,0x0			
		xld.w	%r10,COMPARE_A16_1
		ld.h   	[%r10],%r11 		// first PWM output data

		xld.w	%r11,0x8 			
		xld.w	%r10,PRESC16_1
		ld.b   	[%r10],%r11 		// prescaler clock on, 1/1

		xld.w	%r10,TMCTRL16_1		// set Timer16
		bset	[%r10],6 			// fine mode on
		bset	[%r10],5 			// comparison buffer on
		bset	[%r10],4 			// output invert
		bset	[%r10],2 			// output
		bset	[%r10],1 			// reset
		bset	[%r10],0 			// run

		xld.w	%r10,P2_FUNCTION_SELECT
		bset   	[%r10],0x3	  		// P port change to timer output

//
//	PWM start TM0 Sub
//
		ld.w	%r11,0x00			
		xld.w	%r10, TMCTRL16_0
		ld.b   	[%r10],%r11    		// Timer16_0 stop
		xld.w	%r10, PRESC16_0
		ld.b   	[%r10],%r11   		// stop prescaler

		xld.w	%r10,TIMER16_0_IMASK
		bclr	[%r10],0x02			// disable comparison B intr.
		bclr	[%r10],0x03			// disable comparison A intr.

		xld.w	%r11, PWM_DUTY_9BIT	// for 9bit PWM
		xld.w	%r10,COMPARE_B16_0
		ld.h   	[%r10],%r11 		//	Reload value 0x101 for timer fine mode

		xld.w	%r11,0x0			
		xld.w	%r10,COMPARE_A16_0
		ld.h   	[%r10],%r11 		// first PWM output data

		xld.w	%r11,0x8 			
		xld.w	%r10,PRESC16_0
		ld.b   	[%r10],%r11 		// prescaler clock on, 1/1

		xld.w	%r10,TMCTRL16_0		// set Timer16
		bset	[%r10],6 			// fine mode on
		bset	[%r10],5 			// comparison buffer on
		bset	[%r10],4 			// output invert
		bset	[%r10],2 			// output
		bset	[%r10],1 			// reset
		bset	[%r10],0 			// run

		xld.w	%r10,P2_FUNCTION_SELECT
		bset   	[%r10],0x2	  		// P port change to timer output


		xld.h	[SPK_SAMPLERATE],%r7
		xld.w	[SPK_SAMPLE_CHANGE_BUF],%r6 // buffer init SpkParams


		xld.w	%r12,COMPARE_A16_1	// set argument
		xld.w	%r13,PWM_DUTY_9BIT
		xcall	SpkSoftOpen

		ret




////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// void SpkOpen_2(BYTE *SpkParams, int ReloadValue)
//////	dose not destroy r6 - r9 
//////	for 15bit PWM stereo
//////
SpkOpen_2:

		xcall	SpkOpen_1


//
//	PWM start TM3
//
		ld.w	%r11,0x00			
		xld.w	%r10, TMCTRL16_3
		ld.b   	[%r10],%r11    		// Timer16_2 stop
		xld.w	%r10, PRESC16_3
		ld.b   	[%r10],%r11   		// stop prescaler

		xld.w	%r11, PWM_DUTY_9BIT	// for 9bit PWM
		xld.w	%r10,COMPARE_B16_3
		ld.h   	[%r10],%r11 		// Reload value 0x101 for timer fine mode

		xld.w	 %r11,0x0			
		xld.w	%r10,COMPARE_A16_3
		ld.h   	[%r10],%r11 		// first PWM output data

		xld.w	%r11,0x8 			
		xld.w	%r10,PRESC16_3
		ld.b   	[%r10],%r11 		// prescaler clock on, 1/1

		xld.w	%r10,TMCTRL16_3		// set Timer16
		bset	[%r10],6 			// fine mode on
		bset	[%r10],5 			// comparison buffer on
		bset	[%r10],4 			// output invert
		bset	[%r10],2 			// output
		bset	[%r10],1 			// reset
		bset	[%r10],0 			// run

		xld.w	%r10,P2_FUNCTION_SELECT
		bset   	[%r10],0x5	  		// P port change to timer output

//
//	PWM start TM4
//
		ld.w	%r11,0x00			
		xld.w	%r10, TMCTRL16_4
		ld.b   	[%r10],%r11    		// Timer16_4 stop
		xld.w	%r10, PRESC16_4
		ld.b   	[%r10],%r11   		// stop prescaler

		xld.w	%r11, PWM_DUTY_9BIT	// for 9bit PWM
		xld.w	%r10,COMPARE_B16_4
		ld.h   	[%r10],%r11 		// Reload value 0x101 for timer fine mode

		xld.w	 %r11,0x0			
		xld.w	%r10,COMPARE_A16_4
		ld.h   	[%r10],%r11 		// first PWM output data

		xld.w	%r11,0x8 			
		xld.w	%r10,PRESC16_4
		ld.b   	[%r10],%r11 		// prescaler clock on, 1/1

		xld.w	%r10,TMCTRL16_4		// set Timer16
		bset	[%r10],6 			// fine mode on
		bset	[%r10],5 			// comparison buffer on
		bset	[%r10],4 			// output invert
		bset	[%r10],2 			// output
		bset	[%r10],1 			// reset
		bset	[%r10],0 			// run

		xld.w	%r10,P2_FUNCTION_SELECT
		bset   	[%r10],0x6	  		// P port change to timer output


		xld.h	[SPK_SAMPLERATE],%r7
		xld.w	[SPK_SAMPLE_CHANGE_BUF],%r6 // buffer init SpkParams

		xld.w	%r12,COMPARE_A16_3	// set argument
		xld.w	%r13,PWM_DUTY_9BIT
		xcall	SpkSoftOpen

		ret



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// void SpkOpen_0(BYTE *SpkParams, int ReloadValue)
//////	dose not destroy r6 - r9 
//////	for 9bit PWM
SpkOpen_4:

		xcall SpkSetTimer5		// set trigger timer

//
//	PWM start TM1
//
		ld.w	%r11,0x00			
		xld.w	%r10, TMCTRL16_1
		ld.b   	[%r10],%r11    		// Timer16_1 stop
		xld.w	%r10, PRESC16_1
		ld.b   	[%r10],%r11   		// stop prescaler

		xld.w	%r10,TIMER16_1_IMASK
		bclr	[%r10],0x06			// disable comparison B intr.
		bclr	[%r10],0x07			// disable comparison A intr.

		xld.w	%r11, PWM_DUTY_9BIT	// for 9bit PWM
		xld.w	%r10,COMPARE_B16_1
		ld.h   	[%r10],%r11 		// Reload value for timer fine mode

		xld.w	 %r11,0x0			
		xld.w	%r10,COMPARE_A16_1
		ld.h   	[%r10],%r11 		// first PWM output data

		xld.w	%r11,0x8 			
		xld.w	%r10,PRESC16_1
		ld.b   	[%r10],%r11 		// prescaler clock on, 1/1

		xld.w	%r10,TMCTRL16_1		// set Timer16
		bset	[%r10],6 			// fine mode on
		bset	[%r10],5 			// comparison buffer on
		bset	[%r10],4 			// output invert
		bset	[%r10],2 			// output
		bset	[%r10],1 			// reset
		bset	[%r10],0 			// run

		xld.w	%r10,P2_FUNCTION_SELECT
		bset   	[%r10],0x3	  		// P port change to timer output

		xld.h	[SPK_SAMPLERATE],%r7
		xld.w	[SPK_SAMPLE_CHANGE_BUF],%r6 // buffer init SpkParams

		xld.w	%r12,COMPARE_A16_1	// set argument
		xld.w	%r13,PWM_DUTY_9BIT
		xcall	SpkSoftOpen

		ret



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkClose_0
//////

SpkClose_0:

		xld.w	%r12,COMPARE_A16_1		// set argument
		xcall 	SpkSoftClose		  

		// Stop PWM output TM1
		ld.w	%r11,0x0 			
		xld.w	%r10,TMCTRL16_1
		ld.b   	[%r10],%r11 	   		// stop Timer
		xld.w	%r10,PRESC16_1
		ld.b   	[%r10],%r11 	   		// stop Prescaler
		xld.w	%r10,P2_FUNCTION_SELECT
		xbclr	[%r10],0x3				// P port change to P23 output

		ret.d
		ld.w	%r4,BOOL_SUCCESS



////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkClose_1
//////

SpkClose_1:

		xld.w	%r12,COMPARE_A16_1		// set argument
		xcall	SpkSoftClose		

		// Stop PWM output TM1			
		ld.w	%r11,0x0 			
		xld.w	%r10,TMCTRL16_1
		ld.b   	[%r10],%r11 	   		// stop Timer
		xld.w	%r10,PRESC16_1
		ld.b   	[%r10],%r11 	   		// stop Prescaler
		xld.w	%r10,P2_FUNCTION_SELECT
		xbclr	[%r10],0x3				// P port change to P23 output

		// Stop PWM output TM0		
		xld.w	%r10,TMCTRL16_0
		ld.b   	[%r10],%r11 	   		// stop Timer
		xld.w	%r10,PRESC16_0
		ld.b   	[%r10],%r11 	   		// stop Prescaler
		xld.w	%r10,P2_FUNCTION_SELECT
		xbclr	[%r10],0x2				// P port change to outputt

		ret.d
		ld.w	%r4,BOOL_SUCCESS

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkClose_2
//////

SpkClose_2:

		xcall	SpkClose_1

		xld.w	%r12,COMPARE_A16_3		// set argument
		xcall	SpkSoftClose

		// Stop PWM output TM3
		ld.w	%r11,0x0 
		xld.w	%r10,TMCTRL16_3
		ld.b   	[%r10],%r11 	   		// stop Timer
		xld.w	%r10,PRESC16_3
		ld.b   	[%r10],%r11 	   		// stop Prescaler
		xld.w	%r10,P2_FUNCTION_SELECT
		xbclr	[%r10],0x5				//	P port change to output

		// Stop PWM output TM4
		xld.w	%r10,TMCTRL16_4
		ld.b   	[%r10],%r11 	   		// stop Timer
		xld.w	%r10,PRESC16_4
		ld.b   	[%r10],%r11 	   		// stop Prescaler
		xld.w	%r10,P2_FUNCTION_SELECT
		xbclr	[%r10],0x6				//	P port change to output

		ret.d
		ld.w	%r4,BOOL_SUCCESS


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////// SpkSoftening, SpkSoftOpen, SpkSoftClose
//////	 Set speak soft start and end time.
//////	 Speaker on and off delay time is following.
//////	 Delay time is (1/sampling_rate*2) * SPK_SOFTENING * (output_bit / 2) msec
//////


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	.section .bss
	.align 2

SPK_SOFTENING:
	.zero 2
	.text

SpkSoftening:
		xld.h [SPK_SOFTENING],%r6
		ret


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SpkTimerStart:
		xld.w	%r11,0x09
		xld.w	%r10,PRESC16_5
		ld.b	[%r10],%r11			// Run prescaler 1/2
		xld.w	%r10,TMCTRL16_5
		bset	[%r10],1 			// timer reset
		bset	[%r10],0 			// timer run
		ret
		
		
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
SpkTimerEnd:
		ld.w	%r11,0x0 			
		xld.w	%r10,TMCTRL16_5
		ld.b	[%r10],%r11			// stop Timer
		xld.w	%r10,PRESC16_5		
		ld.b	[%r10],%r11			// stop Prescaler
		ret


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	argument
//		%r12 = PWM output port address TMx
//		%r13 = CENTER_DATA of output bit


SpkSoftOpen:
		xld.h	%r4,[SPK_SOFTENING]
		cmp 	%r4,0x00
		jreq	SpkSoftStartEnd

		xcall	 SpkTimerStart

		ld.w	%r11,0x00			 // %r5 is counter
		
		xld.w	%r10,TIMER16_5_IFLAG
		xld.w	%r5,0xf0
		ld.b	[%r10],%r5			 // clear Underflow

SpkSoftStart:
		ld.h	[%r12],%r11			 // output data
		xld.h	%r4,[SPK_SOFTENING]
SpkSoftStartLoop:
		btst	[%r10],0x06
		jreq	SpkSoftStartLoop
		
		ld.b	[%r10],%r5			 // clear Underflow
		sub 	%r4,0x01
		jrgt	SpkSoftStartLoop

		cmp 	%r11,%r13
		jrlt.d	SpkSoftStart
		add 	%r11,0x01

		xcall	 SpkTimerEnd
SpkSoftStartEnd:
		ret


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//	argument
//		%r12 = PWM output port address TMx


SpkSoftClose:
		xcall	 SpkTimerStart

		ld.uh	%r13,[%r12]
		cmp 	%r13,0x00
		jreq.d	SpkSoftShutdownEnd

		xld.w	%r10,TIMER16_5_IFLAG
		xld.w	%r5,0xf0
		ld.b	[%r10],%r5			 // clear Underflow

SpkSoftShutdown:
		ld.h	[%r12],%r13			// output data
		xld.h	%r4,[SPK_SOFTENING]
SpkSoftShutdownLoop:
		btst	[%r10],0x06
		jreq	SpkSoftShutdownLoop

		ld.b	[%r10],%r5			 // clear Underflow
		sub 	%r4,0x01
		jrgt	SpkSoftShutdownLoop
//
		sub 	%r13,0x01
		jrge	SpkSoftShutdown

SpkSoftShutdownEnd:
		xcall	 SpkTimerEnd
		ret




⌨️ 快捷键说明

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