📄 10-2.asm
字号:
.def start
.def ad
.def ad_start
.def rpt,timer1
.ref ftranform
.ref sinx
tim1_ctl .equ 0x01980000 ; 定义定时器控制寄存器地址
tim1_prd .equ 0x01980004 ; 定义定时器周期寄存器地址
tim1_cnt .equ 0x01980008 ; 定义定时器重载寄存器地址
ce3ctl .equ 0x01800014 ; 定义定时ce3空间控制寄存器地址
ce1ctl .equ 0x01800004 ; 定义定时ce1空间控制寄存器地址
pcr .equ 0x018c0024 ; 定义缓冲串口的pcr寄存器地址
pcr1 .equ 0x01900024 ; 定义缓冲串口的pcr1寄存器地址
.bss reg,128,0,0 ; 在内存中为reg变量申请128个字节
.global reg ; 定义reg变量
.sect ".boot" ; 定义名字为boot的用户段
start:
MVK ce1ctl,b0 ; 设置ce1空间寄存器
MVKH ce1ctl,b0
MVKL 0ffffff0fh,a0
MVKH 0ffffff0fh,a0
STW a0,*b0
NOP 4
MVKL 90000400h,b0 ; 直接使用ce1空间的地址
MVKH 90000400h,b0 ; 将ce1空间地址送到b0和b1
MVKL 400h,b1
MVKH 400h,b1
MVKL 9c00h,b2
MVKH 9c00h,b2
pg:
LDB *b0++,a0 ; 设置ce1空间寄存器
NOP 4
STB a0,*b1++
NOP 3
SUB b2,4,b2
NOP 5
B ad_start ; 跳转到ad_start开始设置ad
NOP 5
.text
ad_start:: MVC csr,b0 ; 设置全局控制寄存器
AND -2,b0,b0
MVC b0,csr ; 屏蔽所有的可屏蔽中断
MVKL 0fff0h,b0
MVKH 0fff0h,b0
MVC b0,icr
NOP ; 清除所有的中断标志,避免上电时可能挂起的中断
MVKL pcr,a10
MVKH pcr,a10 ; 设置clkr0引脚为高电平
MVKL 3a2ah,b10 ; 使用clkr0引脚复位cpldl
STW b10,*a10
NOP 8
NOP 4
MVKL ce3ctl,a0 ; 设置ce3空间控制寄存器
MVKH ce3ctl,a0
MVKL 10510222h,a1
MVKH 10510222h,a1
STW a1,*a0
NOP 4
MVKL 8020h,b1 ; 设置中断使能寄存器
MVKH 8020h,b1
MVC ier,b0
OR b1,b0,b0
MVC b0,ier ; 使能中断INT5和INT15
MVC ier,b0 ; 设置ier寄存器
MVK 02h,b1
OR b1,b0,b0
MVC b0,ier ; 使能所有的可屏蔽中断
timer1_init: MVKL tim1_prd, b4 ; 设置定时器1的周期寄存器
MVKH tim1_prd, b4
MVKL 02F40h, a0
MVKL 0F40h, a0
STW a0, *b4
NOP 4 ; 定时器1设置成8000*4*clkout时钟周期
MVKL 00000FF7Eh,a2 ; 设置定时器的控制寄存器
MVKH 00000FF7Eh,a2
MVKL tim1_ctl, b4
MVKH tim1_ctl, b4
STW a2, *b4
NOP 4 ; 关闭定时器1
cpld: ; 开始控制cpld的时钟脉冲
MVKL sinx,b1 ; 变量sinx的首地址送到b1寄存器
MVKH sinx,b1
MVKL 0b0000004h,a1 ; 将外设CPLD的地址存放到a1寄存器
MVKH 0b0000004h,a1
MVKL 0ffh,a6
MVKH 0ffh,a6
MVKL 0Fh,b0
MVKH 0Fh,b0
ad_init: ; 初始化ad
[!b0] B ad_end
NOP 5
MVKL 04010000h,a3
MVKH 04010000h,a3
STW a3,*a1 ; 向a1端口写数据
NOP 3
MVKL 04000000h,a3
MVKH 04000000h,a3
STW a3,*a1 ; 向a1端口写数据
NOP 3 ; 软件复位ad
MVKL 00200000h,a3
MVKH 00200000h,a3 ; 正常运行,设置CR0引脚
STW a3,*a1 ; 向a1端口写数据
NOP 3
MVKL 06300000h,a3
MVKH 06300000h,a3
STW a3,*a1 ; 向a1端口写数据
NOP 3
SUB b0,1,b0
LDW *a1,a11 ; 从a1端口读数据
NOP 3
MVKL 0230h,a12
MVKH 0230h,a12 ; 读CR1引脚的状态
LDW *a1,b11 ; 从a1端口读数据
NOP 3
MVKL 0020h,b12
MVKH 0020h,b12 ; 读CR0引脚的状态
SHL a11,4,a11
SHRU a11,20,a11
CMPEQ a11,a12,a2 ; 判断ad初始化是否成功
[!a2] B ad_init ; ad初始化未成功,重新初始化
NOP 5
SHL b11,4,b11
SHRU b11,20,b11
CMPEQ b11,b12,b2
[!b2] B ad_init
NOP 5
MVKL 04300000h,a3
MVKH 04300000h,a3
STW a3,*a1 ; 从a1端口读数据
NOP 3 ; 正常运行,设置CR0引脚
ad_end: NOP 4
rpt: XOR b0,b0,b0
MVC csr,b0
OR 1,b0,b0
MVC b0,csr ; 使能可屏蔽中断
NOP 8
NOP 8
ZERO a5
ZERO a2
MVKL pcr,a10
MVKH pcr,a10 ; 设置clkr0引脚为低
MVKL 3a28h,b10 ; 使用clkr0引脚放弃对cpld的控制
STW b10,*a10
NOP 4
start_time1: MVKL 00000FFFEh,a10 ; 开始启动定时器1
MVKH 00000FFFEh,a10 ; 计算原始数据的采样时间
MVKL tim1_ctl, b10
MVKH tim1_ctl, b10
STW a10, *b10
NOP 4
loop: NOP
ZERO b0
[a2] ADD a5,1,a5
[a2] MVKL reg,a4
[a2] MVKH reg,a4
[a2] STW a5,*a4
[a2] B ftranform ; 跳转到非均匀数据的傅立叶变换程序
NOP 5
NOP
B loop
NOP 5
ad: LDW *a1,a4
NOP 4
SHL a4,4,a4
SHRU a4,4,a4 ; 数据格式为二进展原码
SHR a4,4,a4 ; 数据格式为二进展补码
STW a4,*b1++ ; b1为变量sinx
NOP 4
SUB a6,1,a6
CMPEQ a6,0,a2
B irp
NOP 5
timer1: MVKL pcr1,a10
MVKH pcr1,a10 ; 设置dx1引脚为低电平
MVKL 3a0ah,b10 ; 输出非均匀时间
STW b10,*a10
NOP 8
NOP 4
MVKL 3a2ah,b10 ; 设置dx1引脚为高电平
STW b10,*a10
NOP 8
NOP 4
MVKL 3a0ah,b10 ; 设置dx1引脚为低电平
STW b10,*a10
NOP 4
MVKL ad_start,b0
MVKH ad_start,b0
MVC b0,irp
B irp
NOP 5
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -