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

📄 ex4.asm

📁 用dsp编写的四个程序,关于数组,还有语音,录音功能的实现
💻 ASM
字号:
************************************************
* FileName:		ex4.asm                        *
* Description:	同步串口实验                   *
* Copyright(C) SanZhi Electronic, Author Zpin  *
************************************************

		.title "ex4"

BSP			.set		0		;当前使用McBsp0, BSP,所用McBsp口标志
; BSP=0时,使用McBsp0,BSP=1时,使用McBsp1, 见后面条件编译.
; 本处给值0,使用McBsp0。

;McBsp 所用的内存映射寄存器的地址,它们是固定的,可查表。
SPSA0		.set    038h   ;McBsp0子地址寄存器
SPSD0		.set    039h   ;McBsp0串行口控制寄存器
DRR10		.set    021h   ;McBsp0数据接受寄存器1
DRR20		.set	020h   ;McBsp0数据接受寄存器2
DXR10		.set    023h   ;McBsp0数据发送寄存器1
DXR20		.set	022h   ;McBsp0数据发送寄存器2

SPSA1		.set    048h   ;这六个是McBsp1的相应寄存器,同上。
SPSD1       .set    049h   ;含义同上。其实它们可以用5402的
DRR11       .set	041h   ; .MMREG存储器定义文件来概括. 如以前有
DRR21       .set    040h   ; 的程序中使用的那样. 既加入 .mmreg
DXR11       .set    043h   ; 这里不用.MMREG定义文件是为了程序阅读.
DXR21       .set	042h   ;


;McBsp Subaddressed Registers
SPCR1		.set	00h   ;串口控制寄存器1的子地址
SPCR2		.set	01h   ;串口控制寄存器2的子地址
RCR1		.set	02h   ;接受控制寄存器1
RCR2		.set	03h   ;接受控制寄存器2
XCR1		.set	04h   ;发送控制寄存器1
XCR2		.set	05h
SRGR1		.set	06h   ;采样率发生寄存器1
SRGR2		.set	07h
MCR1		.set	08h   ;多通道控制寄存器1
MCR2		.set	09h
RCERA		.set	0ah   ;接受通道使能寄存器A
RCERB		.set	0bh
XCERA		.set	0ch   ;发送通道使能寄存器A
XCERB		.set	0dh
PCR			.set	0eh   ;引脚控制寄存器

		.if BSP = 0 ; 条件编译语句.以下是所用符号的定义.
SPSA	.set	SPSA0
SPSD	.set	SPSD0
RDRR	.set	DRR10
RDXR	.set	DXR10
		.endif
		
		.if BSP = 1 ; 条件编译语句.以下是所用符号的定义.
SPSA	.set	SPSA1
SPSD	.set	SPSD1
RDRR	.set	DRR11
RDXR	.set	DXR11
		.endif ; 条件编译语句.
		

WR_SUB_REG	.macro val,addr			;写McBsp控制寄存器
; 向所指定的McBsp控制寄存器写入内容val。
			stm addr,SPSA; 给出子地址寄存器SPSA地址
			nop
			stm val,SPSD; 向所指定的McBsp控制寄存器写入内容val。
			nop
			.endm
			
RD_SUB_REG	.macro addr,acc			;读McBsp控制寄存器
; 将所指定的McBsp控制寄存器的内容读到acc中。
			stm #:addr:,SPSA	; 给出子地址寄存器SPSA地址
				;
			nop
			ldm SPSD,acc	;将该串口的控制寄存器内容读到ACC
			nop
			nop
			nop
			.endm

WAITTRX   .macro					;等待串口中断
WAITR?
        RD_SUB_REG SPCR1,A	;将串口控制寄存器1内容读到A中。
        and #1<<1, A	;与1与,左移一位后再送回到A
        bc   WAITR?, AEQ	; A=0时,转向WAITR?
          .endm

PROGREG   .macro progword			;与AD50二次通讯
;把宏参数progword送到发送寄存器中
 		stm  #01h,RDXR	; 将#01H写到RDXR,既发送寄存器中
        WAITTRX	; 调用宏指令,等待串口控制寄存器内容第0位变成1
        stm     #:progword:,RDXR	;把宏参数progword送到发送寄存器中
        WAITTRX	;
          .endm               


wait   .macro	;等待一段时间的宏指令。很短时间。
  		STM #0008h, AR0	;
		RPT *AR0
		NOP
		.endm 			

		.mmregs ; 引入.MMREG存储器定义文件
		.global _c_int00


		.sect ".vectors" ; 中断矢量段代码开始

RESET	bd _c_int00	; 复位的中断矢量地址,既复位时
  ; 先执行下面的给SP赋值语句,然后程序转到_c_int00
		stm #2000h,SP
		.space 19*4*16
BRINT0	b recv	;在串口接受中断入口出设置转移到接受中断服务程序指令。
		nop
		nop
BXINT0	b trans	;;在串口发送中断入口出设置转移到接受中断服务程
		nop
		nop
		.space 10*4*16
;BRINT1	b recv ;这些语句是另一个串口的中断入口跳转指令。没有用到。
;	nop
;	nop
;BXINT1	b trans
;	nop
;	nop
;		.space 4*4*16
		

		.text
_c_int00
		ld #0h,DP
		stm #2000h,SP
		ssbx INTM
		ssbx SXM
        st #2491h,SWWSR   ; 这三个ST是应该为STM,为外设寄存器
        st #0ffe0h,PMST   ; 赋值指令,这里看来用ST也行。
        st #0f007h,CLKMD   ;时钟模式寄存器CLKMD内容=#0f007h
        ; CLKMD的地址为0058H,是外设寄存器映射寄存器。
        ; 注意映射寄存器的地址是固定的,表上有。
        stm #4000h,AR1
    	stm #4000h,ar2
        
mcbsp_init							;初始化McBsp串口
        rsbx CPL; ST1中的编译模式位CPL清0。
	    nop		;3个NOP在单步运行时查看CPL用,没有其他作用,可以删去。
     	nop		
		nop		

		ld   #0, DP              
		ssbx INTM      	;INTM=1,禁止中断。
		ssbx SXM  	; SXM=1, 有符号扩展

		WR_SUB_REG #0000H,SPCR1	;SPCR1=#0000H
		WR_SUB_REG #0200H,SPCR2	;#0200H给SPCR2	
		WR_SUB_REG #000CH,PCR	;#000CH给PCR
		WR_SUB_REG #0000H,SPCR1	;#0000H给SPCR1	
		WR_SUB_REG #0000H,SPCR2	;#0000H给SPCR2	
		WR_SUB_REG #0040H,RCR1  ;16 BITs
		WR_SUB_REG #0004H,RCR2  ;Ignore FS after the first
		WR_SUB_REG #0040H,XCR1  ;16 BITs
		WR_SUB_REG #0004H,XCR2		;Ignore FS after the first

		ld 100,A
		wait
		
		andm #0ff3fh, 54h			;set interrupts to come from serial ports not DMA
									;by clearing bits 6 and 7 in DMPREC
		stm #0,RDXR	;
		
		WR_SUB_REG #0001H,SPCR1		;启动McBsp串口
		WR_SUB_REG #0201H,SPCR2
		
		ld 100,A	;
		wait
		
aic_init
		stm #0h,IMR
		orm #030h,IMR
		stm #0ffffh,IFR	;清除所有的挂起中断请求
        PROGREG 0000001100000001b	;把该参数写到数据发送寄存器中
             ; 作用是什么,不清楚,可能是启动AD采样。
        PROGREG 0000010000010000b	;
             ;      876543210
		;PROGREG 0104H				;二次通讯初始化AD50
		;PROGREG 0280H
		;PROGREG 0301h
		;PROGREG 045Ah

		ld RDRR,A	;
		ld RDRR,A	;  原来这个代码无用。
		
		stlm A,RDXR	;
		stlm A,RDXR	;  原来这个代码无用。
		
		rsbx INTM	;  允许中断
		nop
		nop
		nop
		
js		nop 	;程序处于等待串口中断状态,循环。
		nop
		nop
		b js
;下面的接受中断服务程序recv将ADC采样数据发送到DAC输出
recv	ldm RDRR,A	 ;接受寄存器内容送到A,ADC采样数据发送到DAC输出
		and #0fffeh,a ;第0位清0
		;and #8000h,a 
		stlm A,RDXR	; 写入到数据发送寄存器RDXR
		rete

trans	rsbx XF	; XF=0,用于
		rete
		.end
		
		
		

⌨️ 快捷键说明

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