📄 ex4.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 + -