📄 ad50.asm
字号:
;
; 版权归解放军理工大学通信工程学院所有
;
; ======== AD50.asm ========
; 串口测试程序
;
.title "AD50.asm"
.mmregs
; 定义程序入口点
.global _c_int00
; 定义中断标号
.def BRINT0_ISR
.ref cf_ad50
.ref cf_serial
SPSA0 .set 38h
SPSD0 .set 39h
DXR10 .set 23h
DRR10 .set 21h
SPSA1 .set 48h
SPSD1 .set 49h
SPCR1 .set 00h
SPCR2 .set 01h
PCR .set 0eh
.data
r_data .word 0
data_m .word 0
data_s .word 0
.text
_c_int00:
;-------------------------------------------
; 初始化DSP
;-------------------------------------------
; 设置堆栈
RSBX CPL
NOP
NOP
STM 69ch,SP
ADDM #2fh,*(SP)
ANDM #0fffeh,*(SP)
; 关中断
SSBX INTM
; 设置中断屏蔽寄存器,开串口0收中断
STM 10h,IMR
; 清中断标志
STM 0,IFR
; 设置DP指针值,用于DP寻址高9位
LD #0h,DP
; 设置软件等待状态寄存器和块转移控制寄存器
STM 50d2h,SWWSR
STM 800h,BSCR
; 设置中断向量表首地址
LDM PMST,A
AND #7fh,0,A,A
OR #1180h,0,A,A
STLM A,PMST
; 设置时钟模式寄存器,根据需要倍频
STM 0h,CLKMD
cmode: LDM CLKMD,A
AND #1h,0,A,A
BC cmode,ANEQ
STM 4207h,CLKMD
; 对AD50复位
;将串口1配置为通用IO
STM #SPCR1,SPSA1
ANDM #0xfffe,SPSD1
STM #SPCR2,SPSA1
ANDM #0xfffe,SPSD1
RPT #0x1ff
NOP
STM #PCR,SPSA1
STM #0x3f00,SPSD1
;AD50 reset
STM #PCR,SPSA1
ANDM #0xfffB,SPSD1 ;实现复位
RPT #0x7fff
NOP
RPT #0x7fff
NOP
STM #PCR,SPSA1
ORM #0x0004,SPSD1
RPT #0x7fff
NOP
NOP
RPT #0x7fff
NOP
;-------------------------------------------
; 初始化串口
;-------------------------------------------
; 串口收发复位
STM 0h,SPSA0
ANDM 0fffeh,SPSD0
STM 1h,SPSA0
ANDM 0ff3eh,SPSD0
RPT #1ffh
NOP
; 根据串口配置表配置串口
STM SPSA0,AR2
STM 6h,BRC
LD #cf_serial,0,A
RPTB sconf+1
READA *AR2+
ADD #1h,0,A,A
READA *AR2-
sconf: ADD #1h,0,A,A
; 使能串口
RPT #1ffh
NOP
STM 0h,SPSA0
ORM 1h,SPSD0
STM 1h,SPSA0
ORM 1h,SPSD0
;-------------------------------------------
; 完成处理工作
;-------------------------------------------
; 开中断
RSBX INTM
; 死循环,等待中断处理
loop: B loop
;-------------------------------------------
; 串口中断服务程序
;-------------------------------------------
.text
BRINT0_ISR:
; 压栈
PSHM AG
PSHM AH
PSHM AL
PSHM BG
PSHM BH
PSHM BL
PSHM AR4
;-------------------------------------------
; 配置AD50寄存器
;-------------------------------------------
; 读取配置次数
LD *(cf_ad50),A
AND #0fh,0,A,A
; 当配置计数减为0,配置结束
BC #tr_data,AEQ
; 发送配置数据,配置计数器减1
ADD #cf_ad50,0,A,A
STLM A,AR4
ADDM 0ffffh,*(cf_ad50)
LD *AR4,A
NOP
NOP
STLM A,DXR10
B #cf_end
;-------------------------------------------
; 配置结束,进行正常通信
;-------------------------------------------
tr_data:
LDM DRR10,A
nop
SUB #0x360e,A
nop
STL A,*(r_data)
nop
nop
ANDM #0x1,*(r_data)
nop
NOP
NOP
CMPM *(r_data),#1
BC #cf_slave,NTC ;slave
;master
AND #0x0fffe,A
NOP
NOP
LD *(data_m),B
nop
nop
STL B,*(DXR10)
nop
nop
STL A,*(data_s) ;x_data to buffer
nop
nop
B cf_end
cf_slave:
AND #0x0fffe,A
NOP
NOP
LD *(data_s),B
nop
nop
STL B,*(DXR10)
nop
nop
STL A,*(data_m)
nop
nop
cf_end:
; 出栈
POPM AR4
POPM BL
POPM BH
POPM BG
POPM AL
POPM AH
POPM AG
POPM ST1
POPM ST0
RETE
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -