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

📄 5-6.asm

📁 《DSP嵌入式系统开发典型案例》此书的源代码
💻 ASM
字号:
   		.mmregs
   		.def main
   		.def 		ad50_data           
spsa0  	.set  	38h  					; 缓冲串口0子地址地址寄存器
spcd0  	.set  	39h   					; 缓冲串口0子地址数据寄存器
drr21  	.set  	40h   					; 缓冲串口1数据1接收寄存器
drr11  	.set  	41h   					; 缓冲串口1数据2接收寄存器
dxr21  	.set  	42h   					; 缓冲串口1数据2发送寄存器
dxr11   	.set  	43h   					; 缓冲串口1数据1发送寄存器
dxr10  	.set  	23h   					; 缓冲串口0数据1发送寄存器
drr10  	.set  	21h   					; 缓冲串口0数据1接收寄存器

spcr10  	  .set 	00h						; 设置缓冲串口的所有寄存器的子地址
spcr20	  .set 	01h
rcr10 	  .set 	02h
rcr20 	  .set  	03h
xcr10  	  .set 	04h
xcr20 	  .set 	05h
srgr10	  .set	06h
srgr20 	  .set 	07h
mcr10 	  .set	08h
mcr20 	  .set 	09h
rcera0  	  .set 	0ah
rcerb0 	  .set 	0bh
xcera0 	  .set 	0ch
xcerb0  	  .set 	0dh
pcr0    	  .set 	0eh
   
k_iptr  	.set 		000111000b<<07			; 设置中断向量表的地址,指向0x1C00
k_temp  	.set 		1111111b

b1        .set    0557h						; 滤波器的参数b1
b2        .set    1067h						; 滤波器的参数b2
b3        .set    1067h						; 滤波器的参数b3
b4        .set    0557h						; 滤波器的参数b4

a1        .set    0EEFh						; 滤波器的参数a1
a2        .set    10DCh						; 滤波器的参数a2 
a3        .set    0AF9h						; 滤波器的参数a3

k_a       .set    3            				; 滤波器参数a的个数 
k_b       .set    4            				; 滤波器参数b的个数
k_buffer  	 .set    8            				; 滤波器循环缓冲的大小 

buffery   .usect 	"filter_vars",k_buffer*2       	; 定义滤波器数据输出缓冲区
bufferx   .usect 	"filter_vars",k_buffer*2       	; 定义滤波器数据输入缓冲区
data_dp   .usect 	"filter_vars",0 			  	; 定义数据页指针
   
main:
   STM  		4000h,sp					  	; 设置堆栈指针
   LD  		#0h,dp					   	; 设置数据页指针

   LDM     	pmst,a					   	; 改变中断向量表首地址
   AND     	#k_temp,a
   OR      	#k_iptr,a
   STL     	a,ar6
   MVDM    	ar6,pmst
   NOP
   NOP
   NOP
   STM     	#0ffffh,tcr						; 关闭定时器
   STM     	#05h,prd						; 设置定时器周期寄存器
   STM     	#08e0h,tcr						; 设置定时器控制寄存器

   SSBX    	intm							; 关闭中断
   SSBX    	sxm
   ST      	#2491h,swwsr					; 设置外设等待时间寄存器
   NOP
   NOP
   SSBX    	xf							; 设置XF引脚为高
   NOP									; 等待硬件完成高电平检测
   NOP
   
dss_init:
   RSBX    	cpl							; 设置DSP的缓冲串口0的所有寄存器
   NOP
   NOP
   STM     	spcr10,spsa0
   NOP
   STM     	06h,spcd0           			; 写入06h到spcr10寄存器
   NOP
   stm     	spcr20,spsa0
   NOP
   STM     	200h,spcd0          			; 写入200h到spcr20寄存器
   NOP
   STM     	pcr0,spsa0
   NOP
   STM     	0eh,spcd0 
   NOP
   STM     	rcr10,spsa0
   NOP
   STM     	40h,spcd0
   NOP
   STM     	rcr20,spsa0
   NOP
   STM     	4h,spcd0
   NOP
   STM     	xcr10,spsa0
   NOP
   STM     	40h,spcd0
   NOP
   STM     	xcr20,spsa0
   NOP
   STM     	4h,spcd0
   NOP
   
   LD      	#64h,a             				; 等待一段时间
   RPT     	#50
   NOP
   
   STM     	spcr10,spsa0
   NOP
   STM     	07h,spcd0           			; 开启缓冲串口
   NOP
   STM     	spcr20,spsa0
   NOP
   STM     	201h,spcd0
   NOP
   RPT     	#50
   NOP

aic_init:									; 初始化AD50
   STM		0h,imr						; 设置中断寄存器     	
   ORM     	10h,imr
   STM		0ffffh,ifr						; 清上电复位可能影响的中断标志
   PORTW   	08h,02h
   NOP
   NOP
   NOP
   CALL    	wait
waitr$14$:
   STM     	0h,spsa0
   NOP
   LDM     	spcd0,a
   NOP
   NOP
   NOP
   AND    	#2h,0,a,a
   BC     	waitr$14$,aeq					; 判断是否可以写数据到AD50
   STM    	#101h,dxr10					; 设置AD50的控制寄存器1  
   CALL    	wait   
   STM     	0ffffh,ifr

waitr$17$:
   STM    	0h,spsa0
   NOP
   LDM    	spcd0,a 
   NOP
   NOP
   NOP
   AND   	#2h,0,a,a
   BC    	waitr$17$,aeq					; 判断是否可以写数据到AD50
   STM    	#210h,dxr10					; 设置AD50的控制寄存器2
   CALL    	wait
   STM     	0ffffh,ifr

waitr$22$:
   STM    	0h,spsa0
   NOP
   LDM    	spcd0,a 
   NOP
   NOP
   NOP
   AND    	#2h,0,a,a
   BC     	waitr$22$,aeq					; 判断是否可以写数据到AD50
   ; STM    	#430h,dxr10 					; 设置20kHz采样频率
   ; STM    	#440h,dxr10 					; 设置15kHz采样频率
   STM    	#400h,dxr10 					; 设置8kHz采样频率 
   CALL    	wait							; 设置AD50的控制寄存器4
   STM     	0ffffh,ifr

waitr$24$:
   STM    	0h,spsa0
   NOP
   LDM    	spcd0,a 
   NOP
   NOP
   NOP
   AND    	#2h,0,a,a
   BC     	waitr$24$,aeq					; 判断是否可以写数据到AD50
   STM    	#301h,dxr10					; 设置AD50的控制寄存器3
   CALL    	wait

   SSBX   	frct                 			; 设置数据的小数方式位
   STM    	#buffery,ar4					; 设置输出数据指针
   STM    	#bufferx, ar3					; 设置输入数据指针
   STM    	#buffery, ar5   
   STM    	#k_buffer,bk					; 设置循环指针
   STM    	#1, ar0
   NOP
   STM     	0ffffh,ifr						; 清中断标志寄存器
   NOP
   RSBX    	xf
   NOP
   NOP
   NOP
   LDM   	drr10,a						; 清空缓冲串口0的数据接收寄存器
   NOP
   STM     	0h,imr
   ORM     	10h,imr						; 设置缓冲串口0的接收中断
   NOP
   NOP
   RSBX   	intm							; 开启总中断
js:
   NOP
   NOP
   B     		js
   NOP
   NOP
   NOP
   
wait:   									; 延时子程序
   RPT    		#8048
   NOP
   RET  
   NOP
   NOP
   
ad50_data:     								; AD50接收数据中断子程序
   LDM   		drr10,a      				; 接收数据送到累加器A
   CALL  		filter 					; 调用滤波子程序
   NOP
   NOP
   RETE
   NOP
   NOP
   
filter:										; 滤波子程序
   NOP
   NOP
   NOP
   STL    	a,*ar3                     		; 采样数据送到ar3指向的数据空间
   NOP
   MAR    	*ar3-0%						; 调整指针ar3,适应滤波器算法
   MAR    	*ar3-0%
   MAR    	*ar3-0%
										; 开始做滤波算法
   MPY    	*ar3+0%,#b4,b          			; b=b4*x(i) 
   LD     	a,b
   MPY    	*ar3+0%,#b3,b            		; b=b3*x(i+1) 
   ADD     	a,b
   MPY    	*ar3+0%,#b2,b            		; b=b2*x(i+2) 
   ADD     	a,b
   MPY    	*ar3+0%,#b1,b            		; b=b1*x(i+3)
   ADD    	a,b                      		; y(x+3)=a   
   MPY    	*ar4+0%,#a3,b           			; b=y(i)*a3
   ADD    	a,b                      		; a=a+b  
   MPY    	*ar4+0%,#a2,b           		; b=y(i+1)*a2
   ADD    	a,b                      		; a=a+b   
   MPY    	*ar4+0%,#a1,b           			; a=y(i+2)*a1
   ADD    	a,b                      		; y(x+3)=a+b
 ;  STFA  	a,-2,b
   STH    	b,*ar4-0%               		; FILTER++  
 ;  STFA   	a,3,a
   STH    	a,dxr10                 		; 滤波后数据送到DA输出
   MAR    	*ar4-0%                 		; 调整滤波器数据指针,为下一次数据滤波做准备
   NOP
   NOP
   RET
   NOP
   NOP

⌨️ 快捷键说明

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