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

📄 spwm.asm

📁 DSP的汇编程序
💻 ASM
字号:
FCL		.usect  	".data0", 1			;保存载波频率浮点数的低位
FCH		.usect  	".data0", 1			;保存载波频率浮点数的高位
FRL		.usect  	".data0", 1			;保存信号频率浮点数的低位
FRH		.usect  	".data0", 1			;保存信号频率浮点数的高位
AL		.usect  	".data0", 1			;保存调谐度浮点数低位
AH		.usect  	".data0", 1			;保存调谐度浮点数高位
N       .usect  	".data0", 1	   	 	;保存一周期要输出的PWM脉冲个数
NL		.usect  	".data0", 1			;保存一周期要输出的PWM脉冲个数浮点数低位
NH		.usect  	".data0", 1			;保存一个周期要输出的PWM脉冲个数浮点数低位
I		.usect  	".data0", 1			;保存当前输出的是第几个脉冲
T3PR_TEMPL  .usect 	".data0", 1			;保存定时器3周期寄存器值的浮点数低位  
T3PR_TEMPH	.usect 	".data0", 1			;保存定时器3周期寄存器值的浮点数高位  
DATIOL		.usect 	".data0", 1			;保存占空比浮点数低位
DATIOH  	.usect 	".data0", 1			;保存占空比浮点数低位
DFLAG   	.usect  ".data0", 1			;送出一个脉冲的标志寄存器
ST0_CON0   	.usect  ".data0", 1
ST0_CON1   	.usect  ".data0", 1
ST1_CON0   	.usect  ".data0", 1
ST1_CON1   	.usect  ".data0", 1

STACK   	.usect  ".stack", 100h

		.include  "F2407REGS.H"         ;引用头部文件
		.ref 	  F$$ITOF, F$$DIV, F$$MUL, F$$FTOI, F$$ADD, F$$LTOF, F$$SUB
		.ref	  _sin
		.def      _c_int0

		;建立中断向量表
		.sect	".vectors"			;定义主向量段
RSVECT		B    _c_int0			;PM 0	Reset Vector		1
INT1	  	B    PHANTOM			;PM 2	Int level 1			4
INT2	  	B    GISR2				;PM 4	Int level 2			5
INT3	  	B    PHANTOM			;PM 6	Int level 3			6
INT4	  	B    PHANTOM			;PM 8	Int level 4			7
INT5	  	B    PHANTOM			;PM A	Int level 5			8
INT6	  	B    PHANTOM			;PM C	Int level 6			9
RESERVED 	B    PHANTOM			;PM E	(Analysis Int)		10
SW_INT8   	B    PHANTOM			;PM 10  User S/W int		-
SW_INT9   	B    PHANTOM			;PM 12  User S/W int		-
SW_INT10  	B    PHANTOM			;PM 14  User S/W int		-
SW_INT11  	B    PHANTOM			;PM 16  User S/W int		-
SW_INT12  	B    PHANTOM			;PM 18  User S/W int		-
SW_INT13  	B    PHANTOM			;PM 1A  User S/W int		-
SW_INT14  	B    PHANTOM			;PM 1C  User S/W int		-
SW_INT15  	B    PHANTOM			;PM 1E  User S/W int		-
SW_INT16  	B    PHANTOM			;PM 20  User S/W int		-
TRAP	  	B    PHANTOM			;PM 22  Trap vector			-
NMI	  		B    PHANTOM			;PM 24  Non maskable Int	3
EMU_TRAP 	B    PHANTOM			;PM 26  Emulator Trap		2
SW_INT20  	B    PHANTOM			;PM 28  User S/W int		-
SW_INT21  	B    PHANTOM			;PM 2A  User S/W int		-
SW_INT22  	B    PHANTOM			;PM 2C  User S/W int		-
SW_INT23  	B    PHANTOM			;PM 2E  User S/W int		-
SW_INT24  	B    PHANTOM			;PM 30  User S/W int		-
SW_INT25  	B    PHANTOM			;PM 32  User S/W int		-
SW_INT26  	B    PHANTOM			;PM 34  User S/W int		-
SW_INT27  	B    PHANTOM			;PM 36  User S/W int		-
SW_INT28  	B    PHANTOM			;PM 38  User S/W int		-
SW_INT29  	B    PHANTOM			;PM 3A  User S/W int		-
SW_INT30  	B    PHANTOM			;PM 3C  User S/W int		-
SW_INT31  	B    PHANTOM			;PM 3E  User S/W int		-

		;中断子向量入口定义pvecs
		.sect	".pvecs"		;定义子向量段
PVECTORS
		B	 PHANTOM			;Reserved pvector addr offset-0000h 
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset 
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset-0005h
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset-000ah
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset 
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset 
		B	 PHANTOM			;Reserved pvector addr offset-0010h
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset-0015h
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset 
		B	 PHANTOM			;Reserved pvector addr offset-001Ah
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset 
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset 
		B	 PHANTOM			;Reserved pvector addr offset-0020h
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset-0025h
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset-0027h  T1PINT中断
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset 
		B	 PHANTOM			;Reserved pvector addr offset-002Ah
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 T3GP_ISR			;pvector addr offset 0x02f - T3PINT 
		B	 PHANTOM			;Reserved pvector addr offset-0030h
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset-0035h
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset-003aAh
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset-003Fh
		B	 PHANTOM			;Reserved pvector addr offset
		B	 PHANTOM			;Reserved pvector addr offset-0041h			
			
		;主程序
		.text
_c_int0:     
     	CALL	SYSINIT			;调系统初始化子程序
		CALL	PWM_INIT		;调PWM初始化子程序
        LDP		#DP_B2
		SPLK	#2000H, FCL		;载波频率
		SPLK	#0, FCH
		SPLK	#032H, FRL		;信号频率
		SPLK	#0, FRH
		SPLK	#3E8H, AL		;调谐度AL=A*1000
		SPLK	#0, AH
		SPLK	#0, I			;I=0
		SPLK	#1, DFLAG
        CALL    JISUAN
LOOP: 	LDP		#DP_B2
		BIT		DFLAG, BIT0
		BCND	LOOP, NTC
		LACL	DFLAG
		AND		#0FFFEH
		SACL	DFLAG
		CALL	DATIO
		B		LOOP
		
		;系统初始化程序
SYSINIT:SETC	INTM 				;关闭中断
		CLRC	CNF					;B0区被配置为数据空间
		LDP		#0
		SPLK	#02h, IMR			;使能第1级中断2
		SPLK	#0FFFFh, IFR		;清第1级所有中断标志位
		
		LDP		#DP_PF1
		SPLK	#0E8h, WDCR			;禁止 WDT
		LDP 	#00E0H
		SPLK 	#81FEH, SCSR1    	;CLKIN=10M,CLKOUT=40 M
		RET	
		
PWM_INIT: 							; EVB模块的PWM初始化程序
		LDP		#DP_PF2
		LACL	MCRA
		OR		#07EH				;IOPE1~IOPE6 
		SACL	MCRC				;配置为特殊功能
		LACL	MCRC
		OR		#600h
		SACL	MCRC
		LDP		#DP_EVB
		SPLK	#0FFFFh, EVBIFRA	;清EVA的所有中断标志位
		SPLK	#0555h, ACTRB		;PWM12,10,8 为低, PWM11,9,7 为高
		SPLK	#00h, DBTCONB		;禁止死区控制
		SPLK	#1fh, CMPR4			;给比较寄存器赋初值
		SPLK	#2Fh, CMPR5
		SPLK	#3fh, CMPR6
		SPLK	#0960h, T3PR		;给周期寄存器赋初值
		
		LDP		#DP_B2
		SPLK	#0960h, T3PR_TEMPL
		SPLK	#0, T3PR_TEMPH
		LDP		#DP_EVB
		SPLK	#0A600h, COMCONB	;禁止比较功能
		SPLK	0, T3CNT
		SPLK	#41h, GPTCONB
		SPLK	#080h, EVBIMRA
		SPLK	#0000101101001110b, T3CON
		CLRC	INTM
		RET
		
;将一些整数转换为浮点数子程序, 得到计算占空比要用的常数
JISUAN: LDP		#DP_B2				;调谐度由整形转换为浮点
		LACL	AL
		LRLK    AR1, STACK	  		;设置 STACK指针
	 	SETC 	SXM	
		CALL	F$$ITOF, AR1		;A=a×1000
		CLRC	SXM
		MAR		*-
		LACC	*-, 16
	 	ADDS	*
	 	SACL	AL
	 	SACH	AH 	
		LRLK	AR1, STACK			;A/2000=0.5 a
	 	SETC	SXM
	 	LACL	#0
	 	SACL	*+
		LACL	#44FAH				;44FA 0000h =2000
	 	SACL	*+
	 	LACL	AL
	 	SACL	*+
	 	LACL	AH
	 	SACL	*+
	 	CALL	F$$DIV
	 	MAR		*-
		LACC	*-, 16
		ADDS	*
		SACL	AL
		SACH	AH
		LACL	T3PR_TEMPL
		LRLK    AR1, STACK
		SETC 	SXM					;定时器周期寄存器的值转换为浮点数
		CALL	F$$ITOF, AR1			
 	    CLRC	SXM
 	    MAR		*-
	 	LACC	*-, 16
		ADDS	*
		SACL	T3PR_TEMPL
		SACH	T3PR_TEMPH
	 	LACL	FCL					;FC值转换为浮点数
	 	LRLK    AR1, STACK 
	 	SETC 	SXM 	
	 	CALL	F$$LTOF, AR1
	 	CLRC	SXM
		MAR		*-
		LACC	*-, 16
 		ADDS	*
	 	SACL	FCL
	 	SACH	FCH
		LACL	FRL
	 	LRLK    AR1, STACK
	 	SETC 	SXM		  			;FR值转换为浮点数
	 	CALL	F$$ITOF, AR1
	 	CLRC	SXM
		MAR		*-
	 	LACC	*-,16
	 	ADDS	*
	 	SACL	FRL
	 	SACH	FRH
	 	LRLK    AR1, STACK			;N=FC/FR
	 	LACL	FRL
		SACL	*+
		LACL	FRH
		SACL	*+
		LACL	FCL
		SACL	*+
		LACL	FCH
		SACL	*+
		CALL	F$$DIV
		MAR		*-
		LACC	*-, 16
		ADDS	*
		SACL	NL
		SACH	NH					;N的浮点数
		LRLK    AR1, STACK
		SETC 	SXM
		SACL	*+
		SACH	*+
		CALL	F$$FTOI
	 	SACL	N					;N的整数
	 	LRLK	AR1, STACK
	 	SACL	*+
		LACL	NH
	 	SACL	*+
	 	LACL	#0F5C3H				;40C8F5C3h=6.282=2×3.141
	 	SACL	*+
	 	LACL	#40C8H
	 	SACL	*+
	 	CALL	F$$DIV
        MAR	    *-
		LACC	*-, 16
		ADDS	*
		SACL	NL
		SACH	NH
		RET
;计算占空比子程序
DATIO:	LDP		#DP_B2
		LACL	I   				;I由整形转换为浮点数
		LRLK    AR1, STACK
		SETC	SXM
		CALL	F$$ITOF, AR1
		CLRC	SXM
	 	MAR		*-
	 	LACC	*-, 16
	 	ADDS	*					;结果保存在 ACC
	 	LRLK	AR1, STACK			;i*2*3.14/N
	 	SACL	*+	
		SACH	*+
		LACL	NL
		SACL	*+
		LACL	NH
		SACL	*+
		CALL	F$$MUL
		MAR		*-
		ZALH	*-
		ADDS	*
		LRLK    AR1, STACK			;sin(i*2*3.14/N)	
		SACL	*+
		SACH	*+
		CALL	_sin				;结果在 ACC	
		LRLK    AR1, STACK			;0.5a*sin(i*2*3.14/N)	
		SACL	*+
		SACH	*+
		LACL	AL
		SACL	*+
		LACL	AH
		SACL	*+
		CALL	F$$MUL
		MAR		*-
		ZALH	*-
		ADDS	*					;结果在 ACC
		LRLK    AR1, STACK			;D=0.5+A*sin(i*2*3.14/N)
		SACL	*+
		SACH	*+
		LACL	#0
		SACL	*+
		LACL	#3F00H				;3F00 0000h =0.5
		SACL    *+
		CALL	F$$ADD
		MAR		*-
		ZALH	*-
		ADDS	*					;结果在 ACC
		LRLK	AR1, STACK
		SACL	*+
		SACH	*+
		LACL	T3PR_TEMPL
		SACL	*+
		LACL	T3PR_TEMPH
		SACL	*+
		CALL	F$$MUL
		MAR		*-
		ZALH	*-
		ADDS	*					;结果在 ACC	
		LRLK    AR1, STACK			;CMPR的浮点数转换为整数
        SETC 	SXM	
        SACL	*+
		SACH	*+
	 	CALL	F$$FTOI, AR1
	 	CLRC	SXM					;结果在 ACC
	 	SACL	DATIOL 
	 	LDP		#DP_B2
		LACC	I
		SUB		N
		BCND	NSPWM, GEQ
		LACC	I
		ADD		#1
		SACL	I
		B	 	RRET
NSPWM:	SPLK	#0, I				;断是否是下一个周期
RRET:	RET    
PHANTOM:KICK_DOG					;复位WD计数器
		RET
		
;定时器3中断程序
GISR2:	SST		#0, ST0_CON0		;保存状态寄存器 
		SST		#1, ST1_CON1	
		LDP		#0E0h				;DP指针指向 PIVR 所在的数据区
		LACC	PIVR, 1				;读 EVIVRB, 结果左移一位
		ADD		#PVECTORS			;加上偏移量		
		BACC
T3GP_ISR: LDP	#DP_B2 
		LACC	DFLAG
		OR		#1					;设置DFLAG.0=1
		SACL	DFLAG	
		LACL	DATIOL
		LDP		#DP_EVB
		SACL	CMPR4				;更新比较寄存器的值
		ADD		#32H
		SACL	CMPR5
		ADD		#32H
		SACL	CMPR6
		
		LDP		#DP_EVB
		SPLK	#0FFFFH, EVBIFRA
		CLRC	INTM
		
		LDP		#0
		LST		#1, ST1_CON1
		LST		#0, ST0_CON0
		RET
	    END

⌨️ 快捷键说明

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