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

📄 2-1.asm

📁 《DSP嵌入式开发典型案例》 一书源码(第二章)
💻 ASM
字号:
          .ref 		start
          .def 	DMAINT0			; DMA中断0
          .def 	TIMERINT1		; 定时器1中断
          
SPCR0      .equ   018c0008h
PCR0       .equ   018c0024h
SPCR1      .equ   01900008h
PCR1       .equ   01900024h
SPCR2      .equ   01A40008h
PCR2       .equ   01A40024h		; 定义缓冲串口寄存器

XBGC       .equ   01880000h
XCECTL0    .equ   01880008h
XCECTL1    .equ   01880004h
XCECTL2    .equ   01880010h
XCECTL3    .equ   01880014h 	; 定义扩展总线寄存器

GBLCNTA    	.equ   01840028h
GBLCNTB    	.equ   0184002Ch
GBLIDXA    	.equ   01840030h
GBLIDXB    	.equ   01840034h
GBLADDRA   .equ   01840038h
GBLADDRB   .equ   0184003Ch
GBLADDRC   .equ   01840068h
GBLADDRD   .equ   0184006Ch 	; 定义DMA全局寄存器

PRICLT0    	.equ   01840000h
SECCTL0    	.equ   01840008h
SRC0       	.equ   01840010h
DST0       	.equ   01840018h
XFRCNT0    	.equ   01840020h 	; 定义DMA通道0寄存器

CTL0       	.equ   01940000h  
PRD0       	.equ   01940004h
CNT0       	.equ   01940008h
CTL1       	.equ   01980000h 
PRD1       	.equ   01980004h 
CNT1       	.equ   01980008h 	; 定义定时器寄存器

           	.data 
           	.global  	a1
                  
          	.text
start:
interrupt_init:								; 初始化中断
          SUB    		A0,A0, A0
          MVC    		CSR,B0
          MVC    		A0,ISTP
          AND    		0x0FFFFFFFE,B0,B0
          MVKL   	08102H,A0            	; 使能定时器1、DMA0和NMI中断
          MVKLH  	0000h,A0
          MVC    		B0,CSR               	; 禁止所有的可屏蔽中断
          MVC    		A0,IER
          MVKL   	064H,A15            ; 设置寄存器a15,用于累计DMA0中断的次数
          MVKLH  	000H,A15
                     
start_timer0:
          MVKL   	0, B0           		; 初始化定时器0
          MVKLH  	0194h, B0   
          MVKL   	1, A1
          MVKLH  	0h, A1 
          MVKL   	0301h ,A0    
          MVKLH  	0000h ,A0
          STW    		A0, *B0++[1]
          NOP    		2
          STW    		A1, *B0++[1]
          NOP   	 	2
          STW    		A1, *B0--[2]
          NOP    		2
          MVKL   	03C1h, A0
          MVKLH  	0, A0
          STW    		A0, *B0
          NOP    		3

mcbsps0_init:								; 初始化缓冲串口0
          MVKL  		SPCR0,B0			; 将缓冲串口引脚设置成通用I/O引脚
          MVKH  		SPCR0,B0
          LDW   		*B0,A0
          NOP   		3
          MVKL  		0FFFEh,A1
          MVKLH 		0FFFEh,A1
          AND   		A1,A0,A0
          STW   		A0,*B0
          NOP   		3
          MVKL  		PCR0, B0
          MVKH  		PCR0,B0
          LDW   		*B0,A0
          NOP   		3
          MVKL  		00003020h,A1
          MVKH  		00003020h,A1
          OR    		A1,A0,A0
          STW   		A0,*B0
          NOP   		3
          
mcbsps1_init: 								; 初始化缓冲串口1
          MVKL  		SPCR1,B0
          MVKH  		SPCR1,B0
          LDW   		*B0,A0
          NOP   		3
          MVKL  		0FFFEh,A1
          MVKLH 		0FFFEh,A1
          AND   		A1,A0,A0
          STW   		A0,*B0
          MVKL  		PCR1, B0
          MVKH  		PCR1,B0
          LDW   		*B0,A0
          NOP   		3
          MVKL  		00006020h,A1   			; 设置DX1引脚状态为高
          MVKH  		00006020h,A1
          OR    		A1,A0,A0
          STW   		A0,*B0
          NOP   		2
          NOP
          NOP
          
          MVKL   	5A00H, A1
          MVKLH  	065h, A1            
WAIT_FOR_FIFO0:								; 等待FIFO0初始化结束
          NOP    
          SUB    		A1,1,A1
          NOP    
    [A1]  B      		WAIT_FOR_FIFO0
          NOP    		5          

          MVKL   	PCR1,B0
          MVKH   	PCR1,B0
          LDW    		*B0,A0
          NOP    		3
          MVKL   	03000h,A1   				; 设置DX1引脚状态为低
          MVKH   	00h,A1
          STW   		A1,*B0
          NOP    		5
          STW   		A1,*B0
          NOP    		5
          
          MVKL   	5A00H, A1    				; 设置FIFO部分复位
          MVKLH  	065h, A1            
WAIT_FOR_FIFO1: 								; 等待FIFO1初始化结束
          NOP    		3
          SUB    		A1,1,A1
          NOP    		3
    [A1]  B      		WAIT_FOR_FIFO1
          NOP    		6
          
          MVKL  		PCR1, B0      			; 清空FIFO内容
          MVKH  		PCR1,B0
          LDW   		*B0,A0
          NOP   		3
          MVKL  		00006020h,A1   			; 设置DX1引脚状态为高
          MVKH  		00006020h,A1
          OR    		A1,A0,A0
          STW   		A0,*B0
          NOP   		2
          NOP
          NOP
          
          MVKL   	5A00H, A1    
          MVKLH  	065h, A1            
WAIT_FOR_FIFO2: 								; 等待FIFO2初始化结束
          NOP    		3
          SUB    		A1,1,A1
          NOP    		3
    [A1]  B      		WAIT_FOR_FIFO2
          NOP    		6

xbus_init:										; 初始化扩展总线
          MVKL  		XBGC, B0
          MVKH  		XBGC, B0 
          LDW   		*B0,A0
          MVKL  		04000h,A1
          MVKH  		00000h,A1
          OR    		A1,A0,A0
          STW   		A0,*B0
          NOP   		3
          
          MVKL  		XBGC, B0
          MVKH  		XBGC, B0 
          LDW   		*B0,A0
          MVKL  		04000h,A1
          MVKH  		00000h,A1
          OR    		A1,A0,A0
          STW   		A0,*B0
          NOP   		3
          
          MVKL  		XCECTL3,B0				; 初始化XCE3空间控制寄存器
          MVKH  		XCECTL3,B0				; 选择接口类型为32bitFIFO
          LDW   		*B0,A0					; 设置读写时序的参数
          MVKL  		0201h,A1
          MVKLH 		0201h,A1
          STW   		A1,*B0
          NOP   		3
          
dma_0_init: 									; 初始化DMA通道0
          MVKL  		PRICLT0,B0				; 工作方式为帧同步,32bit
          MVKH  		PRICLT0,B0				; 源地址不变,目的地址自增
          MVKL  		0040h,A1					; 同步事件为外部中断4
          MVKLH 		0E01h,A1					; DMA通道0停止
          STW   		A1,*B0     
          NOP   		3						; 初始化DMA通道0第二控制寄存器
          									; 电平触发方式,高有效
          MVKL 		SECCTL0,B0
          MVKH 		SECCTL0,B0
          LDW  		*B0,A0
          NOP   		3
          MVKL  		0A080h,A1
          MVKLH 		0008h,A1
          STW   		A1,*B0
          NOP   		3
          
          MVKL  		SRC0,B0					; 初始化源地址寄存器
          MVKH  		SRC0,B0
          MVKL  		0000h,A0
          MVKLH 		7000h,A0
          STW   		A0,*B0
          NOP   		3           				; 设定SRC0指向XCE3空间
          
          MVKL  		DST0,B0					; 初始化目的地址寄存器
          MVKH  		DST0,B0
          MVKL  		1000h,A0
          MVKLH 		8000h,A0
          STW   		A0,*B0
          NOP   		3            				; 设定DST0指向内部地址80001000h
          
          MVKL  		XFRCNT0 ,B0  			; 设定每次中断时DMA读取的数据个数
          MVKH  		XFRCNT0 ,B0				; 初始化传输计数寄存器
          MVKL  		02800h,A1					; 设置成1帧,每帧1024个数据
          MVKLH 		0000h,A1
          STW   		A1,*B0 
          NOP   		3          
          MVKL  		GBLCNTA ,B0
          MVKH  		GBLCNTA ,B0
          MVKL  		02800h,A1
          MVKLH 		0000h,A1
          NOP   		3 
          STW   		A1,*B0
          NOP   		3
          
          MVKL  		0FFFCh,A1
          MVKLH 		0h,A1
          AND   		A0,A1,A0
          NOP   		3
                
DX0_CLEAR:                    					; 打开FIFO0和FIFO1
          MVKL 		PCR0,B0
          MVKH 		PCR0,B0
          LDW   		*B0,A0
          NOP 		3
          MVKL 		0FFFFFFDFh,A1
          MVKH 		0FFFFFFDFh,A1
          AND  		A1,A0,A0
          STW 		A0,*B0
          NOP 		5
         
          STW 		A0,*B0
          NOP 		5
          
          MVC    		CSR, B0        			; 开中断
          OR     		01H,B0,B0
          MVC    		B0,CSR
          NOP    		3

timer1init:
          MVKL   	064H,A15       			; 设定a15为DMA0中断次数为100次
          MVKLH  	000H,A15
          MVKL   	0,  B0               		; 设置定时器1寄存器
          MVKLH  	0198H,B0
          MVKL   	0300h,A0
          MVKLH  	00h,  A0         
          STW    		A0,    *B0
          NOP    		4 
          
          MVKL   	04H,  B0    
          MVKLH  	0198H,  B0
          ;MVKL   	08480h,A0
          ;MVKLH  	01Eh,  A0
          MVKL   	06EE0h,A0
          MVKLH  	01Fh,  A0
          STW    		A0,    *B0
          NOP    		4 
          
          SUB    		A0,A0,A0
          NOP    		4
          MVKL   	08H,  B0    
          MVKLH  	0198H, B0
          STW    		A0, *B0
          NOP    		4   
          
          MVKL   	0,  B0               
          MVKLH  	0198H,B0
          MVKL   	03E0h,A0
          MVKLH  	00h, A0         
          STW    		A0,*B0
          NOP    		4                                   

waittimer1:                  					; 等待DMA0中断
          NOP    
          NOP
          NOP
          NOP 
          NOP
          NOP
          NOP      
          B      		waittimer1  
          NOP    		5
          NOP
          NOP

DMAINT0:  								; DMA0中断服务程序
          NOP    		3
          MVKL   	000H,A8
          MVKLH  	000H,A8
          MVKL   	1000H,A3
          MVKLH  	08000H,A3     
          MVKL   	02800H,B1     		; 累加数据的格式
          
LOOP:                          
          MVKL   	000H,A8
          MVKLH  	000H,A8
          NOP    		4 
          STW   		A8,*A3                                                                                                                                             
                                                                                                                                                                                                                                                                                                                                                                                                                                                 
          MVKL   	003FFFH,B5
          MVKLH  	0,B5
          NOP    		3
          LDW    		*A3,A4
          NOP    		4
          AND    		B5,A4,A5
          SHL	 		A4,18,B4
          SHR	 		B4,18,A4
          STW    		A4,*A3++
          NOP    		3
    [B1]  SUB    		B1,1,B1
          NOP
          NOP
    [B1]  B      		LOOP         
          NOP    		5
          NOP
          NOP
                               			; 累计DMA中断的次数 
          SUB    		A15,1,A15
          SHL    		A15,0,B1
    [!B1] B      		ENDDMA
          NOP    		5
          NOP
          NOP
          
          MVKL  		DST0,B0
          MVKH  		DST0,B0
          MVKL  		1000h,A0
          MVKLH 		8000h,A0
          STW   		A0,*B0
          NOP   		3  
          
          MVKL 		SECCTL0,B0
          MVKH 		SECCTL0,B0
          LDW  		*B0,A0
          NOP   		3
          MVKL  		0A080h,A1
          MVKLH 		0008h,A1
          STW   		A1,*B0
          NOP   		3
          
          MVKL  		XFRCNT0 ,B0  		; 设定每次DMA中断读取数据的个数
          MVKH  		XFRCNT0 ,B0
          MVKL  		02800h,A1
          MVKLH 		0000h,A1
          STW   		A1,*B0 
          NOP   		3          
            
          MVKL  		PRICLT0,B0     		; 开启DMA通道0
          MVKH  		PRICLT0,B0
          LDW   		*B0,A0
          MVKL  		0001h,A1
          MVKLH		0000h,A1
          NOP   		3
          OR    		A0,A1,A0  
          NOP   		3   
                    
          B      		IRP
          STW   		A0,*B0          
          NOP    		3
          NOP
          NOP

ENDDMA:   
          MVKL   	dma_0_init,A1
          MVKH   	dma_0_init,A1          
          MVC    		A1,IRP
          NOP    		3
          B      		IRP
          NOP    		5       
          NOP
          NOP

TIMERINT1:         						; 定时器1中断,表明FIFO已经满
          MVKL  		PCR0, B0      		; 禁止FIFO存储数据
          MVKH  		PCR0,B0
          LDW   		*B0,A0
          NOP   		3
          MVKL  		00003020h,A1
          MVKH  		00003020h,A1
          OR    		A1,A0,A0
          STW   		A0,*B0
          NOP   		3   
          STW   		A0,*B0
          NOP   		3                    
           
          MVKL   	0,  B0      			; 禁止定时器1
          MVKLH  	0198H,B0
          MVKL   	0300h,A0
          MVKLH  	0,A0
          STW    		A0,*B0
          NOP    		3 
          NOP  

          MVKL   	open_dma0,A1
          MVKH   	open_dma0,A1 
         ;MVKL   		mcbsps0_init,A1
         ;MVKH   	mcbsps0_init,A1         
          MVC    		A1,IRP
          NOP    		3
          B      		IRP
          NOP    		5       
          NOP
          NOP
          
open_dma0:							
          MVKL  		PRICLT0,B0
          MVKH  		PRICLT0,B0
          MVKL  		0040h,A1
          MVKLH 		0E01h,A1
          STW   		A1,*B0     
          NOP   		3
          
          MVKL 		SECCTL0,B0
          MVKH 		SECCTL0,B0
          LDW  		*B0,A0
          NOP   		3
          MVKL  		0A080h,A1
          MVKLH 		0008h,A1
          STW   		A1,*B0
          NOP   		3
         
          MVKL  		SRC0,B0
          MVKH  		SRC0,B0
          MVKL  		0000h,A0
          MVKLH 		7000h,A0
        	STW   		A0,*B0
        	NOP   		3 
       
        	MVKL  		DST0,B0
        	MVKH  		DST0,B0
        	MVKL  		1000h,A0
        	MVKLH 		8000h,A0
        	STW   		A0,*B0
        	NOP   		3            	; 设定DST0指向内部数据空间地址 80001000h
       
        	MVKL  		XFRCNT0 ,B0  
       	MVKH  		XFRCNT0 ,B0
        	MVKL  		02800h,A1
        	MVKLH 		0000h,A1
        	STW   		A1,*B0 
        	NOP   		3          
        	MVKL  		GBLCNTA ,B0
        	MVKH  		GBLCNTA ,B0
        	MVKL  		02800h,A1
        	MVKLH 		0000h,A1
        	NOP   		3 
        	STW   		A1,*B0
        	NOP   		3

         MVKL  		PRICLT0,B0    
         MVKH  		PRICLT0,B0
         LDW   		*B0,A0
         MVKL  		0001h,A1
         MVKLH 		0000h,A1
         NOP   		3
         OR    		A0,A1,A0  
         STW   		A0,*B0          
         NOP   		5  
waiting:
          NOP
          NOP 
          NOP
          NOP 
          NOP
          NOP 
          NOP
          NOP 
          NOP
          NOP           
          B      		waiting
          NOP    		5
          
         .end          

⌨️ 快捷键说明

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